为什么这些UIImages在屏幕上重新加载时会出现故障?:

时间:2014-03-15 18:50:06

标签: ios objective-c

在我的代码中,青蛙跳到百合垫上后,百合花缓慢地淡出(使它看起来像被淹没)然后在它们通过屏幕底部后,它们重新加载在屏幕的顶部。代码如下:

if (CGRectIntersectsRect(FrogSquare.frame, lilypadTS.frame) && (upMovement <= -1) && (swim == YES) && (startingice.hidden == NO)){
    [self bounce];
    [self iceblockfall];
    if (lilypadused == NO) {
        addedScore = 1;
        lilypadused = YES;
    }

    //hide pad
     [UIView beginAnimations:nil context:nil];
     [UIView setAnimationDuration:4];
     [startingice setAlpha:0];
     [UIView commitAnimations];

     [self performSelector:@selector(hidePad) withObject:self afterDelay:4.0];
}

那部分工作正常,睡莲做了应该做的事。以下是我得到这个奇怪故障的地方:

if (lilypad.center.y > 610) {
    RandomPosition = arc4random() %248;
    RandomPosition = RandomPosition + 36;
    lilypad.center = CGPointMake(RandomPosition, -22);
    lilypadused = NO;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0];
    [lilypad setAlpha:1];
    [UIView commitAnimations];
    [self performSelector:@selector(showlilypad) withObject:self afterDelay:0];

} else if ((lilypad.center.y > 610) && (lilypad.hidden == YES)) {
    RandomPosition = arc4random() %248;
    RandomPosition = RandomPosition + 36;
    lilypad.center = CGPointMake(RandomPosition, -22);
    lilypadused = NO;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0];
    [lilypad setAlpha:1];
    [UIView commitAnimations];
    [self performSelector:@selector(showlilypad) withObject:self afterDelay:0];
}

出于某种原因,发生了什么事情,Lilypads将像他们应该的那样在屏幕顶部重新加载,但随后用户正在跳到顶部的Lilypads下面。如果那令人困惑 - 屏幕尺寸320 x 568,lilypad1重新加载在屏幕顶部点= -22,然后慢慢下降,所以说点数是10后下降了一点,说玩家跳上lilypad2,但没有隐藏并过去了610(重装在顶部),它让lilypad1立即隐藏,为什么会这样?

1 个答案:

答案 0 :(得分:2)

您提供的代码量确实不足以诊断您的问题。你很可能(肯定)引用了导致错误行为的错误的lilypad。您应该仔细查看应用程序的体系结构,以确保以最佳方式正确管理lilypad列表。

此外,每当您使用延迟时 - 请注意,这些延迟是近似的,而不是确切的。您可能处于竞争状态,其中隐藏尚未发生但您已经在顶部再次显示,然后隐藏会在稍后触发。

最后,如果afterDelay为0,你也可以直接调用showlilypad方法 - 不需要真正延迟0秒。

祝你好运!