일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 부에노비스타 소셜클럽
- frozen lake
- 시집
- Python
- 단어가 품은 세계
- 매트로폴리탄
- 타이핑 몬스터
- 나는 매트로폴리탄 미술관 경비원입니다.
- 숨결이 바람이 될 때
- 나는 스물일곱 2등 항해사입니다.
- 운석 피하기 게임
- 운석피하기 게임
- pygame
- Ai
- gymnasium
- 아무도 없는 숲속에서
- 쿠바전통음악
- 고양이발 살인사건
- 트렌드코리아2025
- 황선엽
- Stable diffusion
- openAI
- comfyui
- Gym
- 어른의 행복은 조용하다
- 인생의 해상도
- 타자연습게임
- 타이핑좀비
- 에르난 디아스
- 게임개발
- Today
- Total
스푸79 기록 보관소
타자 연습 게임, 타이핑 몬스터(5) - 객체지향 본문

이번 포스팅에서는 타자연습게임을 일정 확율로 특수 기술을 사용하도록 설정해 봤습니다.
위에 그림을 보시면 '동자차', '동운회' 처럼 뜻을 알 수 없는 단어가 보일 겁니다.
원래 단어는 '자동차', '운동회'인데 좀비가 스킬을 사용하면
'동자차', '동운회'처럼 글자의 순서를 바뀌도록 처리했습니다.
그리고 또 다른 기술이 있습니다.
아래와 같이 2초 정도 글자를 ??로 변경해서 숨기는 기술입니다.

좀비가 위의 두 개의 기술을 사용할 수 있도록 처리하는 방법은 다양합니다.
그 중에서 우리가 개발할 때 가장 쉽고 빠르게 처리할 수 있는 방법은
좀비에게 두 가지 기술을 모두 적용하고 일정한 확률로 기술이 발동되도록 코딩하는 겁니다.

무척 직관적이고 당연해 보이기 때문에 나중을 생각하지 않으면 이렇게 코드를 작성하기 쉽습니다.
하지만 이 방법을 사용하면 나중에 많은 문제가 발생할 수 있습니다.
만약, 게임이 흥행이 되어 회사에서 새로운 좀비가 계속 추가하라는 지시가 내려온다고 가정해 보죠.
새로운 좀비가 추가되면 위의 좀비에게 적용한 코드를 새로운 좀비에게도 적용을 해야합니다.
지금은 한마리 추가되는 거라
복사, 붙여넣기를 사용하면 금방 코드를 이식할 수 있으니 어렵지는 않을껍니다.

하지만 좀비 종류가 계속 늘어난다고 생각해 봅시다.
기존 코드를 복사, 붙여넣기로 계속 새로운 좀비에게 이식합니다.
그런데 어느날 뜬금없이 위의 기술 중 하나에 오류가 발견이 되었습니다.
단어 숨김(??) 기능이 ??로 보였다가 2초 뒤에 원래 단어로 돌아와야하는데
??인채로 계속 유지되는 문제가 발견 되었다고 가정해 보죠.
새로운 좀비 코드를 찾아서 위의 오류를 모두 찾아서 수정해 줘야합니다.
만약 좀비가 100마리라면 100마리 모두 동일한 작업을 해줘야합니다.
50마리쯤 이식하다가 실수로 패치한 내용을 적용 안 했다면
해당 오류는 고객으로부터 계속 컴플레인을 받게 될 것입니다.
이런 상황을 사전에 방지하려면 구조를 아래와 같이 잡아야합니다.

