2014-11-20 8 views
1

헥스 타일 맵을 만들었는데 두 가지 기능을 결합하는 데 문제가 있습니다. 1) 마우스/손가락으로 드래그하여지도 스크롤 2) 강조 표시 마우스 오버시 타일LibGdx : 마우스 위치와 선택한 타일 (세계 위치)이 일치하지 않습니다.

내 세계에는 맞춤형 Tile() 개체로 구성된지도가 있습니다. 각 타일에는 x와 y 좌표가 저장됩니다. 게임 클래스에서는 OrthographicCamera와 TileSelector를 사용합니다.이 클래스는 현재 마우스 위치를 가져 와서 해당 좌표 아래의 적절한 타일을 강조 표시합니다. 더 많은 방법으로, 내 render() 메서드는 마우스/손가락이 눌려 졌는지 여부를 확인합니다. 그렇다면 손가락/마우스 버튼을 누른 상태에서 이동 한 거리만큼 각 타일의 위치가 업데이트됩니다.

다음 코드는 관련 부분을 보여줍니다. 지도를 이동하지 않는 한 강조 표시가 작동합니다. 그러나 타일을 이동하자마자 강조 표시가 꺼지기 시작합니다 (이동 한 거리의 양만큼).

//initialiting orthographic camera 
camera = new OrthographicCamera(800, 480); 
camera.setToOrtho(false, 800, 480); 

//draw screen black 
Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

camera.update(); 
game.batch.setProjectionMatrix(camera.combined); 

//drawing to batch 
game.batch.begin(); 

//drawing the tiles, simply getting x,y coords and putting on screen 
world.render(game.batch); 

//highlighting tile under the current mouse/finger coords and drawing highlight on screen 
selector.select(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY(), game.batch, world); 

game.batch.end(); 

//scrolling routine 
if (Gdx.input.isTouched()) { 
     Vector3 touchPos = new Vector3(); 
     touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); 
     camera.unproject(touchPos); 

     deltaX = (float)Gdx.input.getDeltaX(); 
     deltaY = (float)Gdx.input.getDeltaY(); 

     //moving each tile by the distance moved 
     for(int i = 0; i< world.getMap().getWidth(); i++){ 
      for(int j = 0; j< world.getMap().getHeight(); j++){ 
       tile = world.getMap().getTile(i, j); 
       tile.x += deltaX; 
       tile.y -= deltaY; 
       world.getMap().setTile(tile, i, j); 
     } 
    } 
} 

시각화를위한 스크린 샷을 참조하십시오) 타일을 통해

1) 이동하지지도, 마우스 (빨간색 화살표)을하고 http://i.stack.imgur.com/3d7At.png

2 을 강조지도 이동하지만, 기존 위치에 마우스, 아니 타일을 강조 표시해야하지만지도가 이동하지 않은 것처럼 타일이 강조 표시됩니다. http://i.stack.imgur.com/dSibc.png

이제 맵핑이되지 않아 문제가 발생하는 것으로 알고 있습니다. 데이트 화면 및 세계 좌표가 올바르게 조정됩니다. 그러나 LibGdx/OpenGL/projection/translating에 대한 지식이 부족하기 때문에 실수를 정확히 지적 할 수 없습니다. 이 렌더링 알고리즘을 그대로 수정할 수 있습니까? 또는 타일을 옮겨 카메라를 옮기는 방법으로 전환해야합니까 (방법)? 더 많은 코드가 필요하면 알려 주시기 바랍니다. 감사합니다.

+0

빠른 질문 : 게임 창의 전체 너비에 표시되는 클릭하는 세계는 무엇입니까? 그렇지 않다면 당신은 당신의 코디네이트에 그것을 적합하게하는 요소로 곱해야합니다. – AreusAstarte

+0

당신이 무슨 뜻인지 잘 모르겠습니다. 지도는 15x10 타일 크기이며 약 13x10 크기 만 표시됩니다. 움직이지 않으면보기 밖으로 뻗어 나옵니다. 그렇지 않으면 강조 표시가 각 타일에서 매우 정확하게 작동합니다. – Arthur

+0

@Arthur 안녕하세요 당신이하고 싶은 것을 이해하려고했지만 제 영어의 경우 잘 이해하지 못한다고 생각합니다.하지만지도를 옮기거나 움직이기를 원한다면지도를 사용하는 것이 더 좋을 것이라고 생각합니다. 카메라 클래스, 번역 요법이 훨씬 빠릅니다.지도를 옮깁니다. https://github.com/libgdx/libgdx/wiki/Orthographic-camera –

답변

1

좋아요, LibGdx API가 아니라 논리가 문제 였기 때문에 문제를 직접 해결할 수있었습니다. 누군가 다른 사람이 미래에 같은 문제가 생길 경우, 여기서 해결책을 제시 할 것입니다.

처음에는 Angel-Angel의 팁을 따라지도/세계 대신 카메라를 움직이기 시작했습니다. 둘째로, 주요 문제는 사실입니다. 월드 좌표 대신 타일 강조 표시를 위해 마우스/손가락의 화면 좌표를 사용했습니다.

새로운 코드 :

//scrolling routine 
    if (Gdx.input.isTouched()) { 
     //get mouse/finger position in screen coordinates and save in a Vector3 
     touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); 

     //get the distance moved by mouse/finger since last frame and translate camera to that position 
     //(I have no idea yet why the x-axis is flipped) 
     deltaX = (float)Gdx.input.getDeltaX(); 
     deltaY = (float)Gdx.input.getDeltaY(); 
     camera.translate(-deltaX, deltaY, 0); 

     //this is the solution, the coordinates that you use for tile highlighting 
     //are translated to world coordinates 
     touchPos = camera.unproject(touchPos); 
    } 

    //update the camera position and the math that is involved 
    camera.update(); 
    game.batch.setProjectionMatrix(camera.combined); 

    game.batch.begin(); 
    world.render(game.batch); 

    //now the highlighting routine is working with world coordinates 
    selector.select(touchPos.x, touchPos.y, game.batch, world); 
    game.batch.end(); 

나는이 미래에서 도움이되기를 바랍니다. 내가 강조에 적합한 타일을 얼마나 사람이 관심이 있다면,이 스레드에서 가장 높은 평점 대답에 설명 된 방법을 사용하십시오

Hexagonal Grids, how do you find which hexagon a point is in?

행운과 재미를!