【问题标题】:Moving a Sprite using a Scene2d button使用 Scene2d 按钮移动 Sprite
【发布时间】:2014-04-24 02:30:48
【问题描述】:

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

Main Class (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);

}

游戏课

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,但我不知道它如何修改玩家的速度。欢迎任何帮助。

【问题讨论】:

    标签: java android libgdx sprite


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2015-11-15
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多