Java 2D平台重力

时间:2015-06-21 14:22:31

标签: java game-physics

我目前正在使用Java制作2D平台游戏。我是初学者,所以放轻松。 我对游戏中的引力有疑问。我使用不同的变量进行下降和跳跃。我正在使用平铺地图。所以让我们谈谈这一点。 我的堕落方法就是这样 -

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

fall等于4.如果collisionDown为true,则重置为4.

我的跳跃方法几乎相同:

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

jump等于16.如果collisonDown为true,则重置为16。

现在的问题是:想象一下角色正在跳跃。它在空中,而在下降时,字符Y + =下降;让我们说characterY = 250并且在同一时刻坠落是相等的 - 15。字符下方的下一个实心图块从Y位置255开始。字符位于250且未检测到碰撞,因此下一帧它将15添加到characterY,即250 + 15 = 265.此时字符已“输入”实体图块位于第255位。

我已经“固定”了,因此角色会回到实心拼贴的顶部(这是可见且令人讨厌的。)这不是完美的解决方案,因为每次进入实心拼贴时它会减慢角色1帧(这是因为它检测到左右碰撞并且角色无法移动)。如果我可以这样说,那个角色就会明显口吃。

我需要一个针对该问题的解决方案,但却无法想到。 所以,如果你提出建议,我会很高兴。谢谢。

2 个答案:

答案 0 :(得分:0)

我通常采用的方式是预先检查运动:

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

答案 1 :(得分:0)

我可能会使用以下内容。

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程序员,所以我的语法可能有点偏。

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