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 程序员,所以我的语法可能有点偏差。
这应该可行,只需在有意义的地方插入您的游戏逻辑即可。
我目前正在 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 程序员,所以我的语法可能有点偏差。
这应该可行,只需在有意义的地方插入您的游戏逻辑即可。