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

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

于 2012-10-23T05:08:30.293 回答