2014-10-31 3 views
0

자바에서 아이소 메트릭 게임을 프로그래밍하고 있지만 마우스를 가리키는 타일을 가져오고 싶을 때 붙어 있습니다.자바 다이아몬드 모양 아이소 메트릭 맵 타일 선택

계산 방법은 있습니까? 여기

이것은 결과입니다

int posX = 10; 
int posY = 0;  
static int beginY = 500-72; 
static int beginX = 800-36; 
static int newLineY = 60; 
static int newLineX = 200;  

posY = ((0+1)*9)-9+beginY/2; 
posX = ((beginX)/2)+18-(18*(0+1)); 

for (int y = 0; y <= world.length-1; y++) { 
    for (int x = 0; x <= world[y].length-1; x++) { 
     if (world[y][x] == 1) { 
      g.drawImage(grass, posX, posY, null); 
      posX += 18; 
      posY += 9; 
     } else if (world[y][x] == 2) { 
      g.drawImage(wall, posX, posY-38, null); 
      posX += 18; 
      posY += 9; 
     } else if (world[y][x] == 3) { 
      g.drawImage(stone, posX, posY, null); 
      posX += 18; 
      posY += 9; 
     } else if (world[y][x] == 4) { 
      g.drawImage(water, posX, posY, null); 
      posX += 18; 
      posY += 9; 
     } else { 
      posX += 18; 
      posY += 9; 
     } 
     if ((y-pPosX) * (y-pPosX) + (x-pPosY) * (x-pPosY) <= 3*3 && world[y][x] != 0 && world[y][x] != 2 && world[y][x] != 4) { 
      g.drawImage(hollow, posX-18, posY-9, null); 
     } 
     if (y == selectedX && x == selectedY) { 
      g.drawImage(selected, posX-18, posY-9, null); 
     } 
     if (world2[y][x] == 9) { 
      g.drawImage(character, posX-18, posY-53, null); 
     } 
    } 
    posY = ((y+1)*9)+beginY/2; 
    posX = ((beginX)/2)-(18*(y+1)); 
} 

을 렌더링하는 코드입니다. beginX 다이아몬드의 상단 모서리에 beginY 시작 : 여기

isometric tile map

+0

정보가 충분하지 않습니다. 명확히하십시오. 예를 들어 엔진, 일부 openGL 구현 또는 스윙 기반 GUI (Canvas 사용)를 사용하고 있습니까? 코드를 추가 할 수 있다면 가장 좋을 것입니다. 어떻게 타일을로드합니까? 이미지입니까, 직접 페인트합니까? – GameDroids

+0

나는 엔진이나 OpenGL을 사용하지 않고 JFrame 만 사용한다. – mcdorli

+0

나는 Buffered Image를 생성하고 그 이미지의 경로를 정의한다. 코드를 삽입합니다. – mcdorli

답변

0

이 패널 (당신이 당신을 그릴하려는 패널에의 MouseListener를 등록 렌더링 코드입니다 타일). 이제 렌더링 코드에 따라 각 타일이 시작하는 실제적으로 "know"이 표시됩니다. 따라서 클릭 한 타일을 계산하는 것뿐입니다.

JPanel gamePanel = new JPanel(); 
gamePanel.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent event) { 
     int x=event.getX(); 
     int y=event.getY(); 
     System.out.println("clicked at ("+x+","+y+")"); //these co-ords are relative to the your gamePanel   
    } 
}); 

편집 : 나는 위의 코드로 변경

, 그것은 정확하지 않았다. 그러나 당신이 그것을 알아낼 것이라고 확신합니다. 위의 코드는 패널/프레임에 MouseListener을 추가하는 방법을 보여줍니다. 작동하는 경우 콘솔에서 클릭하는 위치를 볼 수 있어야합니다.

지금 당신은 단지 클릭 한 타일 계산해야 :

(x,y) --> + - - - 
      ' /\ 
      '/ \ 
      '/  \ 
      \  /
      \ /
       \/  + <-- (x+36, y+18) 

마우스 포인터 어딘가에 두 지점 (x,y)(x+36, y+18) 사이에 있어야합니다. 물론 다른 누군가가 (x, y)와 (y + 36, y + 18) 사이를 클릭 할 수 있지만 여전히 타일을 클릭하지는 못합니다 (누군가가 타일 왼쪽 상단을 클릭 할 수 있음) 어떤 타일을 선택할지 결정해야 할 수도 있습니다.

또 다른 방법은 패널을 정사각형 패널로 나누는 것입니다. 그러나 당연히 당기지 않고. 각 타일의 중간에 정사각형이있을 수 있다고 상상해보십시오.

   /\ 
      /____\ 
     /| | \ 
      \ |____|/
      \ /
       \/  

그런 식으로 생각해보세요. 따라서 누군가가 사각형 내부를 클릭했는지 계산할 필요가 있습니다.

+0

아니요, 각 타일의 폭은 36 픽셀이고 높이는 18 픽셀이며 등각 투영이므로 모든 타일은 다이아몬드 모양입니다. 다음은 사진입니다 : http://i.stack.imgur.com/mRul8.png – mcdorli

+0

그리고 내 프로젝트는 다음과 같습니다. http://imgur.com/zfUi1eH, beginX 및 beginY는 다이아몬드 상단에 있습니다. – mcdorli

+0

@ Bálint, 질문을 편집하고 게시 한 코드를 추가하고 이미지를 포함 시켰습니다. 질문에 정보를 추가하려면 게시물의 수정 버튼을 사용하십시오.이제 당신의 문제에 대해 (좋은 게임). 내가 의미 한 것은, 당신이 타일의 위치를 ​​계산한다는 것입니다. 그래서 당신이 그것을 계산하는 것과 같은 방식으로, 마우스가 클릭하는 타일을 실제로 계산할 수 있습니다. – GameDroids

0

먼저

int posX = 10; 
int posY = 0;  
static int beginY = 500-72; 
static int beginX = 800-36; 
static int newLineY = 60; 
static int newLineX = 200;  

posY = ((0+1)*9)-9+beginY/2; 
posX = ((beginX)/2)+18-(18*(0+1)); 
for (int y = 0; y <= world.length-1; y++) { 
for (int x = 0; x <= world[y].length-1; x++) { 
    if (world[y][x] == 1) { 
     g.drawImage(grass, posX, posY, null); 
     posX += 18; 
     posY += 9; 
    } else if (world[y][x] == 2) { 
     g.drawImage(wall, posX, posY-38, null); 
     posX += 18; 
     posY += 9; 
    } else if (world[y][x] == 3) { 
     g.drawImage(stone, posX, posY, null); 
     posX += 18; 
     posY += 9; 
    } else if (world[y][x] == 4) { 
     g.drawImage(water, posX, posY, null); 
     posX += 18; 
     posY += 9; 
    } else { 
     posX += 18; 
     posY += 9; 
    } 
    if ((y-pPosX) * (y-pPosX) + (x-pPosY) * (x-pPosY) <= 3*3 && world[y][x] != 0 && world[y][x] != 2 && world[y][x] != 4) { 
     g.drawImage(hollow, posX-18, posY-9, null); 
    } 
    if (y == selectedX && x == selectedY) { 
     g.drawImage(selected, posX-18, posY-9, null); 
    } 
    if (world2[y][x] == 9) { 
     g.drawImage(character, posX-18, posY-53, null); 
    } 
} 
posY = ((y+1)*9)+beginY/2; 
posX = ((beginX)/2)-(18*(y+1)); 
} 
관련 문제