我目前正在使用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帧(这是因为它检测到左右碰撞并且角色无法移动)。如果我可以这样说,那个角色就会明显口吃。
我需要一个针对该问题的解决方案,但却无法想到。 所以,如果你提出建议,我会很高兴。谢谢。
答案 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程序员,所以我的语法可能有点偏。
这应该可行,只需将游戏逻辑插入有意义的地方即可。