gpt4 book ai didi

c++ - 使用名为 ASGE 的 C++ 框架,我的 Sprite 卡在屏幕边缘

转载 作者:行者123 更新时间:2023-11-28 01:14:14 25 4
gpt4 key购买 nike

我正在使用我的一位讲师创建的自定义游戏引擎。

我有 4 个输入可供用户玩乒乓游戏。这些输入按预期工作,但是一旦 Sprite (乒乓 Racket )接触到顶部或底部,它们就会卡在那里并且无法移动。添加 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;
}
}

编辑:通过将 y 值设置为不会使 Sprite 干扰屏幕顶部或底部的 y 值,可以轻松解决此问题。

例如

if (player_one-yPos() > game_height)
{
player_one->yPos(game_height - (player_one->height() / 2)
}
else if (player_one->yPos() < 0)
{
player_one->yPos(0 + (player_one->height() / 2)
}

此代码检测玩家是否离开了屏幕的顶部或底部,然后根据您的 y 值将玩家向下或向上移动其高度的一半。

最佳答案

让我们仔细看看

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 正以足够的速度快速滑向墙壁,那么一旦您更新其位置,它就可以进入或完全穿过墙壁。下一次边界测试将捕获 Sprite ,因为它超出了边界。

例如: Sprite 在 1000。它的高度是 50,它的每刻速度是 50。墙在 1080。

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

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

与墙壁碰撞的测试在 Sprite 出界后有效执行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;

取决于 Sprite 移动的方向。或者在下一次测试之前捕捉过冲并钳位。

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();
}

哪个对你的大脑来说更容易。

关于c++ - 使用名为 ASGE 的 C++ 框架,我的 Sprite 卡在屏幕边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com