Ich habe angefangen, ein kleines Spiel in Java zu machen, und in Kollisionen gebracht, und eine Form der Schwerkraft, die Geschwindigkeit des Spielers nimmt nicht zu, wie es im wirklichen Leben fällt. Ich möchte diese Form der Schwerkraft verbessern, um sie realistischer zu machen, außerdem habe ich einen Kollisionsblock für den Boden, und wenn der Spieler vom Boden läuft, bleibt er in dieser Höhe und fällt nicht.Java 2D Platformer Gravitationsverbesserungen
Im Folgenden meine Spielerklasse:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
public class Player {
private int x, y, width, height, lx, ly, dx, dy;
private final int FallSpeed = 2;
private final long JumpingTime = 8;
public boolean jumping = false, falling = true;
public Player(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
lx = x;
ly = y;
dx = x;
dy = y;
new Thread(new gravityThread()).start(); // Make user fall in case they are in the air
}
public void setX(int x) {
this.x = x;
lx = x;
dx = x;
}
public void setY(int y) {
this.y = y;
ly = y;
dy = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
public void update() {
}
public void move(int ax, int ay) {
dx += ax;
dy += ay;
checkCollisions();
}
public void checkCollisions() {
if (collided()) {
falling = false;
dx = lx;
dy = ly;
}
x = dx;
y = dy;
lx = x;
ly = y;
}
public boolean collided() {
Rectangle desired = new Rectangle(dx, dy, width, height);
for (Rectangle r : CollisionManager.collisions) if (r.intersects(desired)) return true;
return false;
}
public void jump() {
falling = false;
jumping = true;
new Thread(new gravityThread()).start();
}
public void render(Graphics2D g2d) {
g2d.setColor(Color.black);
g2d.fill(getBounds());
}
private class gravityThread implements Runnable {
int i = 0;
@Override
public void run() {
while(jumping) {
try {
i++;
Thread.sleep(JumpingTime);
move(0, -FallSpeed);
if (i == 40) {
jumping = false;
falling = true;
}
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
while(falling) {
try {
Thread.sleep(JumpingTime);
move(0, FallSpeed);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
}
}
In einer anderen Klasse, die alles rund um die Fenstergriffe zeichnen, steuere ich Spieler Bewegung mit diesem Code-Schnipsel:
public void onUpdate() {
if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_A))
player.move(-WalkSpeed, 0);
if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_D))
player.move(WalkSpeed, 0);
if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_SPACE)) {
if (!player.jumping && !player.falling)
player.jump();
}
if (player.getY() >= screenHeight - player.getHeight()) {
player.setY(screenHeight - player.getHeight());
player.falling = false;
}
if (player.getY() <= 0)
player.setY(0);
if (player.getX() >= screenWidth - player.getWidth())
player.setX(screenWidth - player.getWidth());
if (player.getX() <= 0)
player.setX(0);
}
Warum verarbeiten Sie die Schwerkraft in einem speziellen Gewinde? Es gibt keinen Grund, denke ich. Sie können die Schwerkraft in der 'OnUpdate'-Methode berechnen. – vojta
Ich verarbeite es in seinem eigenen Thread, so dass der Benutzer sich in der Luft bewegen kann, werden sie immer noch in der 'OnUpdate' Methode bewegen können? – Jono
Um Physik hinzuzufügen, braucht man ein Verständnis von Physik. Wie können Sie realistische Physik anwenden, wenn Sie sie nicht verstehen? Erfahren Sie mehr über Geschwindigkeit, Beschleunigung usw. in der Physik und Sie können realistisch fallen lassen. –