- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用箭头键或通过 Controller 上的方向键使我的菜单可导航。到目前为止,我运气不好。
问题是:有人可以指导我如何使我的当前菜单或任何 libgdx 菜单键盘可访问吗?
我对某些东西有点菜鸟,而且我有 Javascript 背景。
这是我正在尝试做的一个例子:
http://dl.dropboxusercontent.com/u/39448/webgl/qb/qb.html
对于一个简单的菜单,你可以只添加几个按钮,它开箱即用,使用这个:
http://www.sadafnoor.com/blog/how-to-create-simple-menu-in-libgdx/
或者您可以使用我的代码,但我使用了很多自定义样式。
这是我的代码示例:
import aurelienribon.tweenengine.Timeline;
import aurelienribon.tweenengine.Tween;
import aurelienribon.tweenengine.TweenManager;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.Align;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.project.game.tween.ActorAccessor;
public class MainMenu implements Screen {
private SpriteBatch batch;
private Sprite menuBG;
private Stage stage;
private TextureAtlas atlas;
private Skin skin;
private Table table;
private TweenManager tweenManager;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
menuBG.draw(batch);
batch.end();
//table.debug();
stage.act(delta);
stage.draw();
//Table.drawDebug(stage);
tweenManager.update(delta);
}
@Override
public void resize(int width, int height) {
menuBG.setSize(width, height);
stage.setViewport(width, height, false);
table.invalidateHierarchy();
}
@Override
public void resume() {
}
@Override
public void show() {
stage = new Stage();
Gdx.input.setInputProcessor(stage);
batch = new SpriteBatch();
atlas = new TextureAtlas("ui/atlas.pack");
skin = new Skin(Gdx.files.internal("ui/menuSkin.json"), atlas);
table = new Table(skin);
table.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
// Set Background
Texture menuBackgroundTexture = new Texture("images/mainMenuBackground.png");
menuBG = new Sprite(menuBackgroundTexture);
menuBG.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
// Create Main Menu Buttons
// Button Play
TextButton buttonPlay = new TextButton("START", skin, "inactive");
buttonPlay.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
((Game) Gdx.app.getApplicationListener()).setScreen(new LevelMenu());
}
});
buttonPlay.addListener(new InputListener() {
public boolean keyDown (InputEvent event, int keycode) {
System.out.println("down");
return true;
}
});
buttonPlay.padBottom(12);
buttonPlay.padLeft(20);
buttonPlay.getLabel().setAlignment(Align.left);
// Button EXTRAS
TextButton buttonExtras = new TextButton("EXTRAS", skin, "inactive");
buttonExtras.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
((Game) Gdx.app.getApplicationListener()).setScreen(new ExtrasMenu());
}
});
buttonExtras.padBottom(12);
buttonExtras.padLeft(20);
buttonExtras.getLabel().setAlignment(Align.left);
// Button Credits
TextButton buttonCredits = new TextButton("CREDITS", skin, "inactive");
buttonCredits.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
((Game) Gdx.app.getApplicationListener()).setScreen(new Credits());
}
});
buttonCredits.padBottom(12);
buttonCredits.padLeft(20);
buttonCredits.getLabel().setAlignment(Align.left);
// Button Settings
TextButton buttonSettings = new TextButton("SETTINGS", skin, "inactive");
buttonSettings.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
((Game) Gdx.app.getApplicationListener()).setScreen(new Settings());
}
});
buttonSettings.padBottom(12);
buttonSettings.padLeft(20);
buttonSettings.getLabel().setAlignment(Align.left);
// Button Exit
TextButton buttonExit = new TextButton("EXIT", skin, "inactive");
buttonExit.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
Gdx.app.exit();
}
});
buttonExit.padBottom(12);
buttonExit.padLeft(20);
buttonExit.getLabel().setAlignment(Align.left);
// Adding Heading-Buttons to the cue
table.add().width(190);
table.add().width((table.getWidth() / 10) * 3);
table.add().width((table.getWidth() / 10) * 5).height(140).spaceBottom(50);
table.add().width(190).row();
table.add().width(190);
table.add(buttonPlay).spaceBottom(20).width(460).height(110);
table.add().row();
table.add().width(190);
table.add(buttonExtras).spaceBottom(20).width(460).height(110);
table.add().row();
table.add().width(190);
table.add(buttonCredits).spaceBottom(20).width(460).height(110);
table.add().row();
table.add().width(190);
table.add(buttonSettings).spaceBottom(20).width(460).height(110);
table.add().row();
table.add().width(190);
table.add(buttonExit).width(460).height(110);
table.add().row();
stage.addActor(table);
// Animation Settings
tweenManager = new TweenManager();
Tween.registerAccessor(Actor.class, new ActorAccessor());
// Heading and Buttons Fade In
Timeline.createSequence().beginSequence()
.push(Tween.set(buttonPlay, ActorAccessor.ALPHA).target(0))
.push(Tween.set(buttonExtras, ActorAccessor.ALPHA).target(0))
.push(Tween.set(buttonCredits, ActorAccessor.ALPHA).target(0))
.push(Tween.set(buttonSettings, ActorAccessor.ALPHA).target(0))
.push(Tween.set(buttonExit, ActorAccessor.ALPHA).target(0))
.push(Tween.to(buttonPlay, ActorAccessor.ALPHA, .5f).target(1))
.push(Tween.to(buttonExtras, ActorAccessor.ALPHA, .5f).target(1))
.push(Tween.to(buttonCredits, ActorAccessor.ALPHA, .5f).target(1))
.push(Tween.to(buttonSettings, ActorAccessor.ALPHA, .5f).target(1))
.push(Tween.to(buttonExit, ActorAccessor.ALPHA, .5f).target(1))
.end().start(tweenManager);
tweenManager.update(Gdx.graphics.getDeltaTime());
}
public static Vector2 getStageLocation(Actor actor) {
return actor.localToStageCoordinates(new Vector2(0, 0));
}
@Override
public void dispose() {
stage.dispose();
atlas.dispose();
skin.dispose();
menuBG.getTexture().dispose();
}
@Override
public void hide() {
dispose();
}
@Override
public void pause() {
}
}
最佳答案
这是我自己想出来的!
我制作了一个 ControllerListener 来模拟 Scene2D 按钮期望的鼠标输入事件。至于使用箭头键控制它们,您可以轻松地将相同的方法应用于处理它们各自的键事件的新 InputProccessor。
public class MenuControllerListener implements ControllerListener {
private final Group buttonGroup;
private int currentButtonIndex = 0;
public MenuControllerListener(Group buttonGroup) {
this.buttonGroup = buttonGroup;
}
@Override public void connected(Controller controller) { }
@Override public void disconnected(Controller controller) { }
@Override
public boolean buttonDown(Controller controller, int buttonCode) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){
switch(buttonCode) {
case Xbox360Pad.BUTTON_A:
Actor currentButton = buttonGroup.getChildren().get(currentButtonIndex);
return clickButton(currentButton);
}
}
return false;
}
@Override
public boolean buttonUp(Controller controller, int buttonCode) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){
switch(buttonCode) {
case Xbox360Pad.BUTTON_A:
Actor currentButton = buttonGroup.getChildren().get(currentButtonIndex);
return releaseButton(currentButton);
}
}
return false;
}
/**
* Simulate button click down.
* @param button
* @return
*/
private boolean clickButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchDown);
event.setButton(Input.Buttons.LEFT);
button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}
/**
* Simulate button click release.
* @param button
* @return
*/
private boolean releaseButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchUp);
event.setButton(Input.Buttons.LEFT);
button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}
@Override
public boolean axisMoved(Controller controller, int axisCode, float value) { return false; }
@Override
public boolean povMoved(Controller controller, int povCode, PovDirection value) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){
unselectButton(buttonGroup.getChildren().get(currentButtonIndex));
switch(value) {
case north:
case west:
currentButtonIndex--;
break;
case south:
case east:
currentButtonIndex++;
break;
default:
break;
}
currentButtonIndex = currentButtonIndex % buttonGroup.getChildren().size;
if(currentButtonIndex < 0) currentButtonIndex = buttonGroup.getChildren().size - 1;
return selectButton(buttonGroup.getChildren().get(currentButtonIndex));
}
return false;
}
/**
* Simulate mousing over a button.
* @param button
* @return
*/
private boolean selectButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.enter);
button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}
/**
* Simulate mousing off of a button.
* @param button
* @return
*/
private boolean unselectButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.exit);
button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}
@Override public boolean xSliderMoved(Controller controller, int sliderCode, boolean value) { return false; }
@Override public boolean ySliderMoved(Controller controller, int sliderCode, boolean value) { return false; }
@Override public boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value) { return false; }
}
这需要您将按钮添加到表格中,示例使用:
TextButton.TextButtonStyle buttonStyle = new TextButton.TextButtonStyle();
buttonStyle.font = new BitmapFont();
buttonStyle.font.scale(2f);
buttonStyle.fontColor = Color.WHITE;
buttonStyle.overFontColor = Color.LIGHT_GRAY;
buttonStyle.downFontColor = Color.GRAY;
newGameButton = new TextButton("New Game", buttonStyle);
continueButton = new TextButton("Continue", buttonStyle);
optionsButton = new TextButton("Options", buttonStyle);
exitButton = new TextButton("Exit", buttonStyle);
Table buttonGroup = new Table();
buttonGroup.setFillParent(true);
buttonGroup.align(Align.center);
buttonGroup.add(newGameButton);
buttonGroup.row();
buttonGroup.add(continueButton);
buttonGroup.row();
buttonGroup.add(optionsButton);
buttonGroup.row();
buttonGroup.add(exitButton);
stage.addActor(buttonGroup);
Controllers.addListener(new MenuControllerListener(buttonWrapper));
关于java - 使用箭头键或 Controller 导航 MainMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19620135/
我有一个 PSD 布局要开发,还有一些东西,比如“卡片”,我很好奇我是否可以在没有图像的情况下只使用 CSS3 边框来做到这一点。 http://i.imgur.com/NSZYPsh.png (这些
我想添加一个轻量级的导航栏来切换登录和注册。结果应如下所示: 箭头应指示当前所选页面。 最佳答案 引用这个question ,问题中的 UI 与您的相似,并且可以根据您的需要调整答案中使用的概念。 关
我想创建一个元组,它包含一个箭头和一个描述箭头的字符串。如果我使用函数(而不是箭头)这样做,则以下工作如预期: funTimes10 = (*10) describe10 = "times 10" t
var std_obj = { activeEffect : 'fade', name : 'Jane', displayMe() { const doSomeEffects =
我有一个使用TActionToolBar和TActionManager的工具栏。一个按钮具有子按钮,这些子按钮可通过单击按钮右侧的向下小箭头来使用。 “向下箭头”按钮的宽度非常薄,需要精确的鼠标控制。
我正在使用 Javascript 进行流网络可视化。顶点表示为圆圈,边表示为箭头。 这是我的 Edge 类: function Edge(u, v) { this.u = u; // start
这个问题已经有答案了: Show border triangle in navbar using CSS (3 个回答) 已关闭 7 年前。 我有一个列表菜单,其边框宽度为 1px ...100%。
有什么方法可以从 javafx 2.2 表列中的排序表列中删除排序指示符/箭头吗? 最佳答案 这可以通过 css 来完成 .table-view .arrow { -fx-background
在我的应用程序中,我使用了 googlemap。在那,我在一个特定的位置放置了一个物体(自行车或汽车)。然后我搬到了其他地方。现在,根据我当前的位置,我需要显示一个箭头(校园),即我放置汽车或自行车的
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
我一直在 goole 中搜索如何仅使用 css 创建箭头和框。我在这里找到了一个近乎完美的例子:- http://dabblet.com/gist/4639593 如何更改此代码,使箭头指向左而不是右
嗨,我正在为这个问题挠头。我想创建一个如图所示的 CSS 渐变箭头,并能够将红色部分的填充定义为百分比。红色 block 只是纯色。 从这里JFiddle示例 我在创建绿色箭头方面取得了一些进展,但三
我刚刚开始在 Android 中创建一些自定义 View ,但在圆外绘制位图(箭头)时遇到问题。 这是我的代码: Canvas osCanvas = new Canvas(windowFrame);
我正在尝试绘制一个具有渐变的左侧箭头。这是我正在使用的代码,但我不明白为什么它不起作用。 .left-arrow{ position: relative; &:after{ rig
是否可以使用 GD 在 PHP 中创建此图像?我知道我需要使用 GD 和 imagecreate、imagecolorallocate、imagedestroy 等...但我不知道如何做曲线 我需要用
我在我的区域 map 中有一个我正在使用的工具台 http://qtip2.com/ 我调用工具提示时的代码与这个问题中的相同Tooltip on map area tag jQuery(docume
我正在尝试在 Haskell 中学习 Arrows,所以我正在使用基于箭头的 HXT 库为 XML 编写一个简单的应用程序。 HXT wiki 和教程中的示例放弃了函数类型签名。但是,我非常喜欢类型,
我一直在使用 Haskell(特别是 Yampa)中的 Arrowized FRP 库,但我不太清楚如何进行“连续”切换。我的意思是信号通过信号函数(下面的 sf),它本身就是一个信号(如图像的上半部
我想要一个引用,清楚地说明 PHP 的箭头/方法调用运算符 (->) 在运算符绑定(bind)顺序方面的位置。 不幸的是,authoritative PHP manual page关于运算符优先级没有
如何隐藏 QScrollBar 箭头? 我需要隐藏在水平滚动条中。 我试图用 setStyleSheet 隐藏: setStyleSheet(" QScrollBar:left-arrow:horiz
我是一名优秀的程序员,十分优秀!