som*_*ame 16 cocoa ios sprite-kit
在使用Sprite Kit以及Sprite Kit的内置物理引擎中的接触检测的iOS游戏中,每当他与敌人接触时,我将Hero的数量减少一个.这是通过该didBeginContact方法完成的.然而,似乎这种方法不仅仅是在接触开始时调用一次,而是在Hero和敌人重叠时连续调用:当我在该方法中设置断点时,我可以看到,它是完全相同的以contact.bodyA和存在的物理体实例contact.bodyB.结果是,英雄将失去多重生命,即使他只通过一个敌人.
如果Hero稍后再遇到同一个敌人,他应该减去一个实际的生命,因此我不能只维持一个seenEnemies哈希集来处理上面的问题.
现在的问题是:你如何确保每个英雄/敌人联系人只减去一个生命?
小智 17
我遇到了同样的问题(单个敌人被摧毁的分数增加了多倍,单个伤害实例丢失了多个生命点.)Apple论坛上的用户认为这是[SKPhysicsBody bodyWithTexture:size:]中的一个错误但是我不相信是这种情况,因为它也与其他构造者一起发生.
首先,在categoryBitMask和contactTestBitMask是非常重要的,很明显.看看Apple的SpriteKit Physics Collisions示例代码:
//联系人通常是双重调度问题; 您想要的效果取决于联系人中两个主体的类型.通过检查每种类型,以蛮力的方式对此进行采样.更复杂的示例可能使用对象上的方法来执行类型检查.
// 联系人可以按任意顺序出现,因此通常您需要检查每个联系人.在此示例中,类别类型排序良好,因此如果两个实体无序,则代码会交换它们.这允许代码仅测试一次冲突.
我所做的就是在处理每个条件后设置一个标志.在我的情况下,我正在测试是否bodyA.node.parent为零didBeginContact,因为我呼吁removeFromParent()导弹/敌方节点摧毁它们.
我认为你应该期望事件多次触发,你的代码必须确保它只处理一次.
Kni*_*gon 17
didBeginContact多次被触发的原因是因为凹形上有多个接触点.
如果你看下面的图片,你会看到我有2个精灵,一个黑色的星星和一个红色的矩形.当黑色星星击中红色矩形时,它会在多个点上击中它,并以蓝色圈出.然后,Sprite Kit将为每个行交集执行调用,以便开发人员可以contactPoint为每个联系人使用该变量.
我想出了简单的解决方案:
只需在检测到联系后立即将正文的categoryBitMask值更改为0或未使用的值.
例如:
if (firstBody.categoryBitMask == padCategory && secondBody.categoryBitMask == colorBallCategory) {
secondBody.categoryBitMask = 0;
// DO OTHER THING HERE
}
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题.在我的情况下didBeginContact(),一次子弹与敌人的接触被多次召唤(我数到5次).由于子弹是一种简单的圆形格式,我同意@SFX它不能仅仅是纹理体中的一个错误.测试显示呼叫update()之间没有呼叫didBeginContact().所以解决方案很简单(Swift):
var updatesCalled = 0
...
internal update() {
updatesCalled ++
}
...
internal func didBeginContact(contact: SKPhysicsContact) {
NSLog("didBeginContact: (\(contact.contactPoint.x), \(contact.contactPoint.y)), \(updatesCalled)")
if(updatesCalled == 0) {return} // No real change since last call
updatesCalled = 0
... your code here ...
}
Run Code Online (Sandbox Code Playgroud)
我试过了,didEndContact()但根本没有打过电话.我没有进一步调查这个.
顺便说一下:我刚刚从Android切换,我对这个系统的容易性和稳定性印象深刻:-)
| 归档时间: |
|
| 查看次数: |
4011 次 |
| 最近记录: |