在LIBGDX中实现游戏手柄控制器?

3
我不知道如何实现LIBGDX控制器支持,以下是详细信息。
假设我正在遵循此处的教程:http://obviam.net/index.php/getting-started-in-android-game-development-with-libgdx-create-a-working-prototype-in-a-day-tutorial-part-1/ 该教程第四部分的Git(我正在尝试实现游戏手柄)在此处:https://github.com/obviam/star-assault/tree/part4 我已经完成了最后一步,现在可以使用键盘与角色交互。我想现在通过OUYA或USB使角色可由控制器控制。
我已阅读以下内容:http://www.badlogicgames.com/wordpress/?p=2724 我已将jar文件添加到主项目并进行了排序和导出。 现在我已修改了GameScreen类,如下所示:
import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.PovDirection;
import com.badlogic.gdx.controllers.mappings.Ouya;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.math.Vector3;


public class GameScreen implements Screen, InputProcessor, ControllerListener {

private World           world;
private WorldRenderer   renderer;
private CharacterController charactercontroller;

private int width, height;

@Override
public void show() {
    world = new World();
    renderer = new WorldRenderer(world, false);
    charactercontroller = new CharacterController(world);
    Gdx.input.setInputProcessor(this);
}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    charactercontroller.update(delta);
    renderer.render();
}

@Override
public void resize(int width, int height) {
    renderer.setSize(width, height);
    this.width = width;
    this.height = height;
}

@Override
public void hide() {
    Gdx.input.setInputProcessor(null);
}

@Override
public void pause() {
    // TODO Auto-generated method stub
}

@Override
public void resume() {
    // TODO Auto-generated method stub
}

@Override
public void dispose() {
    Gdx.input.setInputProcessor(null);
}

// * InputProcessor methods ***************************//

@Override
public boolean keyDown(int keycode) {
    if (keycode == Keys.LEFT)
        charactercontroller.leftPressed();
    if (keycode == Keys.RIGHT)
        charactercntroller.rightPressed();
    if (keycode == Keys.UP)
        charactercontroller.jumpPressed();
    return true;
}

@Override
public boolean keyUp(int keycode) {
    if (keycode == Keys.LEFT)
        charactercontroller.leftReleased();
    if (keycode == Keys.RIGHT)
        charactercontroller.rightReleased();
    if (keycode == Keys.UP)
        charactercontroller.jumpReleased();
    return true;
}

@Override
public boolean keyTyped(char character) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean touchDown(int x, int y, int pointer, int button) {
    if (!Gdx.app.getType().equals(ApplicationType.Android))
        return false;
    if (x < width / 2 && y > height / 2) {
        charactercontroller.leftPressed();
    }
    if (x > width / 2 && y > height / 2) {
        charactercontroller.rightPressed();
    }
    return true;
}

@Override
public boolean touchUp(int x, int y, int pointer, int button) {
    if (!Gdx.app.getType().equals(ApplicationType.Android))
        return false;
    if (x < width / 2 && y > height / 2) {
        charactercontroller.leftReleased();
    }
    if (x > width / 2 && y > height / 2) {
        charactercontroller.rightReleased();
    }
    return true;
}

@Override
public boolean touchDragged(int x, int y, int pointer) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean mouseMoved(int screenX, int screenY) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean scrolled(int amount) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void connected(Controller controller) {
    // TODO Auto-generated method stub

}

@Override
public void disconnected(Controller controller) {
    // TODO Auto-generated method stub

}

@Override
public boolean buttonDown(Controller controller, int buttonCode) {
    if (buttonCode == Ouya.BUTTON_O) {
                charactercontroller.jumpPressed();
            }
    return false;
}

@Override
public boolean buttonUp(Controller controller, int buttonCode) {
    if (buttonCode == Ouya.BUTTON_O) {
                charactercontroller.jumpReleased();
            }
    return false;
}

@Override
public boolean axisMoved(Controller controller, int axisCode, float value) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean povMoved(Controller controller, int povCode,
        PovDirection value) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean xSliderMoved(Controller controller, int sliderCode,
        boolean value) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean ySliderMoved(Controller controller, int sliderCode,
        boolean value) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean accelerometerMoved(Controller controller,
        int accelerometerCode, Vector3 value) {
    // TODO Auto-generated method stub
    return false;
}

}

根据我的理解,现在当我在OUYA上加载这个内容时,当按下“O”按钮时,角色应该会跳跃。但是什么也没有发生。我想我漏掉了什么东西。实现中是否有任何明显的错误?
在Java方面,我一直从事Web开发多年,最近又重新回到Java领域,开始尝试在微型游戏机上制作游戏和交互式内容。我认为从一个简单的教程开始,并进行实验构建是一个好主意,对吧?
期待得到一些很棒的帮助!
谢谢,
Phil

在连接/断开方法和buttonDown方法中添加一些日志,以查看它们是否被调用。(我认为在某些平台上,buttonCodes可能有点不稳定。) - P.T.
好的!我尝试将我的OUYA手柄与我的安卓平板配对,并通过日志记录进行测试,但每当我按下一个按钮时,应用程序就会完全退出。我需要在几个小时后回家后在OUYA上进行测试。 - Phil Royer
@P.T. 我在连接方法和按钮上/下方法中都添加了System.out.println,但没有任何反应。还有其他想法吗?我需要在我的gameScreen类中创建控制器监听器或其他东西吗? - Phil Royer
我突然想到:这个需要夜间构建才能工作吗? - Phil Royer
1个回答

5

尝试添加以下内容:

Controllers.addListener(this);

在此之前:

Gdx.input.setInputProcessor(this);

setInputProcessor 只注册内置输入事件(键、触摸事件等)的监听器。控制器是一个外部库,需要单独初始化和加载。

您还需要导入 com.badlogic.gdx.controllers.Controllers


太棒了!谢谢你!我还在复习Java,所以我能看到我之前是怎么错过这个的!你真是我的救星! - Phil Royer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接