Java 我对跳跃的连贯性有问题

Java 我对跳跃的连贯性有问题,java,lwjgl,slick2d,Java,Lwjgl,Slick2d,我已经建立了一个非常基本的platformer游戏&我现在就要准备好了 除了跳跃,其他一切都很完美,我的跳跃长度非常不一致。它们的范围从很短到很长 我不习惯使用Slick2D、JWJGL或增量整数,请帮助 以下是我对该级别的全部代码: 打包游戏; 导入org.lwjgl.input.Mouse; 导入org.newdawn.slick.*; 导入org.newdawn.slick.state.*; 公共类LevelOne扩展了BasicGameState{ 动画向左行走、向右行走、静止; int

我已经建立了一个非常基本的platformer游戏&我现在就要准备好了

除了跳跃,其他一切都很完美,我的跳跃长度非常不一致。它们的范围从很短到很长

我不习惯使用Slick2D、JWJGL或增量整数,请帮助

以下是我对该级别的全部代码:

打包游戏;
导入org.lwjgl.input.Mouse;
导入org.newdawn.slick.*;
导入org.newdawn.slick.state.*;
公共类LevelOne扩展了BasicGameState{
动画向左行走、向右行走、静止;
int[]持续时间={200200};
图像p;
影像地图;
公共字符串mouse=“未检测到鼠标”;
公共字符串gpos=“null”;
公共卫生=1000;
浮点数=0;
浮动CharY=0;
浮点数PosX=CharX+100;
浮子位置y=CharY+300;
布尔跳跃=假;
浮动垂直速度=0.0f;
公共一级(国际州){
}
public void init(GameContainer gc,StateBasedGame sbg)引发异常{
p=新图像(“res/char.png”);
map=新图像(“res/map.png”);
Image[]Left={p.getSubImage(0,32,32),p.getSubImage(32,32,32),p.getSubImage(64,32,32)};
Image[]Right={p.getSubImage(0,64,32,32),p.getSubImage(0,64,32,32),p.getSubImage(0,64,32,32)};
walkingLeft=新动画(左、持续时间、假);
walkingRight=新动画(右、持续时间、假);
仍然=向左走;
}
公共void呈现(GameContainer gc、StateBasedGame sbg、Graphics g)引发异常{
g、 setColor(颜色为洋红色);
g、 抽绳(“开发商建造”,650100);
g、 setColor(Color.white);
g、 抽绳(鼠标,650,150);
g、 drawString(gpos,650,200);//开发人员构建边栏
g、 抽绳(“类别:”、650、250);
g、 抽绳(“+this.getClass(),670270);
g、 抽绳(“状态:+this.getID(),650300);
g、 抽绳(“舞台:查理”,650,350);
g、 drawRect(620、70400320);
绘制地图(CharX,CharY);//地板
g、 setColor(Color.white);
如果(健康<500){
g、 setColor(Color.red);
}
g、 抽绳(“健康:+健康,10,50”);
g、 setColor(Color.white);//运行状况和级别
g、 抽绳(1级、10级、70级);
still.draw(PosX,PosY);//绘制字符
}
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)引发异常{
Input=gc.getInput();
int MouseX=Mouse.getX();
int MouseY=Mouse.getY();
mouse=“JPos:“+MouseX+”,“+MouseY;
gpos=“gpos:”+MouseX+”,“+(460-MouseY);
if(input.isKeyDown(input.KEY\u D)){
仍然=向右行走;
CharX-=δ*.2f;
}
if(input.isKeyDown(input.KEY_A)){
仍然=向左走;
CharX+=δ*.2f;
如果(字符数>100){
CharX-=δ*.2f;
}
}
如果(input.isKeyPressed(input.KEY_W)&&&!跳跃){
垂直速度=-1f*delta;//负值表示向上移动
跳跃=正确;
}
如果(跳跃){
垂直速度+=.0099f*delta;//更改此值以改变重力强度
}
如果(PosY>300){
跳跃=错误;
垂直速度=0;
PosY=300;
}
PosY+=垂直速度;
如果(运行状况==0){
CharX=0;
健康=1000;
}
}
公共int getID(){
返回2;
}
}

你需要通过增量来调整跳跃速度。现在你只是在否定delta,这意味着你的跳转能力等于每毫秒帧之间经过的时间。这太变化无常了

您的代码应该是这样的:

float JUMP_POWER = .1f;
if(input.isKeyPressed(Input.KEY_W) && !jumping){
    verticalSpeed = -delta*JUMP_POWER;
}
这意味着您的角色在跳跃时的垂直速度为每毫秒0.1像素。如果增量以毫秒为单位:),则不确定是否为。如果你看不到角色移动的位置,只需增加跳跃力即可

这样做是因为每个动作都需要按时间缩放。这就是简单物理在现实生活中的作用。速度随时间改变位置。因此,为了模拟这一点,您需要计算相对于时间步长之间的时间的速度。

如果delta是某种“时间流逝”值,那么您不应该与它相乘。跳转速度与帧速率无关。只要选择一个好的速度:

if (input.isKeyPressed(Input.KEY_W) && !jumping)
{
    verticalSpeed = -1.0f;
    jumping = true;
}

玩一玩这个值。

你实际上错过了谜题的最后一块,如果你回想物理课,恒定加速度下的位置变化实际上是:

d=(v*t)+(1/2*a*t^2)

在哪里 d是距离 v是速度 这是时间 a是加速度

类似于

if (input.isKeyPressed(Input.KEY_W) && !jumping) { 
        verticalSpeed = JUMP_POWER;
        jumping = true;
}
PosY = PosY + (verticalSpeed * deltaTime) + (0.5f * gravity * deltaTime * deltaTime);
verticalSpeed = gravity * deltaTime;

因此,不仅需要将速度乘以时间,而且要使游戏在任何FPS上运行相同,还需要添加1/2*a*t^2来计算正确的距离

谢谢!这解决了我的问题!我的答案可能是你真正想要的。这不能很好地处理帧速率的变化。如果不使用FPS来衡量速度,你的游戏会在不同的电脑上运行得更慢或更快。不,你不理解速度的概念。速度应该通过从0到时间步长(这里是delta)的时间积分来使用。这简单地给出了运动量,在速度v下等于δ*v。这就是你必须在你的位置上添加每一帧的内容:位置+=速度*步长。不,你没能理解我。让我们复习一些简单的代数。(v1+v2)×step=v1×step+v2×step。后一个等式是我的解决方案的工作原理。然而,我认为前一种方法(你建议的)更有效,也更少