雪碧卡在屏幕边缘

时间:2019-12-06 21:35:02

标签: c++

我可以为乒乓球游戏提供4个输入。这些输入会按预期的方式工作,但是,一旦精灵(乒乓球拍的桨叶)接触顶部或底部时,它们会卡在此处并且无法移动。添加else语句,说w_keypress = false;不起作用。我该如何解决这个问题?

if (w_keypress)
{
   if (player_one->yPos() >= 0 && player_one->yPos() + player_one->height() <= game_height)
   {
      yspeed_player_one = -500;
      s_keypress = false;
      y_pos_player_one += yspeed_player_one * (game_time.delta.count() / 1000.f);
      player_one->yPos(y_pos_player_one);

      std::cout << "keypress w" << std::endl;
   }
}

1 个答案:

答案 0 :(得分:2)

让我们仔细看看

if (player_one->yPos() >= 0 && player_one->yPos() + player_one->height() <= game_height)
{
   yspeed_player_one = -500;
   s_keypress = false;
   y_pos_player_one += yspeed_player_one * (game_time.delta.count() / 1000.f);
   player_one->yPos(y_pos_player_one);
}
  1. 检查位置。如果有界限,
    1. 通过添加当前速度来更新位置
  2. 其他
    1. 什么都不做

问题在于步骤1.1太幼稚。如果您的精灵以足够快的速度沿着墙壁滑动,则只要更新其位置,它就可以进入或完全穿过墙壁。下次对边界的测试将捕获子画面,因为它不在边界内。

例如:Sprite的高度为1000。高度为50,每跳的速度为50。墙的高度为1080。

第1步测试1000 + 50 <=1080。这是正确的,因此第1.1步更新了位置:1000 + 50 =1050。小精灵现在占据1050到1099,并且在墙壁内。

在下一次按下按钮时,步骤1测试1050 + 50 <=1080。这是错误的,因此执行2.1,并且精灵不会移动。

在精灵超出边界and by then it is too late之后,将有效执行与墙的碰撞测试。

您想要一个功能类似于

的功能
TYPE clamp_move(TYPE max_move,
               TYPE distance_to_wall)
{
    if (max_move < distance_to_wall)
    {
        max_move = distance_to_wall;
    }
    return max_move;
}

以防止过度射击。请注意,这几乎是std::min,因此请使用std::min

你结束了

deltapos = std::min(yspeed_player_one * (game_time.delta.count() / 1000.f), 
                    player_one->yPos());
y_pos_player_one -= deltapos;

deltapos = std::min(yspeed_player_one * (game_time.delta.count() / 1000.f), 
                    game_height - (player_one->yPos() + player_one->height()));
y_pos_player_one += deltapos;

取决于精灵移动的方式。或者通过在下一次测试之前捕获过冲并进行夹紧。

y_pos_player_one += yspeed_player_one * (game_time.delta.count() / 1000.f);
if (y_pos_player_one <0)
{
    y_pos_player_one  = 0;
}
else if (y_pos_player_one > game_height - player_one->height())
{ 
    y_pos_player_one = game_height - player_one->height();
}

您脑中较容易的那个。