Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 扩大后将节点粘在SkSpriteNode上_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 扩大后将节点粘在SkSpriteNode上

Ios 扩大后将节点粘在SkSpriteNode上,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,问题 到目前为止,我刚刚意识到我的应用程序中存在一个相当严重的设计缺陷 因此,问题是: 一发步枪射击,然后在没有弹道的情况下着陆。现在,我在玩弄这个想法。但是,项目符号落地,其标记保留为节点 -(void)applyShot:(int) posX with:(int) posY { SKSpriteNode *impact = [[SKSpriteNode alloc] initWithColor:[UIColor grayColor] size:CGSizeMake(2, 2)];

问题

到目前为止,我刚刚意识到我的应用程序中存在一个相当严重的设计缺陷

因此,问题是:

一发步枪射击,然后在没有弹道的情况下着陆。现在,我在玩弄这个想法。但是,项目符号落地,其标记保留为节点

-(void)applyShot:(int) posX with:(int) posY {
    SKSpriteNode *impact = [[SKSpriteNode alloc] initWithColor:[UIColor grayColor] size:CGSizeMake(2, 2)];
    impact.zPosition = 1;
    impact.userInteractionEnabled = NO;
    impact.position = CGPointMake(posX , posY);
    [backgroundImage addChild:impact];
}
和posX/posY是这样发送的

//Find difference between centre and background moved distance.
CGPoint positionNow = CGPointMake(backgroundImage.position.x, backgroundImage.position.y);
CGPoint positionPrev = CGPointMake(0.5, 0.5);

float xdiff = positionNow.x - positionPrev.x;
float ydiff = positionNow.y - positionPrev.y;

//Calculate ydrop
int newYDrop = yDrop * 10;
//

CGPoint newPositionOne = CGPointMake(0.5 - xdiff, 0.5 - ydiff);
newPositionOne = CGPointMake((newPositionOne.x + [self myRandom:15 withFieldLower:-15]), (newPositionOne.y - newYDrop));

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(secondsDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^(void){
    [self applyShot:newPositionOne.x with:newPositionOne.y];
});
这似乎很好,直到我开始玩zoom

现在,这个应用程序基本上是一个用于十字线的1080p图像,背景放大以提供(缩放)效果,然后背景被触摸拖动/反转以提供十字线移动效果

然后我设法让它正好在十字准线所在的地方开火,这很好。。然后我开始玩zoom,注意到了这一点

因此,如果不太容易注意到,(子弹命中)是灰色标记,但是,当你放大背景图像时,它们与背景图像无关。因此,它们的分布保持不变

解决方案

现在我需要的是

  • 答:将节点绑定到背景图像
  • B:把价差扩大到与扩大相同的系数
但我对如何实现这一点感到困惑

其他问题

校准落差时,无论当前的缩放效果如何,落差都将是一个负担。因此,如果在6倍变焦时是1密耳点下降,那么在10倍变焦或1倍变焦时也是1密耳点下降(我一直在说放大时是缩放)

无论背景图像的放大程度如何,如何实现液滴强度的校准

感谢您阅读我的文章,并将自己与我的可怕问题混为一谈,非常感谢

我尝试过的

将子对象保存到可变数组中,然后在缩放更改后重新创建它们

//recreate children
[backgroundImage removeAllChildren];
for (int i=0; i < [shotsHitX count]; i++) {

    double posX = ([shotsHitX[i] doubleValue] / 5) * rifleZoom;
    double posY = ([shotsHitY[i] doubleValue] / 5) * rifleZoom;

    SKSpriteNode *impact = [[SKSpriteNode alloc] initWithColor:[UIColor grayColor] size:CGSizeMake(2, 2)];
    impact.zPosition = 1;
    impact.userInteractionEnabled = NO;
    impact.position = CGPointMake(posX , posY);

    [shotsHitX addObject:[NSNumber numberWithDouble:posX]];
    [shotsHitY addObject:[NSNumber numberWithDouble:posY]];

    [backgroundImage addChild:impact];
}
//end recreate children
//重新创建子对象
[背景图像移除所有儿童];
对于(int i=0;i<[shotsHitX计数];i++){
double posX=([shotsHitX[i]doubleValue]/5)*步枪变焦;
双精度=([shotsHitY[i]doubleValue]/5)*步枪缩放;
SKSpriteNode*impact=[[SKSpriteNode alloc]initWithColor:[UIColor grayColor]大小:CGSizeMake(2,2)];
冲击位置=1;
impact.userInteractionEnabled=否;
impact.position=CGPointMake(posX,posY);
[shotsHitX addObject:[NSNumber numberWithDouble:posX]];
[shotsHitY addObject:[NSNumber numberWithDouble:posY]];
[背景图片addChild:impact];
}
//结束重新创建子对象
内存错误导致崩溃

不太擅长这个

[backgroundImage removeAllChildren];
对于(int i=0;i<[shotsHitX计数];i++){
double posX=([shotsHitX[i]doubleValue]/5)*步枪变焦;
双精度=([shotsHitY[i]doubleValue]/5)*步枪缩放;
SKSpriteNode*impact=[[SKSpriteNode alloc]initWithColor:[UIColor grayColor]大小:CGSizeMake(2,2)];
冲击位置=1;
impact.userInteractionEnabled=否;
impact.position=CGPointMake(posX,posY);
[背景图片addChild:impact];
}
//结束重新创建子对象
但是,现在它似乎并不完全正确

我认为问题在于,当初始变焦开始工作时,当它恢复时,它会将阵列中的变焦镜头与旧镜头混合。。我们又来了,更多数组

    //recreate children
    [backgroundImage removeAllChildren];
    for (int i=0; i < [shotsHitRem count]; i+= 2) {

        double posX = ([shotsHitRem[i] doubleValue] / 5) * rifleZoom;
        double posY = ([shotsHitRem[i+1] doubleValue] / 5) * rifleZoom;

        SKSpriteNode *impact = [[SKSpriteNode alloc] initWithColor:[UIColor grayColor] size:CGSizeMake(2, 2)];
        impact.zPosition = 1;
        impact.userInteractionEnabled = NO;
        impact.position = CGPointMake(posX , posY);
        [backgroundImage addChild:impact];

        //add olds m4
        if ([shotsHitM4 count] > 0) {
            posX = ([shotsHitM4[i] doubleValue] / 2) * rifleZoom;
            posY = ([shotsHitM4[i+1] doubleValue] / 2) * rifleZoom;
            impact.position = CGPointMake(posX, posY);
            [backgroundImage addChild:impact];
        }
    }
    //end recreate children
//重新创建子对象
[背景图像移除所有儿童];
对于(int i=0;i<[shotsHitRem计数];i+=2){
double posX=([shotsHitRem[i]doubleValue]/5)*步枪缩放;
双精度=([shotsHitRem[i+1]doubleValue]/5)*步枪缩放;
SKSpriteNode*impact=[[SKSpriteNode alloc]initWithColor:[UIColor grayColor]大小:CGSizeMake(2,2)];
冲击位置=1;
impact.userInteractionEnabled=否;
impact.position=CGPointMake(posX,posY);
[背景图片addChild:impact];
//添加m4
如果([shotsHitM4计数]>0){
posX=([shotsHitM4[i]doubleValue]/2)*步枪变焦;
posY=([shotsHitM4[i+1]doubleValue]/2)*步枪缩放;
impact.position=CGPointMake(posX,posY);
[背景图片addChild:impact];
}
}
//结束重新创建子对象
现在,我尝试添加一个已经有父节点的sknode时崩溃


令人困惑的是,在一些重大的混乱之后,它应该在循环之前移除所有儿童

[backgroundImage setScale:rifleZoom];
编程是我最喜欢的,哦,是的。。五个小时,哦,是的。。一句话,哦,是的

我以前不是在缩放,而是在创建一个新的CG大小。这就是我的问题


现在,我遇到了缩放和尝试渲染新的中心点的问题,因为它仍然记得scale=1和scale=2的中心点,噩梦。

计算了校准修复,只是将下降乘以缩放距离。。我想我在这里发现了一些东西。@rakeshbs如果我没弄错的话,他们是作为孩子添加的:O?问题是当它扩展时,它们不会<代码>[backgroundImage addChild:impact]
[backgroundImage setScale:rifleZoom];