有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Clicklistener在调整大小时使用不同的坐标

我有一个平铺贴图,在上面设置字符(每个字符的大小都是一个平铺)。我设法使它们可以点击,即使当屏幕调整大小时,一切都很完美。每次我点击这个角色,我都想在上面显示一个按钮。对于一个按钮,我使用stage并将按钮放置在我单击的位置,并进行小的转换,它也可以工作

我的问题是当我尝试在这个按钮上使用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;
}   }

我的部分手势听众:

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;
}

共 (1) 个答案

  1. # 1 楼答案

    我建议你阅读更多关于重新调整大小和显示像素的内容

    渲染时,始终需要重新计算像素。 -播放器、背景图像、按钮、事件

    实际上你不需要使用调整大小的方法,只需要得到相机的宽度和高度

    你需要分享更多的代码,因为这取决于一切。 我看不出你在做什么

    • 瓦莱德马普伦德勒。render(),背景渲染/图层
    • 玩家渲染
    • 菜单渲染?
      • 按钮渲染

    示例:(事件处理程序也应如此)

    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)
            }
    
        }