2015-06-21 115 views
1

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

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

秋天等于4。如果collisionDown是真的它重置回4

我的跳法几乎是一样的:

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

跳转等于16.如果collisonDown为真,它将重置为16.

现在的问题是:想象角色正在跳跃。它在空中,而在下降的时候特性+ =下降;可以说characterY = 250,在这个时刻下降等于15。字符下面的下一个实体图块从Y位置255开始。字符位于250,并且不检测碰撞,因此下一帧会将15添加到characterY,即250 + 15 = 265。此时,角色已经“进入”实体图块这是在位置Y255.

我有“固定”,让角色回到固体瓷砖的顶部(这是可见的和烦人的)。这不是一个完美的解决方案,因为它会减慢字符每帧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程序员,所以我的语法可能有点偏离。

这应该可以工作,只需将您的游戏逻辑插入到合适的位置即可。

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

嗯。这似乎是一个合理的想法,但我真的不明白 返回maxFallUntilSolidBlockReached(); –

+0

如果您正在使用网格,并且所有块的高度均为静态宽度,则知道下面的块的y坐标。假设你的块的高度为20像素,characterY + fall = 122。你可以从122中减去20,直到你的数字小于20,或者简单地使用122 mod 20.结果为2,这意味着你也会下降2个像素深。要解决这个问题,只需将字符Y +降低2并将其用作更新!这假设你使用了一个网格。如果情况并非如此,还有其他选择,但是我需要看到你的地图实现能够真正帮助你,然后=) –

+0

感谢您的帮助:D,但是一个家伙建议了一个更简单的解决方案。无论如何感谢 –