[英]Java 2D Platformer Gravity
我目前正在用Java开发2D Platformer。 我是初学者,请放轻松。 我在游戏中的重力问题。 我对下降和跳跃使用了不同的变量。 我正在使用平铺的地图。 因此,让我们说清楚。 我的跌落方法是这样的-
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处并且未检测到碰撞,因此下一帧将其添加到characterY 15,即250 + 15 =265。此时,角色已“进入”实体图块位置Y 255。
我已经“修复”了,使角色重新回到实体图块的顶部(并且可见且令人讨厌。)这不是完美的解决方案,因为它会在每次进入实体图块时减慢角色一帧的速度(这是因为它检测到左右碰撞并且角色无法移动)。 如果我可以这样说,这个角色显然会口吃。
我需要一个解决方案,但是什么也想不出来。 因此,如果您提出建议,我会很高兴。 谢谢。
我通常处理此问题的方法是预先检查运动:
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程序员,所以我的语法可能有点偏离。
这应该可行,只要在有意义的地方插入游戏逻辑即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.