使用Scene2d按钮移动Sprite

时间:2014-04-22 17:40:23

标签: java android libgdx sprite

我正在使用LibGdx创建一个Android游戏。它是一个平台游戏,地图是基于平铺的。为了测试玩家的动作,我使用了Key输入,游戏的桌面版本运行正常。我在scene2d中创建了一些按钮,并将它们作为演员添加到场景中,以便在Android设备上播放时游戏具有移动按钮。按钮的工作方式为“ System.out.print ”。 问题是:按钮和播放器都是在不同的类中创建的。我似乎无法从持有按钮的类中修改播放器的速度(以及运动)。为此,我需要将速度和速度等更改为静态,这会在Android设备上出现奇怪的错误(播放器不显示,或在帧后消失)。我不知道如何解决这个问题以及这个错误的实际原因是什么。以下是不同类的一些代码:

主类(MyGdxGame)仅包含一个按钮作为示例。

 public class MyGdxGame extends Game implements ApplicationListener {

 private Skin skin;
 private Stage stage;

@Override
public void create() {  
    setScreen(new Play());
    skin = new Skin(Gdx.files.internal("ui/defaultskin.json"));
    stage = new Stage();
    Gdx.input.setInputProcessor(stage);


    //Button Right
    TextButton buttonRight = new TextButton("Right", skin, "default");

    buttonRight.setWidth(50f);
    buttonRight.setHeight(50f);
    buttonRight.setPosition(Gdx.graphics.getWidth() /2 - 250f, Gdx.graphics.getHeight()/2 - 200f);

    buttonRight.addListener(new ClickListener(){
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            System.out.println("Hold");
            return true;
        }
        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
            System.out.print("Released");
        }

    });


    stage.addActor(buttonRight);

}

Play Class

public class Play implements Screen {
     private TiledMap map;
     private OrthogonalTiledMapRenderer renderer;
     private OrthographicCamera camera;

private Player player;

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    camera.position.set(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2, 0);
    camera.update();

    renderer.setView(camera);
    renderer.render();

    renderer.getSpriteBatch().begin();
    player.draw(renderer.getSpriteBatch());
    renderer.getSpriteBatch().end();
}

@Override
public void resize(int width, int height) { 
    camera.viewportWidth = width;
    camera.viewportHeight = height;
}

@Override
public void show() {
    map = new TmxMapLoader().load("maps/map.tmx");
    renderer = new OrthogonalTiledMapRenderer(map);
    camera = new OrthographicCamera();

    player = new Player(new Sprite(new Texture("data/jack2.png")), (TiledMapTileLayer) map.getLayers().get(0));
    player.setPosition(2 * player.getCollisionLayer().getTileWidth(), 10 * player.getCollisionLayer().getTileHeight());

}

玩家等级

public class Player extends Sprite implements InputProcessor{

// the movement velocity //
public Vector2 velocity = new Vector2();
public float speed = 60 * 2, gravity = 60 * 1.8f;
private boolean canJump;
private TiledMapTileLayer collisionLayer;
private String blockedKey = "blocked";
public Player(Sprite sprite, TiledMapTileLayer collisionLayer){
    super(sprite);
    this.collisionLayer = collisionLayer;
}

@Override
public void draw(SpriteBatch spriteBatch) {
    update(Gdx.graphics.getDeltaTime());
    super.draw(spriteBatch);

}

所以按钮有一个工作的ClickListener,但我不知道它如何修改玩家的速度。欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

您只需要有一些方法可以从包含按钮的类中访问该播放器实例。在我的游戏中,我创建了一个静态的World类,可以从程序的任何地方访问。通过世界级,我可以访问播放器实例。这就是我如何做到的,你可能会找到另一种方式。你说你的程序在使某些参数静态时在android设备上有错误吗?你的意思是它编译,但它只是没有按你期望的方式工作?如果是这种情况,那么你可能只是在修改玩家的位置或速度方面存在一个错误。