Libgdx - 输入处理 [Android]。关于听众,我有什么不明白的?
Libgdx - Input Processing [Android]. What am I not getting about Listeners?
我研究过许多不同的方法来处理 android 的输入,但我真的无法理解它。我想知道我提供给您的代码,有人可以向我解释如何将这两种方法集成到我的代码中吗?为什么这样做是合适的?
首先,我将解释我的意图,并向您展示相关代码的快速概览。我想移动我的角色,向左、向右和跳跃(暂时)。这是我的第一款游戏,它是一款没有自动跳跃功能的肖像游戏(在渲染方面与 Doodle Jump 有点相似)。我的关卡是随机生成的,它会渲染所有对象。现在我想添加输入,但对我来说主要的困惑是我应该把代码放在代码的什么地方?
首先,我有一个GameObject
class和一个子classDynamicGameObject
,这是所有对象的super
class世界内部(平台、道具、金币、玩家、敌人等)
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);
}
动态GameObject.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;
}
}
然后我有了主要的游戏对象,其中将根据我要执行的操作进行移动。在这个 class 中,我会进行任何输入处理吗?
鲁本。 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;
}
然后我有世界 class 将更新游戏中的所有内容,相关的更新方法将是更新 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);
}
所以现在我希望你能了解我正在处理的演员的一般背景,我应该在哪里放置手势侦听器回调?我要把它放进鲁本吗?还是我完全创建一个单独的 class?我已经尝试了很多不同的方法,但我并没有真正取得任何进展,这有点令人沮丧。输入处理程序在哪里处理手势?我尝试将带有新手势侦听器的手势检测器的回调放入 Ruben
的构造函数中
(GestureDetector gd = new GestureDetector(new GestureHandler(this));
然后在屏幕上用一个变量表示一个fling已经被向上引导,当boolean trigger为真时,设置ruben的状态为跳跃并改变y轴上的速度。它仍然没有用。有人可以帮忙吗?
如果您还需要什么,请告诉我。
主游戏class
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();
}
}
如果你想像libGdx中的GestureDetector
一样使用InputAdapter
,你必须设置它,不知道你是否这样做,否则没有任何从 GestureDetector
调用的方法。希望这是主要问题。 GestureDetector LibGdx Wiki
Gdx.input.setInputProcessor(new GestureDetector(new GestureHandler(this)));
此外,如果您想使用多个 InputAdapter,则必须使用 InputMultiplexer
,特别是如果您还想为 GUI 事物使用 Stage。 Event Handling LibGdx Wiki
InputMultiplexer inputMultiplexer = new InputMultiplexer();
inputMultiplexer.addProcessor(stage);
inputMultiplexer.addProcessor(new GestureDetector(new GestureHandler(this)));
Gdx.input.setInputProcessor(inputMultiplexer);
编辑:
我用屏幕实现它的首选方法是 MainMenuScreen extends Screen implements GestureDetector.GestureListener
并且在 show()
方法中 Gdx.input.setInputProcessor(new GestureDetector(this));
然后您还可以轻松访问要从方法控制的对象。
我研究过许多不同的方法来处理 android 的输入,但我真的无法理解它。我想知道我提供给您的代码,有人可以向我解释如何将这两种方法集成到我的代码中吗?为什么这样做是合适的?
首先,我将解释我的意图,并向您展示相关代码的快速概览。我想移动我的角色,向左、向右和跳跃(暂时)。这是我的第一款游戏,它是一款没有自动跳跃功能的肖像游戏(在渲染方面与 Doodle Jump 有点相似)。我的关卡是随机生成的,它会渲染所有对象。现在我想添加输入,但对我来说主要的困惑是我应该把代码放在代码的什么地方?
首先,我有一个GameObject
class和一个子classDynamicGameObject
,这是所有对象的super
class世界内部(平台、道具、金币、玩家、敌人等)
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);
}
动态GameObject.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;
}
}
然后我有了主要的游戏对象,其中将根据我要执行的操作进行移动。在这个 class 中,我会进行任何输入处理吗?
鲁本。 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;
}
然后我有世界 class 将更新游戏中的所有内容,相关的更新方法将是更新 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);
}
所以现在我希望你能了解我正在处理的演员的一般背景,我应该在哪里放置手势侦听器回调?我要把它放进鲁本吗?还是我完全创建一个单独的 class?我已经尝试了很多不同的方法,但我并没有真正取得任何进展,这有点令人沮丧。输入处理程序在哪里处理手势?我尝试将带有新手势侦听器的手势检测器的回调放入 Ruben
的构造函数中(GestureDetector gd = new GestureDetector(new GestureHandler(this));
然后在屏幕上用一个变量表示一个fling已经被向上引导,当boolean trigger为真时,设置ruben的状态为跳跃并改变y轴上的速度。它仍然没有用。有人可以帮忙吗?
如果您还需要什么,请告诉我。
主游戏class
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();
}
}
如果你想像libGdx中的GestureDetector
一样使用InputAdapter
,你必须设置它,不知道你是否这样做,否则没有任何从 GestureDetector
调用的方法。希望这是主要问题。 GestureDetector LibGdx Wiki
Gdx.input.setInputProcessor(new GestureDetector(new GestureHandler(this)));
此外,如果您想使用多个 InputAdapter,则必须使用 InputMultiplexer
,特别是如果您还想为 GUI 事物使用 Stage。 Event Handling LibGdx Wiki
InputMultiplexer inputMultiplexer = new InputMultiplexer();
inputMultiplexer.addProcessor(stage);
inputMultiplexer.addProcessor(new GestureDetector(new GestureHandler(this)));
Gdx.input.setInputProcessor(inputMultiplexer);
编辑:
我用屏幕实现它的首选方法是 MainMenuScreen extends Screen implements GestureDetector.GestureListener
并且在 show()
方法中 Gdx.input.setInputProcessor(new GestureDetector(this));
然后您还可以轻松访问要从方法控制的对象。