如何制作纹理'跳起来并返回到android java libgdx的起始位置

时间:2017-02-06 15:35:16

标签: java android libgdx

所以我只是想让我的游戏角色(一个纹理(ball))在空中跳起然后返回到按下屏幕时开始的位置。我只是想知道是否有人可以给我一个代码示例或帮助我使用下面的当前代码执行此操作。我基本上只绘制了背景和球的纹理,并将球定位在我希望它开始跳跃的位置。球纹理是我想要直接跳起来的。

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture background;
    Texture ball;

    @Override
    public void create () {
        batch = new SpriteBatch();
        background = new Texture("gamebackground.png");

        ball = new Texture("ball2.png");
        ball.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
    }

    @Override
    public void render () {
        batch.begin();
        float scaleFactor = 2.0f;
        batch.draw(background, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.draw(ball, 80, 145, ball.getWidth() * scaleFactor, ball.getHeight() * scaleFactor);
        batch.end();
    }

    @Override
    public void dispose () {}
}

1 个答案:

答案 0 :(得分:0)

有一百万种方法可以做到这一点。

这是一个简单的(而不是非常灵活的方式)。创建一个Ball类,其中包含x和y位置,速度和加速度的变量。然后给它一个更新方法,将加速度和速度应用到位置:

public class Ball {

    public static final float GRAVITY = -100; // size depends on your world scale
    public static final float BOUNCE_DAMPENING = 0.6f;

    public final Vector2 position = new Vector2();
    public final Vector2 velocity = new Vector2();
    public final Vector2 acceleration = new Vector2(0, GRAVITY);

    public void update (){
        float dt = Gdx.graphics.getDeltaTime();
        velocity.add(acceleration.x * dt, acceleration.y * dt));
        position.add(velocity.x * dt, velocity.y * dt);

        if (position.y <= 0){ // hit ground, so bounce
            position.y = -position.y * BOUNCE_DAMPENING;
            velocity.y = -velocity.y * BOUNCE_DAMPENING;
        }
    }

}

这是处理物理学的一种非常基本的方法。使用Box2D会更复杂,但如果您只是学习,上述情况就不错了。

现在,您需要创建一个球实例并使用它来跟踪您的球位置。绘制时使用Ball对象的位置。你可以对点击做出反应来施加速度。

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture background;
    Texture ballTexture;
    Ball ball;

    @Override
    public void create () {
        batch = new SpriteBatch();
        background = new Texture("gamebackground.png");

        ballTexture = new Texture("ball2.png");
        ballTexture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);

        ball = new Ball();
    }

    @Override
    public void render () {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // don't forget to clear screen

        if (Gdx.input.justTouched())
            ball.velocity.y += 100;
        ball.update();

        batch.begin();
        float scaleFactor = 2.0f;
        batch.draw(background, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.draw(ballTexture, ball.position.x, ball.position.y, ballTexture.getWidth() * scaleFactor, ballTexture.getHeight() * scaleFactor);
        batch.end();
    }

    @Override
    public void dispose () {
        batch.dispose();
        background.dispose();
        ballTexture.dispose();
    }
}

您还需要了解像素单位与世界单位以及如何使用Viewport解决比例问题。请参阅https://xoppa.github.io/blog/pixels/https://github.com/libgdx/libgdx/wiki/Viewports