swift - 如何检查两个精灵节点的纹理是否相交
问题描述
我正在创建一个用户必须跳过桶的简单游戏(类似于 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
解决方案
有一个初始化程序:SKPhysicsBody(texture:size:)
.
所以像这样初始化物理体是有效的:
barrelNode.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "game-barrel"),
size: barrelNode.size)