我正在尝试编写一个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;
}}
答案 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());
,这样可以确保您移动速度"每秒一个像素/单位,无论计算机有多快或多慢。