游戏跳跃逻辑

时间:2012-10-23 04:37:53

标签: c++ algorithm sdl

我正在制作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;
        }
    }

这是一个错误:当我到达关卡的末尾(有一个固定的宽度)时,如果我试图向右移动并同时跳 ,玩家会跳跃并停留在空中。只有当我释放空格键时,播放器才会到达地面。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

对于你的游戏,我认为你只希望玩家在玩家在场时按下空间时跳跃。然后,您必须检查玩家是否在场上才能获得所需的行为。

我建议你设置一个这样的机制:

if (this->keyPressed(SDLK_SPACE) && this->isOnTheFloor()) {
                                 ^^^^^^^^^^^^^^^^^^^^^^^
   mov->jump();        // Changes the velocity in Y
}    

答案 1 :(得分:0)

你的空格键处理程序应该只施加一次强制 - 按下按键,或者如果你愿意,可以按向上,而不是每一帧。在空格键向下,速度“向上”应设置为某个(可能是常数)值。然后每一帧,如果不在地面上,速度下降应该以最大速度增加指定量。所以OnSpacebarDown, YVelocity = 10.0;和每个框架if(!bGrounded) YVelocity -= 1.0;