我正在尝试为我的 iOS spritekit 游戏创建一个盾牌加电,而不是刷新当前盾牌,它在顶部堆叠另一个盾牌。我的代码:
-(void)didMoveToView:(SKView *)view {
...
self.shieldIsActive = NO;
...
}
-(void)didBeginContact:(SKPhysicsContact *)contact{
...
else if (firstBody.categoryBitMask == CollisionCategoryLaser | firstBody.categoryBitMask == CollisionCategoryPlasmaShot |firstBody.categoryBitMask == CollisionCategoryProjectile && secondBody.categoryBitMask == CollisionCategoryShieldIcon){
// Projectile OR Plasma Shot Or Laser hits Shield Icon
ShieldIconNode *shieldIcon = (ShieldIconNode *)secondBody.node;
ShieldNode *shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)];
[shieldIcon removeFromParent];
if (firstBody.categoryBitMask == CollisionCategoryProjectile){
ProjectileNode *projectile = (ProjectileNode *)firstBody.node;
[projectile removeFromParent];
}
if (!self.shieldIsActive){
[self addChild:shield];
self.shieldIsActive = YES;
}
// Remove shield after a period of time. BUG: Adds multiple shields if one is already active
if (self.shieldIsActive){
SKAction *wait = [SKAction waitForDuration:ShieldTimer];
[self runAction:wait completion:^{[shield removeFromParent];}];
self.shieldIsActive = NO;
...
}
最佳答案
正如 Domsware 所指出的,按位 |
需要在您的第一个 if
中替换为逻辑 ||
(并添加适当的括号) > 声明。奇怪的是,由于 |
运算符的优先级低于 ==
运算符,因此您的 if
语句可能会按您的预期工作。
此外,您应该考虑隐藏/显示盾牌,而不是像 Whirlwind 建议的那样添加/移除盾牌。
也就是说,一些想法......
if (!self.shieldIsActive)
和if (self.shieldIsActive)
的条件将始终为true
(除非shieldIsActive
设置在代码的其他地方),这可能会导致场景中一次出现多个盾牌- 将
self.shieldIsAction = NO
移动到操作的完成 block 中将解决此问题
还有一些代码...
if (!self.shieldIsActive){
ShieldNode *shield = [ShieldNode shieldAtPosition:CGPointMake(CGRectGetMidX(self.frame)+4, CGRectGetMidY(self.frame)-210)];
[self addChild:shield];
self.shieldIsActive = YES;
SKAction *wait = [SKAction waitForDuration:ShieldTimer];
[self runAction:wait completion:^{
[shield removeFromParent];
self.shieldIsActive = NO;
}];
}
关于ios - 防止 "stacking"的 Sprite 节点相互重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742491/