如果玩家留在设定的位置而没有移动,物体将不会检测到碰撞
If the player is left at the set location without being moved, objects won't detect a collision
我正在制作我的第一个 iOS 游戏并且已经取得了很大的进步。我有碰撞检测,但是如果我 运行 游戏并且不将玩家从它的设置位置 player.position = CGPoint(x: size.width/2, y: size.height/2)
移动,那么敌人将直接穿过玩家并且不会检测到碰撞。如果我将玩家从那个地方移到敌人身上,那就是它开始工作的时候。
我不知道问题出在我生成玩家的顺序还是我的碰撞检测,但这是一些代码,希望您能提供帮助。
struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let Player : UInt32 = 0b1
static let Bee: UInt32 = 0b10
}
func didBeginContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if ((firstBody.categoryBitMask & PhysicsCategory.Player != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.Enemy != 0)) {
collision(firstBody.node as SKSpriteNode, Player: secondBody.node as SKSpriteNode)
}
}
我不确定你是否需要它,但这是给玩家的
class GameScene: SKScene, SKPhysicsContactDelegate {
let player = SKSpriteNode(imageNamed: "Spaceship")
player.position = CGPoint(x: size.width/2, y: size.height/2)
addChild(player)
physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self
}
编辑 我忘记了:
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
player.physicsBody?.categoryBitMask = PhysicsCategory.Player
player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
player.physicsBody?.collisionBitMask = PhysicsCategory.None
player.physicsBody?.usesPreciseCollisionDetection = true
enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
enemy.physicsBody?.dynamic = true
enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
enemy.physicsBody?.collisionBitMask = PhysicsCategory.None
您的代码中哪里是您之前忘记 post 的代码部分?您为播放器设置碰撞位掩码和 contactTestBitMask 的部分?
如果碰撞仅在您移动播放器时起作用,听起来这部分代码在 touchesEnded 方法中,是吗?
您可以尝试将那部分代码移动到 class init 中,这样它就会在开始时执行,而不仅仅是在玩家移动时执行。
我正在制作我的第一个 iOS 游戏并且已经取得了很大的进步。我有碰撞检测,但是如果我 运行 游戏并且不将玩家从它的设置位置 player.position = CGPoint(x: size.width/2, y: size.height/2)
移动,那么敌人将直接穿过玩家并且不会检测到碰撞。如果我将玩家从那个地方移到敌人身上,那就是它开始工作的时候。
我不知道问题出在我生成玩家的顺序还是我的碰撞检测,但这是一些代码,希望您能提供帮助。
struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let Player : UInt32 = 0b1
static let Bee: UInt32 = 0b10
}
func didBeginContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if ((firstBody.categoryBitMask & PhysicsCategory.Player != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.Enemy != 0)) {
collision(firstBody.node as SKSpriteNode, Player: secondBody.node as SKSpriteNode)
}
}
我不确定你是否需要它,但这是给玩家的
class GameScene: SKScene, SKPhysicsContactDelegate {
let player = SKSpriteNode(imageNamed: "Spaceship")
player.position = CGPoint(x: size.width/2, y: size.height/2)
addChild(player)
physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self
}
编辑 我忘记了:
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
player.physicsBody?.categoryBitMask = PhysicsCategory.Player
player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
player.physicsBody?.collisionBitMask = PhysicsCategory.None
player.physicsBody?.usesPreciseCollisionDetection = true
enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
enemy.physicsBody?.dynamic = true
enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
enemy.physicsBody?.collisionBitMask = PhysicsCategory.None
您的代码中哪里是您之前忘记 post 的代码部分?您为播放器设置碰撞位掩码和 contactTestBitMask 的部分?
如果碰撞仅在您移动播放器时起作用,听起来这部分代码在 touchesEnded 方法中,是吗?
您可以尝试将那部分代码移动到 class init 中,这样它就会在开始时执行,而不仅仅是在玩家移动时执行。