단어 숨김 처리와 순서 바꾸기를 '스킬' 이라는 별도의 객체로 보고
각각의 좀비들에게 객체로 전달을 하는 방식으로 코드를 작성하는 겁니다.
이렇게 되면 스킬에 오류가 발견되어도 '스킬' 객체만 수정하면 되고
수정과 동시에 모든 좀비에게 별도의 이식하는 과정없이 동일하게 적용이 될 수 있습니다.
이런 방식을 객체지향 프로그래밍이라고 합니다.
그리고 지난 번까지 작성한 코드를 조금 더 개선해 보았습니다.
당장 개발에만 급급하다 보니 가독성이 많이 떨어지는 코드로 작성한 것 같습니다.
개선된 코드 부분 일부를 보여드리죠.
아래 부분은 개선 하기 전 코드입니다. 좀비의 프레임별 처리하는 기능 관련 코드입니다.
def update(self):
if self.monster_status == cfg.WALK:
self.pos += self.speed
self.rect.center = self.pos
if self.rect.y > cfg.SCREEN_HEIGHT:
self.kill()
self.animation("LOOP")
elif self.monster_status == cfg.ATTACK:
self.animation("LOOP")
elif self.monster_status == cfg.DIE:
if self.animation_index == len(self.images) - 1:
self.animation("ONETIME")
self.opacity -= 3
self.image.set_alpha(self.opacity)
if self.opacity < 0:
self.kill()
else:
self.animation("LOOP")
self.check_fence()
딱 봐도 반복되는 부분이 많이 보이고 정확하게 어떤 작업을 하는지 이해하기 어렵습니다.
아래는 개선 후 코드입니다.
def update(self):
self.move()
self.animation()
self.dispose()
self.collider.draw(self.main.screen)
def move(self):
if not(self.stop):
self.pos += self.speed
self.rect.center = self.pos
self.collider.update(self.rect.x, self.rect.y)
def animation(self):
self.animation_interval_count += self.animation_interval_increment
if self.monster_status == cfg.DIE:
if self.animation_interval_count >= self.animation_interval:
self.animation_interval_count = 0
self.animation_index = (self.animation_index + 1) % len(self.images)
self.image = self.images[self.animation_index]
if self.animation_index == len(self.images) - 1:
self.monster_status = cfg.DISAPPEAR
elif self.monster_status == cfg.DISAPPEAR:
self.disappear()
else:
if self.animation_interval_count >= self.animation_interval:
self.animation_interval_count = 0
self.animation_index = (self.animation_index + 1) % len(self.images)
self.image = self.images[self.animation_index]
어떤가요?
update에서는 함수 호출만 작성하고
세부적인 분기나 프레임 처리 부분을 함수에 담았습니다.
이렇게 하니 가독성도 올라가고 update에서 어떤 작업을 하는지를 한번에 알 수 있습니다.
당연히 함수 별로 수정하면 되니 작업도 수월할 겁니다.


이번 포스팅에는 정확하게 좀비 머리 위의 단어를 타이핑하면
람보가 총을 쏘는 에니메이션도 적용했습니다.
그리고 화면을 보시면 좀비와 철장에 붉은색 박스가 그려진게 보일 겁니다.
이건 바로 충돌영역을 표시한 건데요. 육안으로 충돌 검사의 정확도를 확인하기 위해 남겨놨습니다.
다음 강좌에서는 충돌 검사 시점에
좀비와 철장이 충돌 판정이 나는 경우 좀비가 철장을 공격하도록 처리할 생각입니다.
그리고 일정 횟수 이상 공격하면 철장이 부서지고 좀비가 전진할 수 있도록 할 계획입니다.
또 좀비가 철장을 공격하는 도중에 뒤에 좀비 따라오게 되면
앞의 좀비 뒤에서 대기하는 처리도 할 생각입니다. (현재는 제자리 걸음을 하고 있습니다.)
이제 충돌 후 처리, 사운드, 스테이지만 처리하면 타자연습게임 개발도 완결이 날 듯 합니다.
소스코드를 첨부합니다.
'게임공작소' 카테고리의 다른 글
타자 연습 게임, 타이핑 몬스터(6) - 플레이어 사망 및 사운드 (19) | 2025.03.16 |
---|---|
타자 연습 게임, 타이핑 몬스터(4) - 배경 (23) | 2025.01.26 |
타자 연습 게임, 타이핑 몬스터(3) - 애니메이션 (46) | 2025.01.12 |
타자 연습 게임, 타이핑 몬스터(2) - 프로토타입 (65) | 2024.12.21 |
타자 연습 게임, 타이핑 몬스터(1) - 게임기획 (100) | 2024.12.08 |