- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的游戏创建一个护盾强化。它的工作方式是,如果你射击一个加电图标,你会获得一个随着时间的推移而失效的护盾。当一 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 次碰撞:
X
和 Shield 1
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.shield
是 self.children
的成员 在将 self.shield
添加到 self.children
第二次。 如果只有一个盾牌,只会飞出一堆碎片。
如果 self.shield
设置为 nil
(换句话说,它还没有被分配),containsObject:
方法将评估为 NO
因为 self.children
不包含 nil
。如果您尝试添加一个 nil
节点,Xcode 实际上会因异常而中断。因此,如果 self.shield
为 nil
,则该表达式的计算结果将始终为 NO
。
关于ios - -[SKScene didBeginContact] 执行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021430/
我有两个节点和一个 bool 值。很简单。当节点 A 联系节点 B 并且 bool 值为 0 时,什么也没有发生。但是,如果 bool 值为 1,则通过 didBeganContact 方法删除节点
这里是 swift(和编程)菜鸟。我正在 swift spriteKit 中制作一个简单的突破游戏。它正在工作,但现在我想为某些 block 添加“健康”,但遇到了一些问题。我搜索过谷歌,但什么也没找
所以我已经在这个游戏上工作了一段时间,所有的工作都按照我想要的方式进行,但是我已经在 didBeginContact 上停留了几天,我想我无法理解它它看起来不错,我检查了几个论坛并得到了几乎相同的结果
我已经浏览了所有我可以理解的示例,但没有任何内容与我的问题相关。我有 SKPhysicsContactDelegate 并且添加了 self.physicalsworld.contactDelegat
我的 didBeginContact 方法应该在球击中时移除我的砖 block Sprite 。但是,它没有发挥作用。当我运行它时,当我击中桨和击中砖 block 时,我会得到 NSLog“桨”。我已
知道为什么我的 didBeginContact 方法从不触发吗?球体和矩形实际上相互接触...... 这里我声明了两个类别 static const uint32_t rectangleCategor
当我将 println() 放入我的 didBeginContact 时,没有任何打印。因此,我假设我的 didBeginContact 不起作用。为什么?我还有一个枚举(对撞机类型),其中列出了 C
当我的两个 SKSpriteNode 接触时,didBeginContact 函数没有被调用: func didBegin(_ contact: SKPhysicsContact) { let
在我的游戏中,我有从一个点向前发射的激光。我使用此代码拉伸(stretch)激光 Sprite 并移动它以模拟更新函数中的运动: let height = size.height yScale +=
我正在尝试创建一个程序,无论我的宇宙飞船越过一个圆圈,它都会打印出一些东西,但是当我把宇宙飞船放在圆圈上时,它没有打印任何东西。我是否构建了错误的 didBeginContact 方法?我是否设置了错
我有 2 个 SKSpriteNode 需要检测其接触。我尝试了各种方法并查找了很多东西,但似乎无法得到答案。下面是我的代码。 controlCircle 是一个类级别的变量,因为它需要在其他方法中使
我有两个 sprite 节点,我已确保 self.size 和它们各自的物理体的大小相同,但我仍然遇到这样一个非常奇怪的行为: 这张照片是在检测到碰撞时拍摄的,我暂停了场景。为什么会这样? 这里是设置
我为每个想要相互交互的不同对象创建了一个 struct PhysicsCatagory struct PhysicsCatagory { static let Blade : UInt32 =
我正在制作一个需要我的 spriteNodes 发生碰撞的游戏。我遵循了一个教程,但它对我不起作用。 当我运行我的游戏并且两个对象发生碰撞时,输出监视器中没有 println("beginContac
在一款使用 Sprite Kit 以及 Sprite Kit 内置物理引擎中的接触检测功能的 iOS 游戏中,每当英雄与敌人接触时,我都会将英雄的生命值减一。这是通过 didBeginContact
假设两次接触同时发生。它们的 didBeginContact 函数调用会在完全相同的时间发生(我猜是在不同的线程中),还是一个会在另一个之后发生? 最佳答案 否 - 为场景中接触的每对节点调用 did
我是 swift 语言的新手,遇到了一些问题。我猜这是一个简单的错误,但无论如何我似乎找不到问题。我正在制作一个游戏。当你输了之后,我会在屏幕上创建一个重播按钮。单击后,我开始重置游戏。 我基本上重置
我正在解决 SpriteKit 的一些碰撞检测问题。我在 didBeginContact 中触发了正确的碰撞,这很棒。 现在我遇到了一个范围问题,我无法根据碰撞命中之一在场景中删除和添加子项。第一次检
func didBeginContact(contact: SKPhysicsContact) { if contact.bodyA.categoryBitMask == Physic
我一直在开发一款游戏,每次我的测试节点与我的检查节点接触时都必须执行测试。由于这两个节点是游戏中唯一检查碰撞的节点,因此我决定使用此方法来启动测试。 问题是当 2 个节点物理交叉时,我一直无法让碰撞发
我是一名优秀的程序员,十分优秀!