首页 > 解决方案 > 如何检查两个精灵节点的纹理是否相交

问题描述

我正在创建一个用户必须跳过桶的简单游戏(类似于 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

标签: swiftsprite-kit

解决方案


有一个初始化程序:SKPhysicsBody(texture:size:).

所以像这样初始化物理体是有效的:

 barrelNode.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "game-barrel"),
                                        size: barrelNode.size)

推荐阅读