- 팀 프로젝트(1) <Java Swing을 활용한 멀티 쓰레딩 프로그래밍 프로젝트: 팩맨(PacMan) 게임 구현하기(2)>2024년 05월 08일
- Song hyun
- 작성자
- 2024.05.08.:37
728x90반응형팀 프로젝트(1) <Java Swing을 활용한 멀티 쓰레딩 프로그래밍 프로젝트:
팩맨(PacMan) 게임 구현하기(2)>
1. 마감 기한 및 대략적인 업무 정리하기
2. 코드 뼈대 만들기 (인터페이스 및 구현해야 할 기능)
3. 코딩 컨벤션 조율하기
4. 오늘의 건의 사항
*돌아보기(트러블 슈팅 기록)
1. 마감 기한 및 대략적인 업무 정리하기
두번째 날, 가장 먼저 정한 것은 마감 기한이었다. 제출해야할 결과물은 게임 시연 영상, git, PPT 파일이었기 때문에 마감 기한보다 며칠 정도 더 여유가 필요했다. 일주일 정도의 기간이 남았지만, 마감 일자보다 2,3일 정도 먼저 구현 후 영상 촬영을 하는 것을 목표로 정했다.
*프로젝트 기한 목표
-마감일자 2,3일 전: 게임 구현 후 영상 촬영
-마감일자 1일 전: 발표 자료 정리
-마감일: gitHub 및 영상 제출
오늘의 대략적인 업무는 각자 2명씩 짝지어 아래 사항들을 구현하는 것으로 결정되었다.
(1) Player/Enemy 클래스의 기본적인 움직임 구현(방향키를 입력받아 움직이기)
(2) 백그라운드 구현
2. 코드 뼈대 만들기 (인터페이스 및 구현해야 할 기능)
-자세한 사항들의 경우, 이후 변경사항이 생길수도 있었기에 대략적인 클래스 파일(Player/Enemy)과 백그라운드서비스 파일, 메인 프레임 파일, 그리고 Moveable 인터페이스 파일을 생성하는 것으로 결정했다. 이후에 변경사항이 생길 경우 함께 상의해서 만들기로!
3. 코딩 컨벤션 조율하기
-보다 알아보기 쉽고, 오류와 수정 번복을 줄이기 위해 객체/메서드의 이름과 사항들을 통일하기로 결정했다. 이 덕분에 git pull을 할 때, 이로 인한 오류가 거의 없었던 것 같다.
4. Player(팩맨) / Enemy(고스트) 캐릭터 구현하기
-오늘의 목표는
(1) 맵 및 플레이어, 적 캐릭터 구현
(2) 벽에 부딪힐 시 충돌 구현
(3) 플레이어 및 에너미 캐릭터의 움직임 재현이었다.
짝꿍님과 함께 짝을 지어, 나는 PlayerBcakgroundService / 짝꿍님은 Player 클래스를 각자 설계했다.
팀장님의 바로 옆에 앉아있었기에, Player/PlayerBackgroundService 파일을 구현하며 문제가 생기면, 즉각 그 자리에서 상의해 해결할 수 있어 꽤 빠르게 코드가 구현되었다. 서로 상대방의 코드를 보며 에러를 찾아주는 등 활기찬 분위기 속에서 프로젝트를 시작할 수 있어, 내내 즐거웠다.
*돌아보기(트러블 슈팅 기록) . . .
간단한 움직임을 구현하는데도, 생각보다 많은 에러가 생겼다. 기억나는 문제들은 아래와 같다.
(1) 플레이어 캐릭터가 제대로 움직이지 않음
(2) 플레이어 캐릭터 움직임이 구현되지 않음
(3) 쓰레드 충돌로 인한 플레이어 캐릭터 움직임(입 벌리고 닫기) 속도 빨라짐 문제(1) 플레이어 캐릭터가 제대로 움직이지 않음
-원래라면 위의 영상처럼, KeyEventListener를 통해 키를 입력받으면, 캐릭터가 상하좌우로 움직이도록 구현되어야 했다. 하지만 처음 코드를 실행했을 때는, 왼쪽 키를 누르면 플레이어 캐릭터가 멈추지 않고 계속 왼쪽으로 이동하는 식이었다.
=> 알고보니 KeyReleased에서 이동을 멈추게 하는 코드가 입력되지 않은 것이 이유였다. 생각보다 금방 해결된 문제였고, 조금 더 꼼꼼히 코드를 살펴야겠다고 느낀 부분이었다.
(2) 플레이어 캐릭터 움직임이 구현되지 않음
-흔히 볼 수 있는 팩맨 캐릭터처럼, 화면에서 내내 입을 벌리고 닫는 움직임을 구현하려고 했다.
New Thread를 생성해 서서히 입을 벌리는 것처럼 보이게, 5개의 이미지로 교체되는 스레드를 만들었다. 헌데 이미지가 바뀌기는 커녕 내내 입을 다문 모습인 것이다.
짝꿍님이 구현하시던 Player 클래스에서 발견한 문제였는데, KeyEventListener에 스레드를 넣어보거나, Player 클래스 내의 다른 메서드에 넣어보거나 하는 등 여러 방법을 시도했지만 풀리지 않았다. 내가 천천히 다시 코드를 살펴보던 중 이 문제를 풀게 되었는데, Thread를 실행하게 하는 start()를 호출하지 않아서 발생한 문제였다(!!!)
+처음에는 setIcon->Thread.sleep을 5번 반복하여 이미지를 반복하는 식으로 메서드를 생성하려고 했다. 내 제안으로 인해 ImageIcon[] 형식의 배열을 만들어, 해당 배열에 5개의 ImageIcon 파일을 넣고, for 문을 통해 보다 간단하게 이미지 교체 메서드를 만들게 되었다. 줄어든 코드를 보고 함께 뿌듯했던 기억이 난다.
(3) 쓰레드 충돌로 인한 플레이어 캐릭터 움직임(입 벌리고 닫기) 속도 빨라짐 문제
막상 플레이어 캐릭터의 이미지가 움직이자, 또 다른 문제가 생겼다. 왼쪽으로 이동할 때만 이미지가 급속하게 빨리 변경되는 것이었다. 짝꿍님과 함께 코드를 찬찬히 살펴보던 중, Left()메서드에 changeIcon() 메서드가 이미 호출되어 있는 것을 발견했다.
사용자 정의 생성자와 함께 동시에 실행되는 changeIcon()메서드. 그런데 Left()메서드를 호출하면 changeIcon() 메서드가 두 번 호출되어 쓰레드 중복 이슈가 생기는 것이었다. Left() 메서드 속의 changeIcon() 메서드를 삭제하자 원래 속도로 돌아온 것을 확인할 수 있었다.
수업 시간 중에 해결했던 문제(ex: 쓰레드 중첩)도 있었지만, 직접 코드를 구현하며 문제를 해결하는 것은 또 색다른 문제였다. 다행인 것은 팀 프로젝트였기 때문에, 하나의 문제가 생기면 팀원들이 함께 문제를 해결했다. 그 과정에서 뿌듯함과 성취감을 함께 공유할 수 있어 즐거운 시간이었다.
728x90반응형'💡My project > 팩맨 : Java Swing 게임 제작 프로젝트' 카테고리의 다른 글
다음글이전글이전 글이 없습니다.댓글