gpt4 book ai didi

ios - Swift Spritekit - 仅当 Sprite 处于特定位置时才会发生碰撞?

转载 作者:行者123 更新时间:2023-11-28 07:25:52 24 4
gpt4 key购买 nike

大家好,请放轻松,因为我对 swift 还是很陌生。我正在创建一个游戏,其中您的角色(在屏幕左侧)必须向上或向下滑动以改变车道(4 个车道)或通过点击屏幕右侧跳跃,以躲避来自右侧的障碍物屏幕的一侧。这就提出了一个问题,当角色 Sprite 在一条车道上时,它的一些像素在上面的车道上,所以在不同的车道上并不能保护角色免受碰撞。 (角色跳跃时也存在这个问题)有没有办法编程让角色和障碍物只有在同一条车道上才会发生碰撞?

我已经尝试让 .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

然后我在一个函数中有一组 switch case,用于随机选择灌木丛进入的车道

    switch randomLane{
case 1:
bush.position = CGPoint(x: 0.4*UIScreen.main.bounds.width, y:-0.07*UIScreen.main.bounds.height)
if(bush.position.y < runningDoggo.position.y) {
bush.zPosition = 6
}
self.addChild(bush)
case 2:
bush.position = CGPoint(x: 0.4*UIScreen.main.bounds.width, y:-0.18*UIScreen.main.bounds.height)
if(bush.position.y < runningDoggo.position.y) {
bush.zPosition = 6
}
self.addChild(bush)
case 3:
bush.position = CGPoint(x: 0.4*UIScreen.main.bounds.width, y:-0.29*UIScreen.main.bounds.height)
if(bush.position.y < runningDoggo.position.y) {
bush.zPosition = 6
}
self.addChild(bush)
case 4:
bush.position = CGPoint(x: 0.4*UIScreen.main.bounds.width, y:-0.4*UIScreen.main.bounds.height)
if(bush.position.y < runningDoggo.position.y) {
bush.zPosition = 6
}
self.addChild(bush)
default:
print("How is this not 1,2,3, or 4?")
}
bush.run(moveAndRemoveBush)

我希望它只碰撞(编辑:不是碰撞而是接触)runningDoggo Sprite 和灌木 Sprite 如果它们在同一条车道上,如果角色不在障碍物车道上则通过而不会发生碰撞。

最佳答案

首先,那个复杂的 switch 可以简化为这样的东西(任何时候你多次编写相同的代码,想想你是否可以简化它):

bush.position.x = 0.40 * UIScreen.main.bounds.width
bush.position.y = 0.07 * randomLane * UIScreen.main.bounds.height) // 0.07, 0.14, 0.21 or 0.28 for lanes 1-4
if (bush.position.y < runningDoggo.position.y) bush.zPosition = 6
self.addChild(bush)
bush.run(moveAndRemoveBush)

好的 - 我知道 0.07、0.14、0.21 和 0.28 的 y 值与您的 0.07、0.18、0.29 和 0.40 的值不匹配,但也许这是您可以调整的东西,或者将偏移数组定义为一个属性:

let bushYOffset = [0.07, 0.18, 0.29, 0.40]

然后只需选择车道对应的偏移量即可

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)

要解决您的主要问题,您可以为数组中的每个 channel 创建一个位掩码:

let laneMask: [UInt32] = [1<<1, 1<<2, 1<<3, 1<<4]

当Doggo移动到一个新的车道时,给Doggo的physicsBody对应于collisonBitmask它刚刚移动到的车道:

runningDoggo.physicsBody?.collisionBitMask = laneMask[doggoLane - 1] // Arrays start at 0

当你生成一个障碍物时,还要为它所在的车道提供碰撞位掩码:

bush.physicsBody?.collisionBitMask = laneMask[randomLane - 1] // Arrays start at 0

现在狗狗和灌木丛只有在同一条车道上才会发生碰撞。如果他们在不同的车道上,他们就不会,即使他们的一些像素重叠。

如果 doggo 和 bush 需要与屏幕上的其他 sprite 交互,您可能需要调整此项。

注意:

你确定要它们碰撞而不是接触吗?当 Sprite 相互碰撞并反弹并在屏幕上飞来飞去时,就会发生碰撞;触点是两个 Sprite 接触的地方,你的代码被调用,你可以让一个 Sprite 爆炸,或者失去生命,或者增加分数等。

编辑:我的碰撞和接触分步指南: https://stackoverflow.com/a/51041474/1430420

以及碰撞和接触测试位掩码指南: https://stackoverflow.com/a/40596890/1430420

操纵位掩码以关闭和打开单个碰撞和接触。 https://stackoverflow.com/a/46495864/1430420

关于ios - Swift Spritekit - 仅当 Sprite 处于特定位置时才会发生碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56624816/

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