ios - SpriteKit 得分是随机的

标签 ios objective-c sprite-kit game-physics

我正在使用 SpriteKit 创建游戏并尝试在碰撞时增加分数。出于某种奇怪的原因,每次分数增加都是随机数,而不仅仅是 1。

didBeginContact 方法中,我在子弹和外星人之间发生了碰撞。每次碰撞我都希望分数增加 1。除了它有自己的想法并且会随机增加 1 - 6 之间的数字。我已经完成了每一行代码并尝试添加多次进入游戏,但它不会像我希望的那样增加 1。目前我的代码是这样的。

在我的头文件中,我为乐谱创建了一个属性:

@property (nonatomic) int score;

然后在我的主要游戏场景中,我添加以下内容

-(void)setScore:(int)score
{
    _score = score;
    _scoreLabel.text = [NSString stringWithFormat:@"%d", score];
}

在我的 init 方法中,我还将分数设置为从 0 开始

self.score = 0;

在我的新游戏方法中,我还确保将分数设置回 0

self.score = 0;

然后我的碰撞检测看起来像这样。我用 self.score++ 增加分数;

if (firstBody.categoryBitMask == kAlienCategory && secondBody.categoryBitMask == kBulletCategory) {
        //Collision Between Bullet & Alien
        self.score++;
        if (firstBody.node) {
            [self alienExplosion:firstBody.node.position];
            [firstBody.node removeFromParent];
        }
        if (secondBody.node) {
            [self bulletExplosion:secondBody.node.position];
            [secondBody.node removeFromParent];
        }
    }

更新:我添加了一个 NSLog 来显示分数是如何在控制台中更新的。它准确地显示了分数是如何在 1 - 6 之间随机更新的。控制台的屏幕截图显示分数更新为 6,而它应该只是 1

enter image description here

enter image description here

最佳答案

在 Box2D(SpriteKit 内部使用的物理引擎)中,单个接触可以产生相关回调函数的多次调用。

所以你的分数值增加了几次,因为你的方法 didBeginContact 被同一个联系人多次调用。

您可以通过多种方式防止这种行为。 例如。如果你的 Alien 只能被子弹击中一次,你可以为 Alien 添加一个 BOOL 属性 isAlive 并如下更改你的代码。

//Collision Between Bullet & Alien
if (firstBody.categoryBitMask == kAlienCategory && secondBody.categoryBitMask == kBulletCategory) {
    Alien * alien = nil;
    if ([firstBody.node isKindOfClass:Alien.class]) {
        alien = (Alien*)firstBody.node 
    } else if ([secondBody.node isKindOfClass:Alien.class]) {
        alien = (Alien*)secondBody.node 
    }

    if (alien && alien.isAlive) {
        alien.isAlive = NO
        self.score++;
        if (firstBody.node) {
            [self alienExplosion:firstBody.node.position];
            [firstBody.node removeFromParent];
        }
        if (secondBody.node) {
            [self bulletExplosion:secondBody.node.position];
            [secondBody.node removeFromParent];
        }
    }
}

关于ios - SpriteKit 得分是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883898/

相关文章:

ios - UICollectionView 类似 iPhone 照片应用的点击动画

ios - SpriteKit 节点粘在场景边缘/不弹跳

ios - 更改 SKSpriteNode 图像

ios - 优化 iPhone 6/6+ 屏幕的 Interface Builder 更新

ios - 处理国际电话号码和不正确的通讯录格式

第二次单击导航 Controller 后,ios自定义委托(delegate)为空

objective-c - 以 Swift 方式将 Objective-C block 转换为闭包

swift - 在 SpriteKit 中显示 Game Center 排行榜

ios - 使用适用于 iOS 的开源 SQLCipher 将应用上传到应用商店以供审核

ios - 无法将 NowPlayingInfo 设置为 nil