玩家跳跃的问题

Issue with player jumping

本文关键字:问题 跳跃 玩家      更新时间:2023-10-16

我是一个有点新的程序员,做一些相对基本的事情。在过去的一段时间里(尽管我不经常做),在SDL的帮助下,我一直在制作2D游戏。现在,我正在编写代码,用于在按下w键时使玩家跳跃(控件是wsad)。我很快意识到我不能保持速度不变,因为这会导致跳跃更像y=-|x|的图,而不是y=-x^2,这看起来更像是一个实际的跳跃,而不是前者。以下是使其工作的代码部分。

//The part which happens when the jump key is pressed (w)
case SDLK_w:
if(InAir != true) {
StartOfJump = PlayerYCoord;
InAir = true;
velocity = 0.01;
break;
}
//And skip to a different part.
if(InAir == true) {
if(StartOfJump - PlayerYCoord < JumpHeight) {
PlayerYCoord = PlayerYCoord - velocity;
velocity = velocity * velocity;

速度是用来使玩家的Y坐标增加的速度呈指数级增加的。现在,在程序开始时,它被设置为0.01。

JumpHeight是玩家跳跃的像素数。这是为了能够轻松地修改它。实际上,JumpHeight设置为100像素。

StartOfJump是为了确保跳跃在正确的点被切断,因为虽然目前游戏的地图是平的,但我不希望保持这种状态。

PlayerYCoord是不言自明的,但基本上它是玩家在平面上的Y坐标。它是替身。

是的,我知道现在没有跌倒的代码。当我连上升部分都拿不到的时候,这其实并不重要。

不管怎么说,我真的不确定为什么,但由于某种原因,玩家的位置在按下w键时只增加了一个像素,它不会做任何其他事情。我试着修改代码说这个

if(InAir == true) {
if(StartOfJump - PlayerYCoord < JumpHeight) {
//PlayerYCoord = PlayerYCoord - 0.1;
PlayerYCoord = PlayerYCoord - velocity;
velocity = velocity * velocity;
cout << fixed << setprecision(4);
cout << "The velocity is" << velocity << " " << endl;

不幸的是,它从打印0.0001开始,然后永远打印0.000。但这是不对的,是吗?。。。速度的值是0.01…所以,我把最后一行改成这样:

cout << "The velocity is" << velocity * 100 << " " << endl;

果不其然,它输出0.0100,然后像上次一样无限输出0.0000。老实说,我不确定是什么导致了这个问题,但我认为这与玩家的Y坐标只增加了一个像素然后停止有关。

我可能犯了一个非常愚蠢的错误,很容易就能纠正。不管怎样,如果我需要包含任何其他代码(第一次在编程论坛上,我还没有完全确定这些内容),我很乐意包含它。提前感谢您的帮助!

附言:如果我的任何代码都依赖于系统,我使用的是Ubuntu 13.10,32位。

您错误地实现了重力。你需要以向上的速度开始。然后,你需要在每单位时间内从重力中减去向下的加速度。这将处理上升下降。您的代码确实。。。奇怪的事情。

velocity = 50
each unit of time while player is in the air:
playerY -= velocity
velocity -= acceleration

我不太同意上面的解决方案。

你的球员应该总是受到重力的影响,对吧?即使我们在地面上,我们也会受到重力的影响?

总是通过重力影响玩家,但当我们按下跳跃按钮左右时,添加反作用力,将玩家向上抛(但只有一次),然后重力会超过这个力,将玩家向下推。

布尔值InAir应该只确定玩家是否可以再次跳跃。因此,如果我们在空中,我们应该无法执行另一个跳跃命令。但如果我们被(InAir = false )接地,那么我们应该能够再次跳跃。

这也使得添加双跳或类似的动作更加有效。

编码快乐!