Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 斯威夫特精灵-只有当精灵处于特定位置时才会碰撞?_Ios_Swift_Xcode_Sprite Kit_Collision Detection - Fatal编程技术网

Ios 斯威夫特精灵-只有当精灵处于特定位置时才会碰撞?

Ios 斯威夫特精灵-只有当精灵处于特定位置时才会碰撞?,ios,swift,xcode,sprite-kit,collision-detection,Ios,Swift,Xcode,Sprite Kit,Collision Detection,嗨,对我放松点,因为我对斯威夫特还很陌生。我正在创建一个游戏,在这个游戏中,你的角色(在屏幕左侧)必须向上或向下滑动以改变车道(4车道)或通过点击屏幕右侧跳跃,以躲避来自屏幕右侧的障碍物。这就提出了一个问题,当角色精灵位于一条车道上时,它的一些像素位于上面的车道上,因此位于不同的车道上并不能防止角色发生碰撞。(角色跳跃时也存在此问题)是否有办法编程,使角色和障碍物仅在位于同一车道时碰撞 我试图使.collisionBitMask和.categoryBitMask根据障碍物或角色的位置而变化,但我

嗨,对我放松点,因为我对斯威夫特还很陌生。我正在创建一个游戏,在这个游戏中,你的角色(在屏幕左侧)必须向上或向下滑动以改变车道(4车道)或通过点击屏幕右侧跳跃,以躲避来自屏幕右侧的障碍物。这就提出了一个问题,当角色精灵位于一条车道上时,它的一些像素位于上面的车道上,因此位于不同的车道上并不能防止角色发生碰撞。(角色跳跃时也存在此问题)是否有办法编程,使角色和障碍物仅在位于同一车道时碰撞

我试图使.collisionBitMask和.categoryBitMask根据障碍物或角色的位置而变化,但我不知道如何正确编码。老实说,我很迷茫。下面是一些代码:

runningDoggo.physicsBody = SKPhysicsBody(texture: doggoTexture, size: runningDoggo.size)
runningDoggo.physicsBody?.affectedByGravity = false
runningDoggo.physicsBody?.isDynamic = true
runningDoggo.physicsBody?.collisionBitMask = 0x1 << 2
bush.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "8-bit bush"), size: bush.size)
bush.physicsBody?.isDynamic = true
bush.physicsBody?.affectedByGravity = false
bush.physicsBody?.categoryBitMask = 0x1 << 1
runningDoggo.physicsBody=SKPhysicsBody(纹理:doggoTexture,大小:runningDoggo.size)
runningDoggo.physicsBody?.affectedByGravity=false
runningDoggo.physicsBody?.isDynamic=true

runningDoggo.physicsBody?.collisionBitMask=0x1首先,这个复杂的开关可以简化为类似的东西(只要您多次编写相同的代码,请考虑是否可以简化它):

然后只拾取与车道对应的偏移

bush.position.x = 0.40 * UIScreen.main.bounds.width
bush.position.y = bushYOffset[randonLane-1] * UIScreen.main.bounds.height)
if (bush.position.y < runningDoggo.position.y) bush.zPosition = 6
self.addChild(bush)
bush.run(moveAndRemoveBush)
生成障碍物时,还应为其所在车道提供碰撞位掩码:

bush.physicsBody?.collisionBitMask = laneMask[randomLane - 1] // Arrays start at 0
现在,多哥和布什只有在同一条车道上才会相撞。如果它们在不同的车道上,即使它们的某些像素重叠,它们也不会

如果屏幕上还有其他精灵,狗狗和灌木丛需要与之互动,你可能需要调整这个

注意:

你确定要它们碰撞而不是接触吗?当精灵相互碰撞和反弹并在屏幕周围飞行时,会发生碰撞;联系人是两个精灵接触的地方,你的代码会被调用,你可以让其中一个爆炸,或者失去生命,或者增加分数等等

编辑:我的碰撞和接触分步指南:

以及碰撞和接触测试位掩码指南:

操纵位掩码以关闭和打开单个碰撞ans触点。

首先,这个复杂的开关可以简化成这样(只要您多次编写相同的代码,想想是否可以简化它):

然后只拾取与车道对应的偏移

bush.position.x = 0.40 * UIScreen.main.bounds.width
bush.position.y = bushYOffset[randonLane-1] * UIScreen.main.bounds.height)
if (bush.position.y < runningDoggo.position.y) bush.zPosition = 6
self.addChild(bush)
bush.run(moveAndRemoveBush)
生成障碍物时,还应为其所在车道提供碰撞位掩码:

bush.physicsBody?.collisionBitMask = laneMask[randomLane - 1] // Arrays start at 0
现在,多哥和布什只有在同一条车道上才会相撞。如果它们在不同的车道上,即使它们的某些像素重叠,它们也不会

如果屏幕上还有其他精灵,狗狗和灌木丛需要与之互动,你可能需要调整这个

注意:

你确定要它们碰撞而不是接触吗?当精灵相互碰撞和反弹并在屏幕周围飞行时,会发生碰撞;联系人是两个精灵接触的地方,你的代码会被调用,你可以让其中一个爆炸,或者失去生命,或者增加分数等等

编辑:我的碰撞和接触分步指南:

以及碰撞和接触测试位掩码指南:

操纵位掩码以关闭和打开单个碰撞ans触点。

非常感谢史蒂夫给我的好建议。是的,你是对的,我的意思是我希望他们接触而不是碰撞,因为在正确的车道上接触灌木丛应该结束游戏并触发我的重启屏幕。用contactBitMask替换collisionBitMask是同一种解决方案吗?它是“contactTestBitMask”,但您还需要将场景设置为联系人代理,并设置“didBegib(contact:)”功能。“Colliskins和contacts的分步指南”应该会有所帮助。我确实有didbeagin(contact:)功能,似乎可以工作。问题在于它适用于所有车道,而不是我需要的特定车道。至于联系人代理,我一直在使用“self.physicsWorld.contactDelegate=self”对吗?(*每次我键入contactTestBitMask时,我都忘记了“测试”部分,我的错)@imath有时如果你;re'didbeagin'在应该的时候开火,那么你就成功了90%:-)谢谢史蒂夫给你的好建议。是的,你是对的,我的意思是我希望他们接触而不是碰撞,因为在正确的车道上接触灌木丛应该结束游戏并触发我的重启屏幕。用contactBitMask替换collisionBitMask是同一种解决方案吗?它是“contactTestBitMask”,但您还需要将场景设置为联系人代理,并设置“didBegib(contact:)”功能。“Colliskins和contacts的分步指南”应该会有所帮助。我确实有didbeagin(contact:)功能,似乎可以工作。问题在于它适用于所有车道,而不是我需要的特定车道。至于联系人代理,我一直在使用“self.physicsWorld.contactDelegate=self”对吗?(*每次我键入contactTestBitMask时,我都忘记了“测试”部分,我的错)@imath有时如果你;re'didbeagin'在它应该开火的时候开火,那么你就有了90%的成功率:-)
let laneMask: [UInt32] = [1<<1, 1<<2, 1<<3, 1<<4]
runningDoggo.physicsBody?.collisionBitMask = laneMask[doggoLane - 1] // Arrays start at 0
bush.physicsBody?.collisionBitMask = laneMask[randomLane - 1] // Arrays start at 0