Java 制造游戏重力,一切进展得太快

Java 制造游戏重力,一切进展得太快,java,awt,gravity,Java,Awt,Gravity,所以基本上我现在正在做一个小项目,玩家可以通过移动来对抗东西,但是重力给了我一个问题。所以基本上,我得到了这个方法,checkGravity(),它将检查isGravityApplicable()是否返回true(实体的底部碰撞器(一个Line2D)是否与一个立足点(另一个Line2D))碰撞) 如果isGravityApplicable()返回true,那么应该应用重力,但我遇到的问题是,任何超过1像素Y的东西都太快了,甚至,将角色移动一个像素的速度也非常快。我不确定我是否应该修复我的游戏循环

所以基本上我现在正在做一个小项目,玩家可以通过移动来对抗东西,但是重力给了我一个问题。所以基本上,我得到了这个方法,checkGravity(),它将检查isGravityApplicable()是否返回true(实体的底部碰撞器(一个Line2D)是否与一个立足点(另一个Line2D))碰撞)

如果isGravityApplicable()返回true,那么应该应用重力,但我遇到的问题是,任何超过1像素Y的东西都太快了,甚至,将角色移动一个像素的速度也非常快。我不确定我是否应该修复我的游戏循环还是什么

public boolean isGravityApplicable() {
    for (Line2D line : frame.getMap().getFootholds()) {
        /*Does the bottom collider intersect the foothold?*/
        /*v THIS CHECK DOESN'T WORK CORRECTLY FOR SOME REASONS v*/
        if (!GraphicHelper.getLineCameraRelative(getBottomCollider(), frame.getCam()).intersectsLine(line)) {
            return true;
        }
        /*Above check returned false, if the velocity.y is above 1, then it might
         skip the line since it would be skipping 5 pixels for example at once.
         this check should resolve that.*/
        if (velocity.y > 0) {
            Line2D collider = getPositionToVelocityCollider();
            if (!collider.intersectsLine(line)) {
                position.y = (int) line.getY1(); //Y1 or Y2, same sh*t.
                return true;
            }
        }
    }
    return false;
}

public void checkGravity() {
    if (isGravityApplicable()) {
        if (isJumping) { //Player has jumped
            velocity.y += 1;
            velocity.y = velocity.y > TERMINAL_ACCELERATION ? (int) TERMINAL_ACCELERATION : velocity.y;
            if (velocity.y < 0) {
                isFalling = true;
            }
        } else if (isFalling) { //Player is currently falling but not from jumping. Most likely just spawned
            velocity.y = 1;
            /*Anything higher than 1 is WAY too quickly...*/
            //velocity.y += 1;
            //velocity.y = velocity.y > TERMINAL_VELOCITY ? (int) TERMINAL_VELOCITY : velocity.y;
        } else if (isJumping && isFalling) { //Player has jumped and has reached its highest point, falling back down
            velocity.y = 1;
            /*Anything higher than 1 is WAY too quickly...*/
            //velocity.y += 1;
            //velocity.y = velocity.y > TERMINAL_VELOCITY ? (int) TERMINAL_VELOCITY : velocity.y;
        } else { //Player hasn't jumped and has not started falling, he most likely just spawned
            isFalling = true;
            velocity.y = 1;
        }
    } else {
        isFalling = false;
        isJumping = false;
    }
}
public boolean isgravityapplicatable(){
对于(Line2D行:frame.getMap().getFootholds()){
/*底部碰撞器是否与立足点相交*/
/*v由于某些原因,此检查无法正常工作v*/
如果(!GraphicHelper.getLineCameraRelative(getBottomCollider(),frame.getCam()).intersectsLine(line)){
返回true;
}
/*上面的检查返回false,如果velocity.y大于1,则可能
跳过该行,因为它将一次跳过5个像素。
这个检查应该可以解决这个问题*/
如果(速度y>0){
Line2D collider=getPositionToVelocityCollider();
如果(!碰撞器相交线(线)){
position.y=(int)line.getY1();//Y1或Y2,相同的sh*t。
返回true;
}
}
}
返回false;
}
公共空间{
如果(IsGravityApplieble()){
如果(正在跳跃){//玩家已跳跃
速度y+=1;
速度.y=速度.y>终端加速度?(int)终端加速度:速度.y;
if(速度y<0){
isFalling=true;
}
}否则,如果(正在下落){//玩家当前正在下落,但不是因为跳跃。很可能是刚刚产生的
速度y=1;
/*任何高于1的值都太快了*/
//速度y+=1;
//速度.y=速度.y>终端速度?(int)终端速度:速度.y;
}否则,如果(isJumping&&isFalling){//玩家已经跳到了最高点,然后倒下
速度y=1;
/*任何高于1的值都太快了*/
//速度y+=1;
//速度.y=速度.y>终端速度?(int)终端速度:速度.y;
}否则{//玩家并没有跳,也并没有开始摔倒,他很可能是刚出生的
isFalling=true;
速度y=1;
}
}否则{
isFalling=false;
isJumping=false;
}
}

提前谢谢。哦,如果有什么我能做得更好的,比如说碰撞,它由实体周围的简单线条组成,请告诉我。:)谢谢。

Nevermind伙计们,出于某些原因,update/tick方法在循环中被调用了两次。我猜我有个脑屁之类的问题。

你的游戏循环速度需要控制@NicolasMartel你需要相应地集成每个更新,即使用时间步长。@NicolasMartel顺便说一句,如果(正在跳跃和正在下降)块,你的代码当前将永远不会到达
块。