我有一个平铺地图,我在其上设置了字符(每个字符的大小都是一个平铺)。我设法让它们可点击,即使屏幕调整大小一切都很完美。每次我点击字符时我都想要一个按钮显示在它上面。对于一个按钮,我使用舞台并将按钮放在我点击过小转换的位置,它也可以使用。
我的问题是当我尝试在此按钮上使用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;
}
答案 0 :(得分:0)
我建议您阅读有关重新调整大小和显示像素的更多信息。
渲染时,您需要始终重新计算像素。 - 播放器,背景图像,按钮,事件。
实际上你不需要使用调整大小的方法,只需要获取相机的宽度和高度。
您需要共享更多代码,因为它取决于所有内容。 我不知道你是如何渲染的。
示例:(同样应该用于事件处理程序)
public GameButton(TextureRegion reg, float x, float y, OrthographicCamera cam) {
this.reg = reg;
this.x = x;
this.y = y;
this.cam = cam;
width = reg.getRegionWidth();
height = reg.getRegionHeight();
vec = new Vector3();
Texture tex = Game.res.getTexture("hud");
font = new TextureRegion[11];
for(int i = 0; i < 11; i++) {
font[i] = new TextureRegion(tex, 32 + i * 9, 16, 9, 9); //use height and width here)
}
}