gpt4 book ai didi

ios - -[SKScene didBeginContact] 执行多次

转载 作者:行者123 更新时间:2023-11-28 21:41:06 25 4
gpt4 key购买 nike

我正在为我的游戏创建一个护盾强化。它的工作方式是,如果你射击一个加电图标,你会获得一个随着时间的推移而失效的护盾。当一 block 岩石撞击盾牌时,它会被摧毁并产生碎片。出现的问题是,在游戏过程中,当您点击多个盾牌图标时,产生的碎片数量会显着增加。就好像只有一个盾牌时有多个盾牌一样。我该如何解决这个问题?

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;
}];
}
}
...
}

最佳答案

你的问题是,当碎片疯狂地飞出时,发生了 2 次碰撞:

  1. Space Rock X 和 Shield 1
  2. Space Rock X 和 Shield 2

这会导致 didBeginContact: 被调用两次,因此,您有两倍的碎片飞出。

为了稍微缩短您的代码,我要解决的一件事是更改此语句...

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.shieldself.children 的成员 在将 self.shield 添加到 self.children 第二次。 如果只有一个盾牌,只会飞出一堆碎片。

如果 self.shield 设置为 nil(换句话说,它还没有被分配),containsObject: 方法将评估为 NO 因为 self.children 不包含 nil如果您尝试添加一个 nil 节点,Xcode 实际上会因异常而中断。因此,如果 self.shieldnil,则该表达式的计算结果将始终为 NO

关于ios - -[SKScene didBeginContact] 执行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com