2017-04-11 14 views
2

私はスプライトキットゲームを作成しています。私は、プレイヤーを右または左に移動させる2つのボタンが必要です。ボタンを押すと、左のボタンを押すと、スプライトが停止せずに左に移動し始める必要があります。それが左の壁に当たったら、それは方向を変えて、もう一方の壁に向かって右に動く、など...私は、更新機能を使ってスプライトにこれをさせることができました。それが呼び出されるたびに、プレーヤーがボタンを押しているかどうかをチェックし、それに応じてスプライトを移動させますが、FPSの遅れ(FPSは50に落ちます)が発生します。fps遅れを起こさずにスプライトを移動する方法

私はMoveByやMoveToのようなSKActionsを使ってみましたが、スプライトにしたいものを再現できませんでした。

私の質問は:どのように私は2つのボタンを使用してFPSの遅れが発生しないようにスプライトを移動させることができます。どんな助けもありがとう。ありがとう

ここでは機能したが、遅れを引き起こした更新機能で呼び出された関数があります。

func moveRight() { 
    sprite.xScale = 1 
    sprite.position.x += 4 
} 

func moveLeft() { 
    sprite.xScale = -1 
    sprite.position.x -= 4 
} 
+0

このようなものは、あなたが人から本当の答えの代わりの推測を取得したい場合は、ここhttps://stackoverflow.com/help/mcveを見て、遅れを引き起こすことが起こっていません。 – Knight0fDragon

答えて

2

このコードを試してみてください。

ボタンを押すとボタンが離されたとき、それは、アクション

これはプレイヤーがフレームを落とすことなく、うまくいけば動いてしまいます削除されたとき、それは永遠に移動アクションを実行しますレート。壁に当たったときにスプライトの方向を変更するには、衝突をチェックする必要があります。壁に当たったら、leftMoveまたはrightMoveアクションが適用されているかどうかを確認し、そのアクションを削除して反対のアクションを開始できます。明らかに

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch in touches { 
     let location = touch.location(in: self) 

     if(leftButton.contains(location) { // check if left button was pressed 
      moveLeft() 
     } else if(rightButton.contains(location) { //check if right button was pressed 
      moveRight() 
     } 
    } 
} 

func moveLeft() { 
    //Check if it's already moving left, if it is return out of function 
    if((sprite.action(forKey: "leftMove")) != nil) { 
     return 
    } 
    //Check if its moving right, if it is remove the action 
    if((sprite.action(forKey: "rightMove")) != nil) { 
     sprite.removeAllActions() 
    } 
    //Create and run the left movement action 
    let action = SKAction.move(by: -100, duration: 1) 
    sprite.run(SKAction.repeatForever(action), withKey: "leftMove") 
} 

func moveRight() { 
    //Check if it's already moving right, if it is return out of function 
    if((sprite.action(forKey: "rightMove")) != nil) { 
     return 
    } 
    //Check if its moving left, if it is remove the action 
    if((sprite.action(forKey: "leftMove")) != nil) { 
     sprite.removeAllActions() 
    } 
    //Create and run the right movement action 
    let action = SKAction.move(by: 100, duration: 1) 
    sprite.run(SKAction.repeatForever(action), withKey: "rightMove") 
} 
+0

move関数は呼び出されますが、スプライトは移動しません...何が間違っている可能性がありますか? – RT5754

+0

さて、価値による動きは本当に低く、動かないように見えるかもしれません。 0.4を何千もの愚かなものに変更して、それが動くかどうか確認してみてください。また、移動したいスプライトに対して実行アクションが呼び出されていることを確認してください。 –

+0

これは問題の一部だったので、値を大きくするように変更しました。私はボタンを押したときに動きます。私がそれをリリースするとき(それは正しい)、それからそれはそれが動かなかった後にボタンを押すと、ちょうど少し - ボタンの方向の反対方向に動きます。私は何が起こっているのかわからない – RT5754

関連する問題