4

2Dマリオゲームを作っています。

次の関数は、特定のキーが押されたときにプレーヤーの位置を更新することを目的としています。プレイヤーは左右に移動し、同じ場所でジャンプしたり、左右にジャンプしたり (弧を描くように) することができます。

 bool updatePlayerPosition(Movement* mov){
        if (this->keyPressed(SDLK_RIGHT)) {
            mov->applyForce(1); // Changes the velocity in X
        }   
        if (this->keyPressed(SDLK_LEFT)) {
            mov->applyForce(-1);  // Changes the velocity in X
        }           
        if (this->keyPressed(SDLK_SPACE)) {
            mov->jump();        // Changes the velocity in Y
        }       
        if (this->keyPressed(SDLK_DOWN)) {
            mov->fallDown();   // Changes the velocity in X and Y
        }

        Point* pos = mov->getPosition();

        // Check whether the position is out of bounds
        if(Level::allowsMove(pos)){
              // If it is not, I update the player's current position
              position->x = pos->x;
              position->y = pos->y;
              return true;
        }
        // If the movement is not allowed, I don't change the position
        else {
              mov->setPosition(*position);
              return false;
        }
    }

ここにバグがあります: レベルの終わり (固定幅) に到達したとき、右に移動して同時にジャンプしようとすると、プレイヤーはジャンプして空中にとどまります。スペースバーを放したときだけ、プレーヤーは地面に着きます。

どうすればこれを修正できますか?

4

2 に答える 2

2

あなたのゲームでは、スペースが押されたときとプレーヤーが床にいるときだけにプレーヤーをジャンプさせたいと思います。次に、プレーヤーがフロアにいるかどうかを確認して、目的の動作を行う必要があります。

次のようなメカニズムをデバイスにすることをお勧めします。

if (this->keyPressed(SDLK_SPACE) && this->isOnTheFloor()) {
                                 ^^^^^^^^^^^^^^^^^^^^^^^
   mov->jump();        // Changes the velocity in Y
}    
于 2012-10-23T05:01:44.933 に答える
0

スペースバー ハンドラーは、すべてのフレームではなく、必要に応じて、キーを押したとき、またはキーを押したときに、1 回だけ力を適用する必要があります。スペースバーを押したとき、速度「上」は何らかの (ほぼ一定の) 値に設定する必要があります。次に、すべてのフレームで、地面にない場合は、速度を最大速度で指定された量だけ増加させる必要があります。それでOnSpacebarDown, YVelocity = 10.0;、各フレームについてif(!bGrounded) YVelocity -= 1.0;

于 2012-10-23T05:08:30.293 に答える