且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我应该如何在此2d Java游戏中实现跳跃/重力/下落

更新时间:2022-11-10 09:42:52

您要做的就是为场景中的对象实现速度加速度重力。速度是2D向量,它告诉您某事物移动的速度,而加速度则告诉您速度增加了多少

What you want to do, is implement speed, acceleration and gravity for the objects on your scene. Speed is a 2D vector, which tells you how fast something moves, while acceleration tells you how much the speed increases.

所有对象都应具有 update()方法,该方法会定期调用。它将对象的速度应用于其位置(无论如何,速度和位置如何相关),并且当您要加速对象时,基本上只是增加它的速度。在 update()方法中,我们还应用重力(以负Y加速度的形式)

All objects should have an update() method, which is called periodically. It will apply the speed of the object to it's position (that's how speed and position are related anyways) and when you want to accelerate an object, you will basically just increase its speed. In the update() method we also apply gravity (in form of negative Y acceleration)

利用摩擦。摩擦力可以确保您的物体沿特定方向移动时会变慢。

You can also make use of friction. Friction makes sure that your objects will slow down, as they move into a certain direction.

在此简单的模拟中,当值接近 1 。这意味着在 FRICTION == 1 时您没有摩擦,而在 FRICTION == 0 时,您的对象将立即停止。 / p>

In this simple simulation, friction gets weaker, as the value approaches 1. That means at FRICTION==1 you have no friction and at FRICTION==0 your objects will stop immediately.

public class PhysicsObject {
    public static final double FRICTION = 0.99;
    public static final double GRAVITY = 0.01;
    private double posX;
    private double posY;
    private double speedX = 0;
    private double speedY = 0;

    public PhysicsObject(double posX, double posY) {
        this.posX = posX;
        this.posY = posY;
    }

    public void accelerate(double accelerationX, double accelerationY) {
        speedX += accelerationX;
        speedY += accelerationY;
    }

    public void move(double xDelta, double yDelta) {
        posX += xDelta;
        posY += yDelta;
        // do collision detection here. upon collision, set speedX/speedY to zero..!
    }

    public void update() {
        move(speedX, speedY);
        speedX *= FRICTION;
        speedY *= FRICTION;
        accelerate(0, -GRAVITY); // gravity accelerates the object downwards each tick
    }

    public double getPosX() {
        return posX;
    }

    public double getPosY() {
        return posY;
    }
}

您也可以使用 update ()处理碰撞检测(应将速度设置为零),敌人可以执行AI逻辑。

You can also use update() to process collision detection (which should set speed to zero) and enemies could do their AI logic..

您将播放器可以扩展此 PhysicsObject 并具有方法 jump() runLeft() runRight(),看起来像这样:

You class Player could extend this PhysicsObject and have the methods jump(), runLeft() and runRight(), which could look like this:

public class Player extends PhysicsObject{
    public static final double JUMP_STRENGTH = 5;
    public static final double SPEED = 1;
    public void jump() {
        accelerate(0, JUMP_STRENGTH); // change 5 for some constant or variable indicating the "strength" of the jump
    }

    public void runRight() {
        move(SPEED, 0);
    }

    public void runLeft() {
        move(-SPEED, 0);
    }
}

碰撞检测本身就是一件大事此处内容过多,但此视频很好地描述了该视频。去看看吧!

Collision detection is a huge thing on it's own and it would be too much to cover here, but this video describes it very well. Go check it out!