如何使用 Spritekit 和 GameplayKit 为移动的 GKAgent2D 设置 Swift 中的目标动画?
How can I animate a moving GKAgent2D with a goal in Swift using Spritekit and GameplayKit?
我正在 Swift 使用 Spritekit 和 GameplayKit 构建游戏。我目前在为与玩家竞争的 AI 敌人设置动画时遇到问题。
在游戏中,玩家收集从天上掉下来的物体,用来种花。人控玩家动画很简单,我通过摇杆左右移动,当摇杆的X位置为+/-时,为动画触发不同的SKAction。
但是对于敌人来说,他们的移动是根据 GKGoals 自动进行的,他们不断地左右跳跃和移动。触发移动代理动画的正确方法是什么?目前我尝试根据 agentWillUpdate 函数中代理的速度 (+/- dx) 做出反应
func agentWillUpdate(_ agent: GKAgent) {
if let agent = agent as? GKAgent2D {
agent.position = float2(Float((node.position.x)), Float((node.position.y)))
}
guard let aiEnemyBody = entity?.component(ofType: PhysicsComponent.self) else {
fatalError()
}
guard let animation = entity?.component(ofType: MovementComponent.self) else {
fatalError()
}
print(aiEnemyBody.physicsBody.velocity.dx) // usually 0, despite moving across map at high speed
if node.physicsBody!.velocity.dx > 0 {
animation.move(direction: "left")
} else if node.physicsBody!.velocity.dx < 0 {
animation.move(direction: "right")
} else {
animation.faceForward()
}
}
在调试中我发现当实体向左或向右移动时,代理的 x 速度变化并不总是改变?这是正确的行为吗?我希望有另一种方法来检测某个方向的运动
有关更多上下文,该游戏是一款 2d 平台式游戏 picture
如果这对任何人有帮助,我错误地使用物理体作为运动参考。正确的方法是使用GKAgent2D的velocity
func agentWillUpdate(_ agent: GKAgent) {
if let agent = agent as? GKAgent2D,
let animation = entity?.component(ofType: MovementComponent.self) {
agent.position = SIMD2<Float>(Float((node.position.x)), Float((node.position.y)))
if agent.velocity.x < 0 {
animation.move(direction: "left")
} else if agent.velocity.x > 0 {
animation.move(direction: "right")
} else {
animation.faceForward()
}
}
}
我正在 Swift 使用 Spritekit 和 GameplayKit 构建游戏。我目前在为与玩家竞争的 AI 敌人设置动画时遇到问题。
在游戏中,玩家收集从天上掉下来的物体,用来种花。人控玩家动画很简单,我通过摇杆左右移动,当摇杆的X位置为+/-时,为动画触发不同的SKAction。
但是对于敌人来说,他们的移动是根据 GKGoals 自动进行的,他们不断地左右跳跃和移动。触发移动代理动画的正确方法是什么?目前我尝试根据 agentWillUpdate 函数中代理的速度 (+/- dx) 做出反应
func agentWillUpdate(_ agent: GKAgent) {
if let agent = agent as? GKAgent2D {
agent.position = float2(Float((node.position.x)), Float((node.position.y)))
}
guard let aiEnemyBody = entity?.component(ofType: PhysicsComponent.self) else {
fatalError()
}
guard let animation = entity?.component(ofType: MovementComponent.self) else {
fatalError()
}
print(aiEnemyBody.physicsBody.velocity.dx) // usually 0, despite moving across map at high speed
if node.physicsBody!.velocity.dx > 0 {
animation.move(direction: "left")
} else if node.physicsBody!.velocity.dx < 0 {
animation.move(direction: "right")
} else {
animation.faceForward()
}
}
在调试中我发现当实体向左或向右移动时,代理的 x 速度变化并不总是改变?这是正确的行为吗?我希望有另一种方法来检测某个方向的运动
有关更多上下文,该游戏是一款 2d 平台式游戏 picture
如果这对任何人有帮助,我错误地使用物理体作为运动参考。正确的方法是使用GKAgent2D的velocity
func agentWillUpdate(_ agent: GKAgent) {
if let agent = agent as? GKAgent2D,
let animation = entity?.component(ofType: MovementComponent.self) {
agent.position = SIMD2<Float>(Float((node.position.x)), Float((node.position.y)))
if agent.velocity.x < 0 {
animation.move(direction: "left")
} else if agent.velocity.x > 0 {
animation.move(direction: "right")
} else {
animation.faceForward()
}
}
}