문제

그래서 저는 게임 프로그래밍을 배우기 위해 Java로 팩맨 게임을 만들고 있습니다.

팩맨 스프라이트와 유령 스프라이트가 그려진 기본 게임 창이 있고 팩맨은 화살표 키로 움직이고 창 벽 너머로 움직이지 않습니다.이제 이 그림과 같이 미로를 만들려고 합니다.

Pacman maze

이에 대한 직접적/완전한 솔루션을 제공하지 않고 누군가 이것이 어떻게 구축될 수 있는지 안내해 줄 수 있습니까?여기서는 통과할 수 없고 우회해야 하는 경계와 파이프('T' 표시)에 대해서만 이야기하고 있습니다.아직 팩맨이 먹는 점은 아닙니다.

내 질문은 다음과 같습니다.

1) 이 미로를 만드는 가장 효율적인 알고리즘/방법은 무엇입니까?Paint() 메서드가 호출될 때마다 그려야 합니까? 아니면 게임 시작 시에만 그려지고 다시는 그려지지 않도록 하는 방법이 있습니까?

2) 실제로 화면에 어떻게 그려지나요?나는 가정한다 fillRect() 사용하게 될 것이다?

3) 충돌 감지에 대한 힌트(팩맨/유령이 벽을 통과할 수 없도록)가 도움이 될 것입니다.

4) 파이프 사이의 빈 공간을 계산하여 파이프 사이의 점을 채울 수 있는 방법에 대한 힌트도 매우 도움이 될 것입니다.

감사해요

도움이 되었습니까?

해결책

나는 그렇게하지 않을 것입니다.

그래픽 맵을 그린 다음 맵을 나타내는 2D 데이터 배열을 만듭니다. 데이터 맵은 충돌, 식습관, 사탕이있는 곳 및 유령이있는 곳을 결정하는 데 책임이 있습니다. 모든 것에 대한 모든 논리가 처리되면 2D 배열을 사용하여 그래픽 맵 위의 적절한 픽셀 좌표에 모든 것을 표시하십시오.

예를 들어 사용자가 왼쪽 키를 누르고 있습니다. 먼저 Pacman이 요소 3, 3에 있다고 판단합니다. 요소 3, 2에는 벽을 나타내는 정보가 포함되어있어 코드를 구현하여 명령을 무시할 수 있습니다.

편집하다:

각 요소는 점이있을 수있는 위치를 나타냅니다. 예를 들어:

아니요, 보드를 보면 배열이 다음과 같이 보일 것이라고 말할 것입니다.

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p    
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d    
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d

등등. 그러나 일부 영역에는 다양한 정보가 포함되어 있어야하므로 문자보다 유연한 데이터 구조를 선택할 수 있습니다. 즉, 유령 산란 지역이 비어 있더라도 Pacman은 허용되지 않습니다. 유령과 팩맨의 움직임은 측면 도피에 대해 다르고, 사탕 스폰 지점은 빈 지점이지만 유연하게 유지하려면 맵 당 위치에있는 위치를 나타냅니다.

기억하고 싶은 또 다른 것은 Pacman과 유령이 종종 지점 사이에 있기 때문에 1,2에서 1,3 사이의 공간의 백분율을 나타내는 정보가 포함되어 있다는 것입니다. 충돌 감지 및 결정에 중요합니다. 보드에서 점, 파워 업 및 사탕을 제거하려면.

다른 팁

다음은 당신을 위한 힌트입니다:

대체 텍스트 http://www.freeimagehosting.net/uploads/66e4131f59.jpg

이 힌트를 적절하게 사용하면 렌더링 및 충돌 감지를 처리할 수 있으며 미로를 간결한 방식으로 표현할 수도 있습니다.

  1. 맵을 BufferedImage에 페인트하고 모든 페인트 ()에이를 뽑을 수 있습니다. 이런 식으로 상당히 합리적인 성능을 얻을 수 있습니다.

  2. 벽이 단단한 것에 만족하면 각 정사각형 벽 블록을 채우기로 끌어들일 수 있습니다. 그림에서와 같은 모습을 원한다면 올바른 방식으로 선을 그리고 코너에 아크를 사용하는 방법을 알아 내야합니다.

  3. Pacman 게임지도는 사각형과 Pacman으로 만들어졌으며 유령은 항상 애니메이션 단계에서 한 사각형에서 인근 광장으로 이동합니다 (즉, 오른쪽을 누르면 Pacman은 한 사각형을 오른쪽으로 이동합니다). 즉, 충돌 감지가 쉽다는 것을 의미합니다. 단순히 비어 있지 않은 사각형으로 이동하지 마십시오.

  4. 나는 당신이 여기서 무엇을 묻는 지 이해하지 못합니다.

1) 다시 그리기에 대한 조언을 제공합니다. 전체 이미지를 다시 그리는 것을 발견하면 할 수있는 일은 느리게 진행되며 화면에서 변경된 요소 만 결정하고 다시 그리기를 결정하는 것입니다. 이에 대한 접근 방식은 다음과 같습니다. 이동 한 스프라이트를 결정하십시오. 그 스프라이트 주변의 사각형을 결정하십시오. 그 직사각형 만 다시 그리십시오. 이렇게하면 화면의 전체 화면이 아니라 전체 화면이 아닙니다. 이로 인해 전체 화면을 다시 그리는 것보다 성능이 향상됩니다.

다른 답변은 당신이 요청한 다른 질문들에 대해 합리적이었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top