身体の部分が体(胴体、脚、頭部など)に分割されているプレーヤーがあります。これで、プレーヤーの動きを制御するボタン右に押すと、右に移動し、その部分は正常に動作します。問題はwalk()メソッドが呼び出され、それが何をするのかはプレーヤーの足をアニメーション化してその歩行のように見せることですが、動きが止まらなければwalk()を呼び出すアニメーションなので、前後にこだわったように見えます。私が達成しようとしていることは、プレイヤーが絶えず歩くことができることですが、walk()(アニメーションメソッド)を一度呼び出すと終了し、再度呼び出されます(歩くボタンが押されている限り)。ここで私はこれまで持っているもの:タッチを無効にせずにSpriteNodeで動作するアクションを終了する
func walk(){
let leftFootWalk = SKAction.run {
let action = SKAction.moveBy(x: 1, y: 0.1, duration: 0.1)
let actionReversed = action.reversed()
let seq = SKAction.sequence([action, actionReversed])
self.leftUpperLeg.run(seq)
self.leftLowerLeg.run(seq)
}
let rightFootWalk = SKAction.run {
let action = SKAction.moveBy(x: 0.4, y: 0.1, duration: 0.1)
let actionReversed = action.reversed()
let seq = SKAction.sequence([action, actionReversed])
self.rightUpperLeg.run(seq)
self.rightLowerLeg.run(seq)
}
let group = SKAction.sequence([leftFootWalk, SKAction.wait(forDuration: 0.2), rightFootWalk])
run(group)
}
extension GameScene: InputControlProtocol {
func directionChangedWithMagnitude(position: CGPoint) {
if isPaused {
return
}
if let fighter = self.childNode(withName: "fighter") as? SKSpriteNode, let fighterPhysicsBody = fighter.physicsBody {
fighterPhysicsBody.velocity.dx = position.x * CGFloat(300)
walk()
if position.y > 0{
fighterPhysicsBody.applyImpulse(CGVector(dx: position.x * CGFloat(1200),dy: position.y * CGFloat(1200)))
}else{
print("DUCK") //TODO: duck animation
}
}
}