- 设置物理体属性:
- 为玩家精灵节点设置物理体。物理体定义了节点在物理模拟中的形状和质量等属性。
- 为障碍物精灵节点设置物理体。
- 示例代码:
// 创建玩家精灵节点
let player = SKSpriteNode(imageNamed: "player")
player.position = CGPoint(x: size.width / 2, y: size.height / 2)
// 设置玩家物理体,这里假设玩家是圆形,使用圆形物理体
let playerPhysicsBody = SKPhysicsBody(circleOfRadius: player.size.width / 2)
playerPhysicsBody.mass = 1.0
playerPhysicsBody.affectedByGravity = false
player.physicsBody = playerPhysicsBody
// 创建障碍物精灵节点
let obstacle = SKSpriteNode(imageNamed: "obstacle")
obstacle.position = CGPoint(x: size.width / 4, y: size.height / 4)
// 设置障碍物物理体,假设障碍物是矩形,使用矩形物理体
let obstaclePhysicsBody = SKPhysicsBody(rectangleOf: obstacle.size)
obstaclePhysicsBody.mass = 10.0
obstaclePhysicsBody.affectedByGravity = false
obstacle.physicsBody = obstaclePhysicsBody
- 设置碰撞掩码:
- 碰撞掩码用于定义哪些物体之间会发生碰撞。每个物体都有一个碰撞类别(
categoryBitMask
)和一个碰撞掩码(collisionBitMask
)。
- 示例代码:
// 定义玩家的碰撞类别
let playerCategory: UInt32 = 0x1 << 0
// 定义障碍物的碰撞类别
let obstacleCategory: UInt32 = 0x1 << 1
// 设置玩家的碰撞掩码,玩家与障碍物碰撞
player.physicsBody?.categoryBitMask = playerCategory
player.physicsBody?.collisionBitMask = obstacleCategory
// 设置障碍物的碰撞掩码,障碍物与玩家碰撞
obstacle.physicsBody?.categoryBitMask = obstacleCategory
obstacle.physicsBody?.collisionBitMask = playerCategory
- 处理碰撞发生后的动作:
- 为场景设置代理以接收碰撞通知。
- 实现代理方法来处理碰撞,例如减少玩家生命值。
- 示例代码:
class GameScene: SKScene, SKPhysicsContactDelegate {
var playerHealth = 100
override func didMove(to view: SKView) {
// 创建玩家和障碍物节点并设置物理体和碰撞掩码代码放在这里
// 设置场景的物理世界代理
physicsWorld.contactDelegate = self
}
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
if contactMask == (playerCategory | obstacleCategory) {
// 处理碰撞,玩家损失生命值
playerHealth -= 10
print("玩家生命值: \(playerHealth)")
if playerHealth <= 0 {
// 处理玩家死亡逻辑
print("玩家死亡")
}
}
}
}