我正在构建一个平台游戏,其中有一个跳到移动平台上的SKSpriteNode角色。
当平台移动时,角色没有,它最终从平台上掉下来。如果我点击移动按钮,角色会很好地移动,但我希望角色在移动时“粘住”平台。
我没有发布代码,因为代码按预期工作。我觉得它可以设置一个属性吗?
编辑:
我有一个解决方案 - 只是不确定人们应该怎么做,所以我会在下面发帖并等待反馈。它既冗长又复杂,可能不需要。
当用户按下左或右方向按钮时,我通过以下方式从GameScene.swift移动场景:
func moveGround(direction: String) {
if direction == "left" {
[snip...]
// move the platforms
self.enumerateChildNodesWithName("platform") {
node, stop in
if let foundNode = node as? PlatformSprite {
node.position.x += Helper().kMovingDistance
}
}
// move all other nodes
self.enumerateChildNodesWithName("*") {
node, stop in
if let foundNode = node as? SKSpriteNode {
node.position.x += Helper().kMovingDistance
}
}
[snip...]
} else if direction == "right" {
[snip...]
// move the platforms
self.enumerateChildNodesWithName("platform") {
node, stop in
if let foundNode = node as? PlatformSprite {
node.position.x -= Helper().kMovingDistance
}
}
// move all other nodes
self.enumerateChildNodesWithName("*") {
node, stop in
if let foundNode = node as? SKSpriteNode {
node.position.x -= Helper().kMovingDistance
}
}
[snip...]
}
这可以很好地移动场景。然后当角色落在平台顶部时,我使用SKAction序列启动平台移动并通过向GameScene发送反向序列来启动场景移动:
func startMoving() {
if !self.isMoving {
[snip...]
// get the platform actions and initiate the movements
let actions = self.getMovements()
let seq:SKAction = SKAction.sequence(actions)
// move the platform
self.runAction(seq, completion: { () -> Void in
self.completedPlatformActions()
})
// get the reverse actions and initiate then on the scene / ground
let reverseActions = self.getReverseMovements()
let reverseSeq:SKAction = SKAction.sequence(reverseActions)
delegate!.moveGroundWithPlatform(reverseSeq)
self.isMoving = true
}
}
然后我有一个用平台移动地面的功能,并为runAction添加一个键,这样我就可以停止该操作,而不是平台动作,如果用户不再与平台联系:
func moveGroundWithPlatform(seq: SKAction) {
[snip...]
self.enumerateChildNodesWithName("platform") {
node, stop in
if let foundNode = node as? PlatformSprite {
node.runAction(seq, withKey: "groundSeq")
}
}
[snip...]
}
然后我停止移动场景,但让平台的剩余动作继续使用:
func stopMovingGroundWithPlatform() {
[snip...]
self.enumerateChildNodesWithName("platform") {
node, stop in
if let foundNode = node as? PlatformSprite {
node.removeActionForKey("groundSeq")
}
}
[snip...]
}
丑陋我知道 - 如果其他人有关于如何更好地做到这一点的建议,我很想知道:)
答案 0 :(得分:1)
如果你想让角色与平台一起移动,你需要用力,冲动或设定速度来移动平台。我怀疑通过设置速度来控制平台更容易。您可以通过
在update
方法中执行此操作
platform.physicsBody?.velocity = CGVectorMake(dx,dy)
其中dx
和dy
分别控制x和y方向的平台速度。您还应该设置平台物理主体的摩擦属性。