我正在使用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
答案 0 :(得分:3)
在Box2D(SpriteKit内部使用的物理引擎)中,单个联系人可以对相关的回调函数进行多次调用。
因此,您的分数值会多次递增,因为同一联系人会多次调用 didBeginContact 方法。
您可以通过多种方式阻止此行为。 例如。如果你的外星人只能被子弹击中一次,你可以添加一个BOOL属性isAlive to Alien 并更改你的代码如下。
//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];
}
}
}