2011-12-27 2 views
0

저는 컴퓨터 사이언스 수업을위한 팩맨 게임을 만드는 마지막 단계에 있습니다. 내 게임은 중요한 것 하나만 제외하고는 기능합니다. 고르지. 내가 고르지 않은 이유를 알고 있지만 그것을 고칠 방법을 모르겠습니다. 내 문제는 Pacman과 Ghost 's Coords에서 21을 곱한 후 배열을 곱한 것입니다. 그리고 나는 팩맨이 매 100ms마다 21 픽셀 씩 움직이는 것을 의미하는 100ms 지연을 가지고 있습니다. 여기움직임이 배열에있을 때 부드러운 애니메이션 만들기

할 경우에 중요한처럼 배열 모습입니다 :

public int board[][] = 
    {{2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //1 
    {2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 0, 2}, //2 
    {2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 2}, //3 
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2}, //4 
    {2,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,2}, //5 
    {2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //6 
    {2,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2}, //7 
    {2,2,2,2,0,1,0,1,1,1,1,1,1,1,0,1,0,2,2,2,2}, //8 
    {0,0,0,0,0,1,0,1,0,0,-1,0,0,1,0,1,0,0,0,0,0}, //9 
    {5,2,2,2,2,1,1,1,0,2,2,2,0,1,1,1,2,2,2,2,6}, //10 
    {0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0}, //11 
    {2,2,2,2,0,1,0,1,1,1,2,1,1,1,0,1,0,2,2,2,2}, //12 
    {2,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,2}, //13 
    {2,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,2}, //14 - pacman on this row 
    {2,0,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,2}, //15 
    {2,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2}, //16 
    {2,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,0,2}, //17 
    {2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //18 
    {2,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,2}, //19 
    {2,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,2}, //20 
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}; //21 

는 기본적으로 각 행은 행입니다. 보드는 그 것으로부터 추출되었습니다. 예를 들어 위로 이동하는 경우 현재 위치 위에있는 지점이 명확하고 배열에 1을 더하고 새 위치에 21을 곱하면됩니다.

내가하고 싶은 일은 Pacman의 이동 속도를 줄이는 동시에 부드럽게 만드는 것입니다. 다른 정보가 필요하다면 코드 조각을 더 제공 할 수 있습니다.

편집 : 요청한대로 코드가 있습니다. 나는 아마 그것이 전부 필요하지 않다는 것을 알고있다 그러나 나는 어느 부분이 최대한으로 도울 필요가 있을지 몰랐다. 그리고 그것은 꽤 많이 완전히 논평되었습니다. 그려지되는 방법 Pastebin - Pacman

+0

나는 이것이 관련이 있는지 확실하지 않습니다 만,을 "행"을 포함하는 파일을 만든 다음 그 파일을 읽으십시오. 또한 일부 코드를 게시하십시오. – Jimmt

+0

코드가 추가되었습니다. 희망이 도움이됩니다! – ComputerLocus

답변

1

아마 추상적 인 모델보다 더 중요하다 : 그것은 여기에 문자 제한에 대한 오랜에이기 때문에 여기에

은에 대한 링크입니다. 예를 들어 대안으로 BitSets은별로 말할 것도 없습니다.

페인트 칠은 어떻게합니까 : repaint(20L, x, y, width, height) (변경된 영역으로 제한되며 시간이 지남에 따라 몇 가지 변경 사항을 수집 할 수 있습니까?) 어떻게 그려? BufferedImage을 변경하면됩니다. BufferedImage에 기입 해 (Graphics2D를 취득한다), 거기에 스프라이트를 draw 할 수 있습니다.

도둑이 또한 누락 된 사용 setDoubleBuffered(true)에서 발생할 수 있습니다. 그런데 초당 50 프레임은 페인트 칠 (20L)입니다.

모델을 애니메이션화하고 이벤트 스레드에 그려진 구성 요소를 보는 타이머 루프가있을 수 있습니다 (전체 또는 21x21 BufferedImages,보기를 변경하기위한 일부 세마포어 등). 이러한 세마포어는 병목 현상이 될 수 있으며 21x21 구성 요소는 더 세분화 될 수 있습니다. 코드를 수신 한 후


: 재 설계가 더 좋은 것, 그러나 아마 실용 없습니다.

Color은 paintComponent 외부에서 작성해야하며 특히 글꼴이 느립니다. 스타일 : if (up == true)은 간단히 if (up)이어야합니다. 클래스 이름은 일반적으로 자본으로 시작합니다 : Draw.

클래스 경로에서 getResource 및 getResourceAsStream 검색을 수행하고 Windows 백 슬래시 대신 슬래시가 필요합니다. 클래스 경로는 병 안에있을 수 있습니다. 마찬가지로 글꼴을로드 할 수 있습니다.

  sound.open(AudioSystem.getAudioInputStream(
       getClass().getResourceAsStream("Sounds/pac_chomp.wav"))); 

사운드 관리는 아마도 글꼴처럼 세계적으로 개최한다, 조금 간단한 것 같다, 그래서 실행 루프는 단순히로드하지 않고, 시작을 호출, 더 "asynchrone"를 보인다.

매우 중요하지만,하지 :

for (int r = 0; r < board.length; r++) { 
     System.arraycopy(newboard[r], 0, board[r], 0, board[r].length); 
     // Replaces: 
     //for (int c = 0; c < board[0].length; c++) { 
     // board[r][c] = newboard[r][c]; 
     //} 
    } 

보다 더 영리 별칭 교환하는 것입니다 : 그것은에 훨씬 쉬울 것

int[][] physicalBoard0 = new int[21][21]; 
int[][] physicalBoard1 = new int[21][21]; 
boolean boardIs0 = true; 
int[][] board = physicalBoard0; 
int[][] newboard = physicalBoard1; 

private void swapBoards() { 
    boardIs0 = !boardIs0; 
    if (boardIs0) { 
     board = physicalBoard0; 
     newBoard = physicalBoard1; 
    } else { 
     board = physicalBoard1; 
     newBoard = physicalBoard0; 
    } 
} 
+0

나는 당신의 이야기만큼 진보 된 것은 아닙니다. run 메서드에서 다른 메서드를 호출하여 앞에있는 지점이 명확한 지 확인합니다. 어떤 방법으로 눌렀는지에 따라 더하거나 뺄 때. 지금은 배열 스팟에 21을 곱하는 것만 큼 간단합니다. 그리고 run 메소드의 끝에서 모든 것이 다시 그려집니다. 따라서 약 100ms마다 다시 칠해지기 때문에 팩맨과 유령은 4 방향 중 한 방향으로 21 픽셀 씩 이동합니다. – ComputerLocus

+0

그것이 도움이된다면 그것에 몇 가지 코드를 추가했습니다. – ComputerLocus

+0

이미지를 압축하여 이메일로 보내 주시겠습니까? joop_eggen at yahoo dot de. –

관련 문제