在dIDBeginContact方法中,我在子d和外星人之间发生了碰撞.每次碰撞时我都希望得分能够将得分增加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
解决方法 在Box2D(SpriteKit内部使用的物理引擎)中,单个联系人可以生成相关回调函数的多个调用.因此,您的分数值会多次递增,因为您的方法dIDBeginContact会针对同一个联系人多次调用.
您可以通过多种方式阻止此行为.
例如.如果您的外星人只能被子d击中一次,您可以添加一个BOol属性isAlive to AlIEn并更改您的代码如下.
//Collision Between Bullet & AlIEnif (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得分是随机的全部内容,希望文章能够帮你解决ios – SpriteKit得分是随机的所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)