2011-08-10 1 views
5

저는 Bomberman (제 첫 번째 게임)과 같은 Java에서 2D 타일 기반 게임을 프로그래밍하고 있습니다.배열을 사용하여 2D 타일 기반 게임에서 그래픽 및 논리 위치를 조정하는 방법은 무엇입니까?

2 차원 배열을 사용하여 벽, 걷기 공간 등을 추적하는지도를 나타냅니다. 이제는 플레이어가 방향키에 따라 스프라이트를 부드럽게 움직일 수있게 만들었지 만 배경 /지도, 무작위로 걷고 화면에서 빠져 나올 수 있음).

배열에서 플레이어의 위치를 ​​추적하고 싶을 때 문제가 발생합니다. 논리적으로 문자는 항상 하나의 타일에만 속하지만 그래픽으로는 두 개의 타일 사이에있을 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

는 I 이미 시도 :

currentTileArrayX = X/tileWidth 단계;

currentTileArrayY = y/tileHeight;

여기서 x와 y는 스프라이트의 왼쪽 위 좌표입니다. 하지만 플레이어의 스프라이트가 타일과 크기가 다르기 때문에 모든 것이 매우 버그가 있습니다.

이전 문제를 해결할 수있는 또 다른 옵션이 있습니다. 플레이어가 방향키를 누를 때 캐릭터를 애니메이션처럼 다음 타일로 이동하십시오. 이것은 플레이어가 두 개의 타일의 중간에 멈추게하지는 않을 것입니다 ... 그러나 그가 다른 주요 언론과 함께 중단한다면 어떨까요? 애니메이션 실행 중에 어떻게 사용자의 동작을 멈출 수 있습니까? 나는 이것이 가장 쉬운 해결책이라고 생각하지만 그것을 구현하는 방법을 모른다.

이미 다른 질문에서 해결책을 찾으려고했지만 운이 없었습니다. 네가 나를 도울 수 있기를 바랍니다.

고마워요.

답변

2

aaaaaaaaaaaaaaah! '이산 공간 문제'를 만난다 :) 당신의 논리지도는 이산이지만 UI 움직임은 연속 된 공간에있다.나는 사용자가 동시에 "동시에"두 타일에있을 수는 없다. 시각적으로는 그렇지만 결코 내부적으로는 안된다. 지금 당신은 플레이어의 위치를 ​​점점하고 당신은 IMO,이 문제에 대한 두 가지 솔루션을

... 말하자면 2 개 타일의 "경계의"타일 내에서 "어디서나"수 또는 수 있습니다

  1. 간단한 반올림을 사용하십시오. 플레이어 위치가 < 타일 경계 인 경우 이전 타일로 계속 이동하십시오. 그 다음에 더 큼. 이제 경계의 문제 - 휴리스틱을 사용할 수 있습니다. 부동 소수점 비교의 정확성을 신뢰할 수 없으므로 (0을 비교하는 것이 좋은 방법은 아닙니다). 그래서 다음과 같은 것을 시도해 볼 수 있습니다 if(currentPosition - boundary <= 0.000000001) 다음에 다른 타일이 있다고 가정합니다.
  2. 잘 @ 제이 나를 이길. 따라서 두 번째 것은 실제로 이동 속도가 정의되어 있고 '누르기'/ '버튼 누름'당 많은 단계가있는 문자를 이동하는 것이지만 이 "사이"로 눌러 진 문제가 있다고합니다.
 
    update() 
     { 
      calculate(); //update all datastructures/calculations 
      draw(); //update the visual representation based on calculations 
     } 

update()이 a.k.a gameLoop입니다 : 당신이 코드는 다음이 문제가되지 않습니다이 같이 설계하면 내가 추측하고있어. 이 문제가 해결되어야한다고 생각합니다 ...

+0

Nupul 솔루션 번호 1을 사용하여 코드를 변경했습니다. 덕분에 많은 버그가 해결되었으므로 지금은 거의 작동한다고 말할 수 있습니다. 하지만 아직 한 가지 문제가 있습니다. http://imageshack.us/f/687/bomberbug.png/ 이미지에서 올바르게 설명했으면합니다. – Rama

+0

이미지에서 currentPosition은 여전히 ​​빨간색 타일입니다. 빨간 타일의 오른쪽이 자유 롭기 때문에 나는 오른쪽으로 걸을 수 있지만 그래픽으로는 안됩니다. – Rama

+0

@ 라마 : 당신이 무슨 뜻인지 확실하지 않습니다 ... 오른쪽으로 걸어 갈 수 있다면, "왜 안 되겠습니까?" 둘째로 "그래픽으로"당신은 데이터 구조적으로 당신이 허용되어서는 안된다. 내부 모델은보기를 정확하게 표현해야합니다. 내가 모델에서 바로 갈 수 없다면,보기가 v.v.v.v 소수점 지향적이어서 말하면서 볼 수 있도록해서는 안된다. 내가 제대로 이해하지 못한다면 좀 더 문제를 명확하게 설명해 주시겠습니까? – PhD

1

필자는 가능한 한 로직 부분 (플레이어가 속한 타일)과 시각화 부분 (타일 간 애니메이션)을 유지하려고합니다. 내 접근 방식은 논리적 인 위치 (플레이어가 설정된 타일)와 이동 속도 (기본적으로 플레이어가 타일로 이동 한 후 다음 타일로 넘어갈 수없는 시간을 의미 함)를 갖는 것입니다. 그런 다음 한 타일에서 다른 타일로의 애니메이션은 스프라이트가 항상 타일의 화면 좌표로 이동한다는 것을 의미합니다.이 시간은 이동 속도에 따라 쉽게 결정될 수 있습니다 (전체 타일 이동은 플레이어가 수행해야하는만큼 오래 걸릴 것입니다. 현재의 타일에 얹는다).

유일한 경우는 플레이어가 언제든지 출품 한 타일로 돌아갈 수있게 해주는이 "터닝 어라운드 (turn around)"인데, 이는 단지 (timeToRecoverOnTile - (timeToRecoverOnTile - timeSinceMovementStarted))입니다.

1

한 번 AS3에서 한 번 똑같은 개념을했지만 개념이 Java로 옮겨졌습니다. 필자는 이동을 추적하는 데 도움이되는 두 가지 주요 값, 플레이어의 x/y 값 (타일 별)이 포함 된 Point 및 이동 방향에 대한 방향 Point를 작성하기로 결정했습니다. 당신이 당신의 요구에 맞게 조정할해야 할 것, 분명히

if(direction.x == 0 && direction.x == 0) { 
    if (up) direction.y = -1; 
    else if (down) direction.y = 1; 
    else if (left) direction.x = -1; 
    else if (right) direction.x = 1; 
} else { 
    player.x += direction.x; 
    player.y += direction.y; 
    distance--; 
    if(distance == 0) { 
     direction.x = direction.y = 0; 
     distance = tileWidth; 
    } 
} 

,하지만 기본을이다 : 여기에 몇 가지 의사 코드입니다. 또한 tileWidth은 단순히 단일 타일의 너비와 같은 정수 리터럴로 대체 될 수 있습니다.