SpriteKit 得分是随机的
SpriteKit score is acting randomly
我正在使用 SpriteKit 创建一个游戏并试图在碰撞时增加分数。出于某种奇怪的原因,每次分数增加都是随机数,而不仅仅是 1。
在 didBeginContact
方法中,我在子弹和外星人之间发生了碰撞。每次碰撞我都希望分数增加 1。除了它有自己的想法并且会随机增加 1 - 6 之间的数字。我已经完成了每一行代码并尝试添加多次进入游戏,但它不会像我希望的那样增加 1。目前我的代码是这样的。
在我的头文件中,我为乐谱创建了一个 属性:
@property (nonatomic) int score;
然后在我的主要游戏场景中,我添加以下内容
-(void)setScore:(int)score
{
_score = score;
_scoreLabel.text = [NSString stringWithFormat:@"%d", score];
}
在我的初始化方法中,我也将分数设置为从 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
在 Box2D(SpriteKit 内部使用的物理引擎)中,单个接触可以产生相关回调函数的多次调用。
所以你的分值被增加了几次,因为你的方法 didBeginContact 被同一个联系人多次调用。
您可以通过多种方式防止这种行为。
例如。如果你的 Alien 只能被子弹击中一次,你可以 添加一个 BOOL 属性 isAlive 到 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];
}
}
}
我正在使用 SpriteKit 创建一个游戏并试图在碰撞时增加分数。出于某种奇怪的原因,每次分数增加都是随机数,而不仅仅是 1。
在 didBeginContact
方法中,我在子弹和外星人之间发生了碰撞。每次碰撞我都希望分数增加 1。除了它有自己的想法并且会随机增加 1 - 6 之间的数字。我已经完成了每一行代码并尝试添加多次进入游戏,但它不会像我希望的那样增加 1。目前我的代码是这样的。
在我的头文件中,我为乐谱创建了一个 属性:
@property (nonatomic) int score;
然后在我的主要游戏场景中,我添加以下内容
-(void)setScore:(int)score
{
_score = score;
_scoreLabel.text = [NSString stringWithFormat:@"%d", score];
}
在我的初始化方法中,我也将分数设置为从 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
在 Box2D(SpriteKit 内部使用的物理引擎)中,单个接触可以产生相关回调函数的多次调用。
所以你的分值被增加了几次,因为你的方法 didBeginContact 被同一个联系人多次调用。
您可以通过多种方式防止这种行为。 例如。如果你的 Alien 只能被子弹击中一次,你可以 添加一个 BOOL 属性 isAlive 到 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];
}
}
}