【问题标题】:Libgdx - Input Processing [Android]. What am I not getting about Listeners?Libgdx - 输入处理 [Android]。关于听众,我没有得到什么?
【发布时间】:2015-04-18 03:21:24
【问题描述】:

我已经研究了许多不同的方式来处理 android 的输入,但我真的无法理解它。我想知道我提供给您的代码,有人可以向我解释如何将这两种方法集成到我的代码中吗?为什么这样做是合适的?

首先,我将解释我的意图,并向您展示相关代码的快速概览。我想移动我的角色,向左、向右和跳跃(暂时)。这是我的第一款游戏,它是一个没有自动跳跃的肖像游戏(在渲染方面与 Doodle Jump 的背景有些相似)。我的关卡是随机生成的,它会渲染所有对象。现在我想添加输入,但对我来说主要的困惑是我应该将代码放在我的代码中的什么位置?

首先,我有一个GameObject 类和一个子类DynamicGameObject,这是世界上所有对象(平台、通电、硬币、玩家、敌人等)的super

GameObject.java

public class GameObject {
    public final Vector2 position;
    public final Rectangle bounds;

    public GameObject (float x, float y, float width, float height) {
        this.position = new Vector2(x, y);
        this.bounds = new Rectangle(x - width / 2, y - height / 2, width, height);
    }

DynamicGameObject.java

public class DynamicGameObject extends GameObject {
    protected static Vector2 velocity;
    public final Vector2 accel;

    public DynamicGameObject (float x, float y, float width, float height) {
        super(x, y, width, height);
        setVelocity(new Vector2());
        accel = new Vector2();
    }

    public Vector2 getVelocity() {
        return velocity;
}

public void setVelocity(Vector2 velocity) {
    DynamicGameObject.velocity = velocity;
}
}

然后我有了主要的游戏对象,我将在其中移动我将要实现的动作。我会在这个类中进行任何输入处理吗?

鲁本。 java [相关代码]

public Ruben (float x, float y) {
    super(x, y, RUBEN_WIDTH, RUBEN_HEIGHT);
    state = RUBEN_STATE_IDLE;
    stateTime = 0;
    grounded = true;
    facingRight = true;
    }

public void update (float deltaTime) {
    //getVelocity().add(World.gravity.x * deltaTime, World.gravity.y * deltaTime);
    position.add(velocity.x * deltaTime, velocity.y * deltaTime);
    bounds.x = position.x - bounds.width / 2;
    bounds.y = position.y - bounds.height / 2;

    if (position.x < 0) position.x = World.WORLD_WIDTH;
    if (position.x > World.WORLD_WIDTH) position.x = 0;
    stateTime += deltaTime;
}

然后我有一个世界级,它将更新游戏内的所有内容,相关的更新方法将是更新 ruben 的地方,如下所示:

private void updateRuben (float deltaTime, float accelX) {


    if (ruben.getState() != Ruben.RUBEN_STATE_IDLE && ruben.position.y <= 0.5f) ruben.hitPlatform();
    if (ruben.getState() != Ruben.RUBEN_STATE_IDLE) ruben.getVelocity().x = -accelX / 10 * Ruben.RUBEN_MOVE_VELOCITY;

    // clamp the velocity to the maximum, x-axis only
            if (Math.abs(ruben.getVelocity().x) > Ruben.RUBEN_MAX_VELOCITY) {
                ruben.getVelocity().x = Math.signum(ruben.getVelocity().x) * Ruben.RUBEN_MAX_VELOCITY;
            }

            // clamp the velocity to 0 if it's < 1, and set the state to standing
            if (Math.abs(ruben.getVelocity().x) < 1) {
                ruben.getVelocity().x = 0;
                if (Ruben.isGrounded()) {
                    Ruben.setState(Ruben.RUBEN_STATE_IDLE);
                }
            }

    ruben.getVelocity().scl(deltaTime);
    ruben.update(deltaTime);
    heightSoFar = Math.max(ruben.position.y, heightSoFar);
}

所以现在我希望您了解我正在处理的演员的一般背景,我将在哪里放置手势侦听器回调?我把它放进鲁本吗?还是我完全创建一个单独的班级?我已经尝试了很多不同的方法,但我并没有真正得到任何令人沮丧的地方。输入处理程序在哪里处理手势?我尝试将带有新手势侦听器的手势检测器回调放在 Ruben 的构造函数中

(GestureDetector gd = new GestureDetector(new GestureHandler(this));

然后在屏幕上用一个变量表示一个fling已经向上,当布尔触发器为真时,设置ruben的状态为跳跃并改变y轴上的速度。它仍然没有工作。有人可以帮忙吗?

如果您还需要什么,请告诉我。

主游戏类

public class GameView extends Game {
    // used by all screens
    public SpriteBatch batcher;
    @Override
    public void create () {
        batcher = new SpriteBatch();
        Settings.load();
        Assets.loadBackgrounds();
        Assets.loadItems();
        Assets.loadRuben();
        setScreen(new MainMenuScreen(this));

    }

    @Override
    public void render() {
        super.render();
    }
}

【问题讨论】:

    标签: java android input libgdx gesture


    【解决方案1】:

    如果你想在libGdx中使用GestureDetector这样的InputAdapter,你必须设置它,不知道你是否这样做,否则不会有任何从GestureDetector调用的方法。希望这是主要问题。 GestureDetector LibGdx Wiki

        Gdx.input.setInputProcessor(new GestureDetector(new GestureHandler(this)));
    

    此外,如果您想使用多个 InputAdapter,您必须使用 InputMultiplexer,尤其是如果您还想将 Stage 用于 GUI 事物。 Event Handling LibGdx Wiki

        InputMultiplexer inputMultiplexer = new InputMultiplexer();
        inputMultiplexer.addProcessor(stage);
        inputMultiplexer.addProcessor(new GestureDetector(new GestureHandler(this)));
        Gdx.input.setInputProcessor(inputMultiplexer);
    

    编辑: 我首选的使用 Screen 实现它的方法是 MainMenuScreen extends Screen implements GestureDetector.GestureListenershow() 方法 Gdx.input.setInputProcessor(new GestureDetector(this)); 然后您还可以轻松地通过方法访问要控制的对象。

    【讨论】:

    • 不幸的是,这不是我想要的。我知道要实施什么。我只是不知道在我的代码中在哪里实现它,我已经提到了我已经在这个问题中进行的尝试,并在它周围的上下文中希望获得有关是否有实现 GestureListener 的特定方法的建议或信息。跨度>
    • 好的,我以为输入无法识别。在你初始化重要的东西时,你的主类看起来如何?什么是基类?
    • 感谢您的及时回复,我已经调整了问题。
    • 你是指继承一切的类还是更新主游戏的类?
    • 我使用Screen 实现它的首选方法是MainMenuScreen extends Screen implements GestureDetector.GestureListener,在show() 方法Gdx.input.setInputProcessor(new GestureDetector(this)); 中,您还可以轻松访问要通过这些方法控制的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多