2017-03-23 3 views
0

最後のキーボードイベントの実行が完了する前に、キーを押したときにキーボードイベントに問題があります。ここで私はonKeyPressedイベントがあります。現在のキーボードイベントが終了するまでキーボードイベントのキャプチャを停止するにはどうすればよいですか?

keyBoardListener->onKeyPressed = 
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){ 
    switch (keycode) 
     case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
     // Move 900 pixel to the Right in 3s 
     case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: 
     // Jump. 
}; 

は私のキャラクターは、私はKEY_RIGHT_ARROWを押すと、私のchracterは3秒右に900ピクセルの移動を開始位置xに今あると言うことができます。ただし、の後に1秒間、がKEY_UP_ARROWを押します。今私は私のキャラクターはゴール(x + 900)に到達するまで移動してジャンプしますが、実際には私はKEY_UP_ARROWを押したときに彼がどこにいたかをジャンプします。

2つの解決策は、現在のイベントが終了するか、別の場所に保存され、先入れ先出しのシーケンスで後で実行されるまで、アプリが新しいキーボードイベントをキャプチャするのをどうにかする必要があるということです。だから:

1 /それはそれに対処するための良い方法ですか?そうなら、それをどうやって行うのですか?

2 /他に解決策はありますか?

ご協力いただきありがとうございます。

更新:私は新しいキーボードイベントを防ぐためにフラグを設定しようとしましたが、それはまだ同じ:

int flag = 0; 
keyBoardListener->onKeyPressed = 
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){ 
    if(flag==0) 
    { 
     flag++; 
      switch (keycode) 
      case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
      // Move 900 pixel to the Right in 3s 
      case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: 
       // Jump. 
     flag--; 
    } 
}; 
+0

問題がどこにあるのかわかりません。右矢印を押したときにアニメーションを実行している場合は、ベクトル内のすべてのクリックを覚えておくことができます。偶然にあなたの行動が、例えばキャラクターを右に動かしている場合、キャラクターが正しく動作しているかどうかを知るフラグを設定するだけで、アップデート機能でビット(速度*デルタ)で移動できます。 – Makalele

+0

@Makaleleひどい説明を申し訳ありません。私の問題は、私のキャラクターが現在位置xにあると言うことです。私がKEY_RIGHT_ARROWを押すと、私のキャラクターは900ピクセルを3秒で右に動かし始めます。しかし、1秒後にKEY_UP_ARROWを押します。今度は私のキャラクターがゴールに達するまで(x + 900.f)ジャンプしますが、実際にはKEY_UP_ARROWを押すと元の位置にジャンプします。 –

答えて

1

私が想像し、これを実行する最も簡単な方法は、ベクトル内のアクションを格納することで、

virtual void update(float delta) override; 
Vector<ActionInterval* > actions; 

その後、.cppファイル内:.hファイルで

このような
keyBoardListener->onKeyPressed = 
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){ 

    switch (keycode) 
     case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW: 
      // Move 900 pixel to the Right in 3s 
      auto newAction = MoveBy::create(3.0f, Vec2(900, 0)); 
      newAction->setTag(101); 
      actions.pushBack(newAction); 

     case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW: 
       // Jump. 
      auto newAction = MoveBy::create(3.0f, Vec2(0, 500)); 
      newAction->setTag(101); 
      actions.pushBack(newAction); 

}; 

scheduleUpdate(); 

void MyScene::update(float delta){ 
    if(sprite->getActionByTag(101) == nullptr){ //idle 
     if(actions.size() > 0){ //get oldest action 
      auto action = actions.at(0); 
      actions.erase(0); //remove it from vector 
      sprite->runAction(action); //play it 
     } 
    } 
} 
+0

私はあなたの考えを理解し、私はそれを試してみます。しかし、私はActionを使うだけで良いと思う。しかし、私の場合は、 ''スプライト - > setPosition() ''、 ''スプライト - > setOpacity() ''、スプライト - > setEnabled() 'などのアクションを実行した後、他のものを実行する必要があります。では、これらのプロセスがすべて終了するまで、次のイベントを待つ方法を教えてください。 –

+1

1つのコマンドをCallFuncに保存してアクションに追加することもできます。 – Makalele

関連する問題