我可以为乒乓球游戏提供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;
}
}
答案 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太幼稚。如果您的精灵以足够快的速度沿着墙壁滑动,则只要更新其位置,它就可以进入或完全穿过墙壁。下次对边界的测试将捕获子画面,因为它不在边界内。
例如: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();
}
您脑中较容易的那个。