2015-07-14 5 views
0

У меня есть плиточная карта, на которой я устанавливаю символы (каждый символ имеет размер одной плитки). Мне удалось сделать их доступными для кликов, даже когда экран изменяет размер, все работает идеально. Каждый раз, когда я нажимаю на символ, я хочу, чтобы над ним появилась кнопка. Для кнопки я использую сцену и размещаю кнопку в том месте, где я нажал с небольшим переходом, и он также работает.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

Я хотел бы предложить, чтобы прочитать больше о повторной калибровке и отображении пикселей.

Вам нужно пересчитывать пиксели всегда, когда вы что-то визуализируете. - игрок, фоновое изображение, кнопки, события.

На самом деле вам не нужно использовать метод изменения размера, просто получите ширину и высоту камеры.

Вам нужно разделить больше кода, потому что это зависит от всего. Я не вижу, как вы делаете рендеринг.

  • tiledMapRenderer.render(), background rendering/layers?
  • плеер рендеринга?
  • меню рендеринга?
    • кнопки рендеринга?

Пример: (то же самое должно быть для обработчика событий)

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

    }