我正在创建一个简单的游戏(类似于Google Chrome T-Rex游戏),用户必须跳过枪管。我遇到的问题是用户正在丢失,因为两个节点的帧相交。但是,我使用的纹理不会占用整个框架,因此它看起来像个错误。有什么方法可以检查纹理本身而不是框架发生碰撞吗?
这是我用来创建角色节点的代码
private lazy var avatarNode: SKSpriteNode = {
let node = SKSpriteNode(imageNamed: "fox")
node.name = "avatar"
let width: CGFloat = 85
let height: CGFloat = width * (437.0 / 360.0) // This is the aspect ratio of the texture
node.size = CGSize(width: width, height: height)
node.position = CGPoint(x: width / 2 + 50, y: Constants.groundHeight + height / 2)
node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
node.physicsBody?.isDynamic = true // 2
node.physicsBody?.mass = 1.0
node.physicsBody?.allowsRotation = false
node.physicsBody?.affectedByGravity = true
node.physicsBody?.usesPreciseCollisionDetection = true
node.physicsBody?.categoryBitMask = GameCategories.avatar
node.physicsBody?.collisionBitMask = GameCategories.ground
node.physicsBody?.contactTestBitMask = GameCategories.barrel
return node
}()
这是我创建桶形节点的方式:
let barrelHeight: CGFloat = 50
let barrelWidth: CGFloat = rockHeight * CGFloat(192.0 / 237.0)
let barrelNode = SKSpriteNode(imageNamed: "game-barrel")
barrelNode.name = "barrel"
barrelNode.size = CGSize(width: barrelWidth, height: barrelHeight)
barrelNode.position = CGPoint(x: self.frame.width + barrelWidth / 2, y: Constants.groundHeight + barrelHeight / 2)
barrelNode.physicsBody = SKPhysicsBody(rectangleOf: barrelNode.size)
barrelNode.physicsBody?.isDynamic = true
barrelNode.physicsBody?.allowsRotation = false
barrelNode.physicsBody?.affectedByGravity = false
barrelNode.physicsBody?.usesPreciseCollisionDetection = true
barrelNode.physicsBody?.categoryBitMask = GameCategories.barrel
barrelNode.physicsBody?.collisionBitMask = 0
barrelNode.physicsBody?.contactTestBitMask = GameCategories.avatar
这种游戏的常见做法是使用物理学来检测您的碰撞或检查节点是否相交。
如果您正在使用物理,则需要为物理物体创建更精确的形状,但这并不总是那么容易,如果节点发生变化,则必须调整物理。 (并且在iOS 13中,通过alpha纹理的物理主体已损坏)。因此,要做的第二件事是很常见的,那就是减小物理面积,制作一个正方形,其大小为角色大小的一半,并将其对齐以使其覆盖身体和头部。
这样,您的角色可以在不发射碰撞的情况下更靠近枪管,但是如果它的身体接触到枪管,则碰撞将触发]