Java 2D 平台重力

Java 2D Platformer Gravity

我目前正在 Java 中制作 2D 平台游戏。我是初学者所以放轻松。 我在游戏中遇到重力问题。我使用不同的变量来进行下降和跳跃。我正在使用平铺地图。因此,让我们进入正题。 我的跌倒方法是这样的 -

if(collisionDown == false) {
    characterY += fall;
    fall ++;
{

fall 等于 4。如果 collisionDown 为 true,它将重置回 4。

我的跳转方法差不多:

if(key.E == true && collisionDown == true) {
   characterY -= jump;
   jump --;
}

跳转等于 16。如果 collisonDown 为真,它会重置回 16。

现在的问题是:想象角色在跳跃。它在空中,同时下降 characterY += fall;假设 characterY = 250 并且 fall 等于 - 15 在那个确切的时刻。角色下方的下一个实心图块从 Y 位置 255 开始。角色位于 250 并且未检测到碰撞,因此下一帧它向 characterY 添加 15,即 250 + 15 = 265。此时角色具有 "entered"位置 Y 255 的实心瓷砖。

我有 "fixed" 这样角色就会回到实心图块的顶部(那是可见的而且很烦人。)这不是完美的解决方案,因为它每次进入都会减慢角色 1 帧实心瓷砖(这是因为它检测到左右碰撞并且角色无法移动)。这么说的话,角色明显口吃

我需要该问题的解决方案,但想不出任何解决方案。 所以如果你提出建议我会很高兴。谢谢。

我通常处理这个问题的方法是预先检查运动:

private int moveDown(int fall){
        if (isSolidBlock(characterX, characterY + fall)){
            //Knowing the height of your block, calculate some kind of reduction. If your block height is 40, it's probably something like (characterY + fall)%40
            fall = 4;
            collisionDown = true;
            return maxFallUntilSolidBlockReached();
        }
        fall++;
        return fall;
    }

private boolean isSolidBlock(int x, int y){
        //Implement some kind of check if at (x,y) there's a solid block.
    }

然后只需为秋季计算执行此操作:

if(collisionDown == false) {
            characterY += moveDown(fall);
        }

我可能会使用类似下面的内容。

if(collisionDown == false) {
    characterYnext = characterY + fall;          //Get Next Position
    if(NextMovementCollides()){                  //Basically if next position is too far. 
    characterYnext += difference_between(CharacterY,Ground);     //This should move the character to the ground state.
    fall = 0;                                                   //No longer falling so reset the value.
    }
    else{characterY += fall; fall++;}       //Otherwise continue falling like normal.
}

免责声明:我不是 java 程序员,所以我的语法可能有点偏差。

这应该可行,只需在有意义的地方插入您的游戏逻辑即可。