LibGdx下降对象

时间:2016-12-06 05:58:58

标签: java android ios android-studio libgdx

我正在尝试编写一个LibGDX游戏。

目前我正在尝试添加一个从屏幕顶部落到底部的图像,然后重新出现在屏幕上并再次下降,我还需要找到一种可以检测与玩家碰撞的方法(我会必须学会如何正确地添加一个球员。)

问题是我在Libgdx的这一部分没有任何经验我仍然相当新。

这是我到目前为止所尝试的,

Image image;

public Beam(Image image) {
    this.image = image;
    image.setPosition(LevelSmash.HEIGHT, LevelSmash.WIDTH);
}

public void update(){
    image.setY(image.getY() - 1);
}

public void draw(SpriteBatch sb){
    sb.begin();
    //Draw image?
    sb.end();
}

我已经知道它非常糟糕,我不知道要使用哪些LibGDX类,我想知道它是Body还是其他什么?

修改

更新代码

public class Beam extends Sprite{

Image image;

Body body;

public Beam(World world) {
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    bodyDef.position.set(100, 300);

    body = world.createBody(bodyDef);

    CircleShape circle = new CircleShape();
    circle.setRadius(20f);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = circle;
    fixtureDef.density = 0.5f;
    fixtureDef.friction = 0.4f;
    fixtureDef.restitution = 0.6f;
    Fixture fixture = body.createFixture(fixtureDef);
    circle.dispose();

    body.setUserData(this);

    setRegion(new Texture("beam.png"));
}

public void update(float dt){
}

public Body getBody(){
    return body;
}}

2 个答案:

答案 0 :(得分:2)

我认为你现在应该远离box2d。将它用于这个项目似乎有点过分了。

以下是如何解决问题的示例:

Beam.class:

public class Beam{
    private Rectangle bound;
    private TextureRegion texture;
    private float weight = 10; //or gravity or however you want to think about it

    public Beam(float x, float y, float width, float height){
        texture = new Texture(Gdx.files.internal("beam.png"));
        bound = new Rectangle(x,y,width,height);
    }

    public void update(float delta){
        bound.y -= weight*delta;
    }

    public Rectangle getBound(){
        return bound;
    }

    public Texture getTexture(){
        return texture;
    }
}

只需更改bound.y

即可将光束置于屏幕顶部
beam.getBound().y = newValue;

您可以在对象本身上执行此操作,也可以在游戏中使用它。

然后当你添加一个玩家时,你也可以给该对象一个约束,你可以用:

进行简单的碰撞
if( player.getBound().overlaps(beam.getBound())){
    //collision
}

bound是libgdx中的Rectangle对象。它包含x和y坐标以及宽度和高度。使用Rectangle可以非常简单地移动对象和碰撞检测。

编辑:

从render()中绘制纹理:

public void render(float delta){
    ...
    beam.update(delta);

    spriteBatch.begin();
    spriteBatch.draw(beam.getTexture(), beam.getBound().x, beam.getBound().y);
    spriteBatch.end();

}

或者自己画梁:

public void render(float delta){
    ...
    beam.update(delta);

    spriteBatch.begin();
    beam.draw(spritebatch);
    spriteBatch.end();
}
梁类中的

public void draw(SpriteBatch spriteBatch){
    spriteBatch.draw(texture, bound.x, bound.y);
}

答案 1 :(得分:1)

你走在正确的轨道上。有两种方法可以做到这一点 - 一种是使用Box2D(物理系统;你可以找到documentation here on the libGDX wiki),或建立你自己的运动和碰撞检测(这不是很难,实际上可能更好对于一个简单的游戏)。

我建议您先花些时间阅读libGDX维基文章,以便更好地了解该库。有教程教你如何绘制图像和处理运动。话虽如此,这里有一些提示:

在更新方法中,每帧的图像向下移动1个像素。这将成为一个问题,因为不同的计算机将以不同的速度执行帧,这意味着您的游戏在一台计算机上将比另一台计算机更快。您可以考虑image.setY(image.getY() - 1);之类的内容,而不是说image.setY(imsage.getY() - speed * Gdx.graphics.getDeltaTime());,这样可以确保您移动速度"每秒一个像素/单位,无论计算机有多快或多慢。