Java2D平台的重力改进
我已经开始用Java做一个小游戏,加入了碰撞和重力,玩家的速度不会像现实生活中那样随着下落而增加。我想改进这种重力的形式,使它更真实,我还有一个地板碰撞块,当球员离开地板时,它保持在那个高度,不会摔倒 以下是我的玩家等级:Java2D平台的重力改进,java,game-physics,Java,Game Physics,我已经开始用Java做一个小游戏,加入了碰撞和重力,玩家的速度不会像现实生活中那样随着下落而增加。我想改进这种重力的形式,使它更真实,我还有一个地板碰撞块,当球员离开地板时,它保持在那个高度,不会摔倒 以下是我的玩家等级: import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; public class Player { private int x
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);
}
}
}
}
}
在另一个处理将所有内容绘制到窗口的类中,我使用以下代码段控制播放器的移动:
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);
}
public void onUpdate(){
if(this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_A))
玩家移动(-WalkSpeed,0);
if(this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_D))
玩家移动(步行速度,0);
if(this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_SPACE)){
如果(!player.jumping&&!player.falling)
player.jump();
}
如果(player.getY()>=屏幕高度-player.getHeight()){
player.setY(屏幕高度-player.getHeight());
player.falling=false;
}
if(player.getY()=屏幕宽度-player.getWidth())
setX(screenWidth-player.getWidth());
如果(player.getX()
- 重力为9.81 m/s²
- 获取你的“绘图更新速度”,这是s(为了现实起见,你应该每秒更新至少30次。计算时要记住这一点)
- 得到你对长度的定义,这是m
杯形物体的位置取决于每帧的当前速度v和加速度(g力)a。
东西落得越久,落得越快
编辑:要使跌倒/跳跃时的侧向移动更逼真,您需要使用sin(),cos().为什么你要在一个特殊的线程中处理重力?我想没有理由。你可以用onUpdate
方法计算重力。我在它自己的线程中处理重力,这样用户可以在空中移动,他们还能在onUpdate
方法中移动吗?要添加物理,你需要了解物理。你怎么做如果你不懂,你希望能够应用真实的物理吗?学习物理中的速度、加速度等,你就能够添加真实的下落。@托比亚斯我了解它在现实生活中的工作原理,玩家会根据失败的时间下降得更快,但这并不意味着我知道如何很好地实施它。我会投票赞成clo将此作为的副本,但我不太愿意在此处使用dupehammer。