2017-03-20 22 views
0

ここには、押されたすべてのキーでスプライトを移動するための関数があります。今私はキーを繰り返し押すのではなく、キーを保持に移動したいと思っていますが、どうやってそれを行うのか分かりません。私を案内してください、あなたの助けは非常に感謝しています。キーがそのように押されたときに、あなたの問題を解決する一つの方法は、yについて、x軸と一つ上の動きを追跡するグローバル(またはクラスまたは何でも)の変数を持つことで継続的にトリガ何のイベントはありませんcocos2d-xでキーボードイベントを押して保持する方法は?

keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event) 
    { 
     Vec2 location = event->getCurrentTarget()->getPosition(); 
     switch (keyCode) 
     { 
     case EventKeyboard::KeyCode::KEY_LEFT_ARROW: 
     case EventKeyboard::KeyCode::KEY_A: 
      event->getCurrentTarget()->setPosition(location.x - 10.0f, location.y); 
      break; 
     case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
     case EventKeyboard::KeyCode::KEY_D: 
      event->getCurrentTarget()->setPosition(location.x + 10.0f, location.y); 
      break; 
     case EventKeyboard::KeyCode::KEY_UP_ARROW: 
     case EventKeyboard::KeyCode::KEY_W: 
      event->getCurrentTarget()->setPosition(location.x, location.y + 10.0f); 
      break; 
     case EventKeyboard::KeyCode::KEY_DOWN_ARROW: 
     case EventKeyboard::KeyCode::KEY_S: 
      event->getCurrentTarget()->setPosition(location.x, location.y - 10.0f); 
      break; 
     } 
    }; 

答えて

1

軸。

2つの変数のみを使用するには、2つの整数を使用できます。xMovementとyMovementとし、どのキーが押されたかに基づいて値を-1,0または1に設定します。 xMovementが-1の場合はスプライトを左に移動し、1の場合は右に移動し、0の場合は移動しません。 y軸についても同じです。これを実現するために、あなたは、このようにコードを変更する必要があります。

keyBoardListener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event) 
    { 
     switch (keyCode) 
     { 
     case EventKeyboard::KeyCode::KEY_LEFT_ARROW: 
     case EventKeyboard::KeyCode::KEY_A: 
      xMovement++; 
      break; 
     case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
     case EventKeyboard::KeyCode::KEY_D: 
      xMovement--; 
      break; 
     case EventKeyboard::KeyCode::KEY_UP_ARROW: 
     case EventKeyboard::KeyCode::KEY_W: 
      yMovement--; 
      break; 
     case EventKeyboard::KeyCode::KEY_DOWN_ARROW: 
     case EventKeyboard::KeyCode::KEY_S: 
      yMovement++; 
      break; 
     } 
    }; 

:インクリメント/デクリメントキーを押すイベントからの反対べき場所

keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event) 
    { 
     switch (keyCode) 
     { 
     case EventKeyboard::KeyCode::KEY_LEFT_ARROW: 
     case EventKeyboard::KeyCode::KEY_A: 
      xMovement--; 
      break; 
     case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
     case EventKeyboard::KeyCode::KEY_D: 
      xMovement++; 
      break; 
     case EventKeyboard::KeyCode::KEY_UP_ARROW: 
     case EventKeyboard::KeyCode::KEY_W: 
      yMovement++; 
      break; 
     case EventKeyboard::KeyCode::KEY_DOWN_ARROW: 
     case EventKeyboard::KeyCode::KEY_S: 
      yMovement--; 
      break; 
     } 
    }; 

は今、あなたはまた、離鍵イベントを追加する必要がありますあなたはまた目を確実にするために、いくつかのメカニズムが必要になります

float newPosX = sprite->getPositionX() + (xMovement * 10.f); 
float newPosY = sprite->getPositionY() + (yMovement * 10.f); 
sprite->setPosition(newPosX, newPosY); 

:そして今、実際にはフレームごとに呼び出される更新機能では、このような何かを、あなたはスプライトに移動しますxMovementとyMovementは境界内にとどまります(私の例では、左矢印キーと 'a'キーを押すとスプライトは2倍速く移動します:P)。これは、キーボードイベントと更新機能を提供します。

関連する問題