У меня есть плиточная карта, на которой я устанавливаю символы (каждый символ имеет размер одной плитки). Мне удалось сделать их доступными для кликов, даже когда экран изменяет размер, все работает идеально. Каждый раз, когда я нажимаю на символ, я хочу, чтобы над ним появилась кнопка. Для кнопки я использую сцену и размещаю кнопку в том месте, где я нажал с небольшим переходом, и он также работает.Clicklistener - разные координаты при изменении размера
Моя проблема в том, что я пытаюсь использовать clicklistener на этой кнопке. Если экран не изменяется, работает кликлайнер. Проблема начинается с изменения размера экрана - клики на игроков хорошо работают, только кнопка не работает - после изменения размера пространства щелчка и пространства кнопок не выровнены. В целях тестирования я сделал тестовую карту, которая показывает мне сетки. Кажется, что эта стадия не изменяется должным образом. Picture для справки. Я пробовал много решений, которые я встречал в Интернете, и до сих пор не могу найти решение моей проблемы. Я сократил свой код до минимального базового примера:
public class Test extends ApplicationAdapter {
public static Stage stage;
public TiledMap tiledMap;
static OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;
public static boolean showMenu;
GestureDetector gesture;
InputMultiplexer myInputMultiplexer;
public static int posx, posy;
public static Image move;
public Texture moveMenu;
@Override
public void create() {
moveMenu = new Texture(Gdx.files.internal("move.png"));
gesture = new GestureDetector(new MyGestureListener());
myInputMultiplexer = new InputMultiplexer();
float unitScale = 1/32f;
camera = new OrthographicCamera();
camera.setToOrtho(true, 33, 21);
stage = new Stage(new ScreenViewport());
stage.getViewport().setCamera(camera);
tiledMap = new TmxMapLoader().load("test.tmx");
tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, unitScale);
myInputMultiplexer.addProcessor(stage);
myInputMultiplexer.addProcessor(gesture);
Gdx.input.setInputProcessor(myInputMultiplexer);
move = new Image(moveMenu);
move.setWidth(2);
move.setHeight(2);
move.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
move(); //my action, works fine
showMenu = false;
}
});
stage.addActor(move);
}
@Override
public void render() {
super.render();
stage.act();
tiledMapRenderer.setView(camera);
camera.update();
tiledMapRenderer.render();
if (showMenu) {
mainMenuDraw();
}
}
public static void mainMenuDraw() {
move.setPosition(posx, posy-2);
stage.draw();
}
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
public static OrthographicCamera getCamera() {
return camera;
}
public static Vector3 unprojectCoords(Vector3 coords) {
camera.unproject(coords);
return coords;
} }
и часть моего gesturelistener:
public boolean touchDown(float x, float y, int pointer, int button) {
Vector3 temp_coord = new Vector3(x, y, 0);
Vector3 coords = Test.unprojectCoords(temp_coord);
return false;
}
@Override
public boolean tap(float x, float y, int count, int button) {
Vector3 temp_coord = new Vector3(x, y, 0);
Vector3 coords = Test.unprojectCoords(temp_coord);
Test.posx = (int) coords.x;
Test.posy = (int) coords.y;
tap = true;
Test.showMenu = true;
return false;
}