#java #libgdx #dialog
#java #libgdx #диалоговое окно
Вопрос:
Пожалуйста, обратите внимание, что это не является полным, это просто базовая структура, чтобы показать, как все работает.
Я работаю над игрой; где вместо использования разных экранов вместо этого используются сцены. Структуру игрового кода смотрите ниже.
Как добавить игровые кнопки с текущим кодом:
Мне нужно просто добавить изображения в sceneTop и проверить, находится ли мышь в пределах определенного прямоугольника, если для нажатия кнопки требуется какое-то волшебство рендеринга. Пока все в порядке.
Проблема:
Я хочу добавить диалоговое окно, но оно работает некорректно. Он не только не отображает кнопки / текст диалогового окна, но и когда вы устанавливаете InputProcessor на сцену, содержащую диалоговое окно, область нажатия отключена (я предполагаю, что это связано с тем, что разные сцены являются многоуровневыми). Если я добавлю диалоговое окно в основной класс игры и в основном удалю строки, отображающие сцены, он работает отлично.
Альтернативный вариант:
Вместо этого я создал таблицу с полем выбора и добавил ее с помощью пакетного метода. Это показывает поле выбора, но не является интерактивным.
В классе MenuComponent я хочу реализовать либо диалоговое окно, либо таблицу. По сути, я хочу, чтобы всплывающее окно с полем выбора что-то меняло в игре.
Main Game: // being initialized in main method of another class that setups the main window
public class Game extends ApplicationAdapter
public void create () {
context = new GameContext(this);
context.create();
}
public void render () {
for (GameScene scene : context.getScenes()) {
scene.update();
scene.render();
}
}
GameContext class:
public void create() {
this.connectScene = new ConnectScene(this); //basically a log in screen
connectScene.create();
}
public void createScenes() { // called when login button is pressed
this.input = new GameInputProcessor(this); //sets this inputProcessor in a later method
this.sceneTop = new sceneTop(this);
sceneTop.create();
this.sceneBottom= new sceneBottom(this);
sceneBottom.create();
//fix crash on server disconnect after dispose has been called
if(sceneList.size() == 0) {
sceneList.add(sceneBottom);
sceneList.add(sceneTop );
}else {
sceneList.set(0, sceneBottom);
sceneList.set(1, sceneTop );
}
}
public class GameInputProcessor implements InputProcessor {
public GameInputProcessor(GameContext context) {
this.context = context;
Gdx.input.setInputProcessor(this);
}
@Override
public boolean keyDown(int keycode) {
}
@Override
public boolean keyUp(int keycode) {
}
@Override
public boolean keyTyped(char character) {
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
for (GameScene scene : context.getScenes()) {
if (scene.handleClick(screenX, screenY, button)) {
break;
}
}
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
for (GameScene scene : context.getScenes()) {
if (scene.handleClickRelease(screenX, screenY, button)) {
break;
}
}
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
float x = Gdx.input.getDeltaX();
float y = Gdx.input.getDeltaY();
for (GameScene scene : context.getScenes()) {
if (scene.handleDrag(screenX, screenY, x, y)) {
break;
}
}
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
for (GameScene scene : context.getScenes()) {
if (scene.handleMouseMove(screenX, screenY)) {
break;
}
}
return false;
}
@Override
public boolean scrolled(int amount) {
}
sceneTop class
public class sceneTop implements GameScene {
private GameContext context;
public void create() {
//does its own create stuff for that specific scene (player stuff)
mainmenu = new MenuComponent(context);
}
public void render(){
//do other render stuff before with spritebatch
mainmenu.render();
}
sceneBottom class
public class sceneBottom implements GameScene {
private GameContext context;
public void create() {
//does its own create stuff for that specific scene (control/inventory stuff)
}
GameScene class:
public interface GameScene {
void create();
void update();
void render();
void dispose();
boolean handleDrag(float screenX, float screenY, float diffX, float diffY);
boolean handleClick(float x, float y, int button);
boolean handleMouseMove(float x, float y);
boolean handleClickRelease(float x, float y, int button);
}
Menu class:
public class MenuComponent extends SceneComponent<sceneTop> implements InputProcessor {
//public abstract class SceneComponent<T extends GameScene> // <--- SceneComponent class
public void create() {
Skin skin = new Skin(Gdx.files.internal("uiskin.json"));
table = new Table();
orthoCamera = new OrthographicCamera();
selectBox=new SelectBox<String>(skin);
selectBox.setSize(100, 100);
selectBox.setPosition(10, 10);
selectBox.setItems("XYZ","ABC","PQR","LMN");
table.add(selectBox);
table.setPosition(300, 100);
stage.addActor(table);
}
public void render(){
table.draw( batch, 1f );
}
}
Комментарии:
1. Возможно, вам следует заглянуть в пакет scene2d.ui, который должен вам очень помочь.
2. @MrStahlfelge Как бы это помогло мне? Я также использовал таблицу из пакета, но область нажатия полностью отключена.
3. Вам помогло бы то, что многие коды предопределены и, как известно, работают.