我在为我的游戏创造一个护盾。它的工作方式是,如果你拍摄一个权力上升图标,你会得到一个盾,随着时间的推移。当岩石击中盾牌时,它就会被摧毁,产生碎片。问题是,在游戏的过程中,当你点击多个盾牌图标时,产生的碎片数量会显著增加。当只有一个护盾的时候,就好像有多个盾牌。我该怎么解决这个问题?
My Code:
- (void) didBeginContact:(SKPhysicsContact *)contact{
...
else if (firstBody.categoryBitMask == CollisionCategoryRocks && secondBody.categoryBitMask == CollisionCategoryShield){
// Rock hits Shield
if (!_shield.hidden){
if (firstBody.categoryBitMask == CollisionCategoryRocks){
SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node;
[spaceRock removeFromParent];
[self createDebrisAtPosition:contact.contactPoint];
}
}
}
else if ((firstBody.categoryBitMask == CollisionCategoryLaser || firstBody.categoryBitMask == CollisionCategoryPlasmaShot ||firstBody.categoryBitMask == CollisionCategoryProjectile) && secondBody.categoryBitMask == CollisionCategoryShieldIcon){
// Projectile hits Shield Icon
if (!self.shieldIsActive){
self.shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)];
[self addChild:self.shield];
self.shieldIsActive = YES;
SKAction *wait = [SKAction waitForDuration:ShieldTimer];
[self runAction:wait completion:^{
self.shield.hidden = YES;
self.shieldIsActive = NO;
}];
}
}
...
}发布于 2015-08-15 05:56:45
你的问题是,当碎片疯狂地飞出来时,会发生两次碰撞:
X和盾构1X和盾构2这导致didBeginContact:被称为2倍,因此,会有两倍多的碎片飞出。
我要修正的一件事,就是把你的代码缩短一点,就是改变这个说法.
SpaceRockNode *spaceRock = (SpaceRockNode *) firstBody.node;
[spaceRock removeFromParent];变成..。
[firstBody.node removeFromParent];如果您不对该Space Rock做任何其他操作,那么就没有理由仅仅将该节点作为节点使用到一个空间岩石中。
接下来,转这个if语句..。
if (!self.shieldIsActive) {
...
}变成..。
if (!self.shieldIsActive && ![self.children containsObject:self.shield]) {
...
}在第二次将self.shield self.children 添加到self.children之前,修改后的声明确保self.shield是self.children 的成员。如果只有一个盾牌,那么只有一堆碎片会飞出来。
如果将self.shield nil设置为(换句话说,还没有分配给),则containsObject:方法将计算为NO,因为self.children 不包含 nil**.** Xcode,如果尝试添加nil节点,实际上会出现异常。因此,如果self.shield是nil,则该表达式将始终计算为NO。
https://stackoverflow.com/questions/32021430
复制相似问题