시작하는 글
오늘은 2022.04.26 내일배움캠프 스파르타코딩클럽 실무형 AI 웹개발자 양성과정의 9일차다.
어제하던 '텐가이' 만들기를 마무리 해야한다.
어제는 일지를 졸면서 써서 그런지 글솜씨가 저질이야
오늘은 일찍 자야되니까 내용을 심플하게 가고자 한다.
ㄱ
훈련내용
지난이야기
어제자 블로그 : https://angar2.tistory.com/18
어제 게임 기본 구성과 컨셉은 완성했다.
기본구성(컨셉)은,
- 주인공 (아이언맨)
- 적 * n개 (울트론, 바위 등)
- 총알 발사 (리펄서)
- 목숨 n개 (아이언맨 뚝배기로 표시)
- 스코어 (매 프레임마다 증가 + 적 사냥 시 증가)
이 정도에 각 컨셉에 맞는 이미지를 부여했다.
네 다음 기획
1부 : 추가 기능 기획
막코딩의 암시
사실 처음부터 하고 싶었던 기능은 많다.
예를 들어,
스테이지 구분, 각 스테이지별 중간/최종 보스, 히어로 변경, 점수 기록제 등
짧은 프로젝트 기간을 감안해서 그 정도는 힘들 것이라 판단하고
최소한의 게임 구동 모습과 필수 기능만 더 넣기로 했다.
그렇게 손가락 더 뚜들길 내용은,
- 스크린 크기 늘리기 (800 * 480 → 1024 * 480)
- 적 공격 모션 추가 (이미지 변환)
- 아이언맨 필살기 발사 / 발사 모션 추가 (이미지 변환)
- 적 사냥 시 필살기 게이지 충전 기능 / UI 구현
제일 쉬운 스크린 크기부터 늘리고
(뚝딱)
다음은 이거 하고
(뚝딱)
저거 하고
(뚝딱)
어쩌구 하다보니 오랜 세월이 흘렀다.
2부 : 세월의 결과
(이거 구현하느라 늙음)
이렇게 구현하느라고 하루를 다 썼다 (코딩 깍두기니까^^)
그래도,
머리속으로 생각한 것을 직접 구현했다는 것에 의의를 둔다.
기획한건 다 구현했다.
핵심적인 기능 구현 설명을 해보자면,
# 아이언맨 필살기 발사 / 발사 모션 추가 (이미지 변환)
(※ 실제 코드 순서는 아니며, 설명을 위해 순서 재배열 및 선별적 복붙, 주석 재작성을 허가합니다.)
beam = pygame.image.load('img/beam.png') # 내 이름은 빔
beamSize = beam.get_rect().size
beamWidth = beamSize[0] # 난 길다
beamHeight = beamSize[1]
beamPosX = screenWidth # 평소엔 화면 밖에서 잠적
beamPosY = screenHeight
beamGauge = 0 # 빔 발사 배터리 (깡통 잡으면 충전됨)
beamMode = 0 # 빔 발동 혹은 아이언맨 빔 발사 이미지 변환 시 사용
# ( 0: 충전 중, 1: 눈치 챔, 2: 튀어나갈 준비, 3: 발사! )
IronmanMode = 0 # 아이언맨 기본 이미지 변환과의 꼬임을 방지하는 역할 ( 0: 평상시, 1: 빔 발사 시 )
beamTime = 0 # 빔 발동 시간 (처음엔 이력없음)
(중간생략)
currentTime = pygame.time.get_ticks() # 지금 몇시
if event.key == pygame.K_b: # B를 누르면
if beamGauge >= 1000: # 만약 배터리 완충일 때
beamPosX = IronmanPosX + 35 # 아이언맨 명치로 목적지 설정
beamPosY = IronmanPosY + 16
beamShot() # 나오라고 눈치줌
(순서 재배치)
def beamShot(): # 눈치주면 하는 짓
global beamTime, beamMode, IronmanMode
beamMode = 1 # 눈치 챔
beamTime = currentTime # 눈치 챈 시간 기록
IronmanMode = 1 # 꼬임 방지 장치 on (워워~)
if currentTime - beamTime <= 1000 and beamMode == 1: # 좀전에(1초) 눈치챘으면
Ironman = Ironman_4 # 아이언맨 발사 준비 모션해라(움크리기)
beamMode = 2 # 튀어나올 준비해라
elif 1000 < currentTime - beamTime <= 5000 and beamMode == 2: # 눈치 채고 튀어나왔으면
Ironman = Ironman_5 # 아이언맨 발사 모션해라(가슴 쫙펴기)
beamMode = 3 # 필살기 발사!
elif currentTime - beamTime > 5000 and beamMode == 3: # 눈치 챈지 오래됐고 발사했으면
Ironman = pygame.image.load('img/ironman.png') # 아이언맨 차렷
beamMode = 0 # 빔 다시 화면 밖으로 짜지거라
IronmanMode = 0 # 아이언맨 기본 이미지 변환 긴장 풀어
beamGauge = 0 # 배터리 방전
if beamMode == 3: # 빔 발사 중에는
beamPosX = IronmanPosX + 35 # 아이언맨 명치 따라 다녀라
beamPosY = IronmanPosY + 16
else: # 아니면
beamPosX = screenWidth # 계속 짜져있어라
beamPosY = screenHeight
screen.blit(beam, (beamPosX, beamPosY)) # 화면 밖에 있더라도 항상 존재는 함
뭐 이런 스토리.
뭔가 무식하게 한 코딩이지만,
이 부분 구현이 참 힘겨웠음...
나름의 해결책은 'beamMode'라는 변수를 만들고
변수의 값에 따라 상황을 정의 하는 것이다.
0: default, 1: 준비모드 이미지 변환, 2: 발사모드 이미지 변환, 3: 빔 발사
'beamMode'의 값에 따라 다르게 짜놓은 if문들이 반응하면서 각기 다른 기능을 구현한다.
이후로 이 'Mode'라는 개념을 잘 써먹고 있다. (어디서 본건 있음)
사실 중간에 울트론2의 공격 방식을 바꿨다.
처음에는 다른 유닛들처럼 근접 충돌처리로 구현했었는데,
모든 적 유닛이 그런 방식이라는게 밋밋한 것 같아서 적마다 다른 컨셉을 부여하고자
리펄서 발사 기능을 추가했다.
if repulsor_2RandomRect.colliderect(ultron_2Rect): # 울트론2가 리펄서 랜덤 포인트에 닿을 경우
ultronRepulsorShot() # 울트론2가 리펄서를 발사하고
transMode(ultron_2) # 울트론2는 공격 모션으로 이미지 변환
repulsor_2PosX = ultron_2PosX - 80 # 리펄서 발생 지점 (울트론2의 손)
repulsor_2PosY = ultron_2PosY - 30
해당 기능을 추가하기 위해,
울트론2가 어느 랜덤으로 지정된 지점에 닿으면 리펄서를 발사하는 식으로 코드를 짜보았다.
이외에도 if문을 통해 상황별로 다른 액션을 취하게끔 하는 방식을 자주 사용했다.
(만약에 x 100)
끝내는 글
이번 프로젝트는 생각보다 만족스러우면서 아쉽다.
기획했던 것들은 전부 구현했지만,
더 구현하고 싶은 기능이 많고
구글링보다는 머리로 계산해서 경우의 수를 구성한 부분이 많기에 분명히 취약점이 있을 것이기 때문이다.
그래도 모든 코드 부분을 이해하면서 코딩했기에
이번엔 이정도로 만족하려고 한다.
앞으로 이 게임을 틈나는대로 업데이트할 생각이다.
'내일배움캠프 > 1 ~ 4 주차' 카테고리의 다른 글
[내일배움캠프] - 11일차 : 개인 프로젝트 | instargram 클론코딩 (0) | 2022.04.28 |
---|---|
[내일배움캠프] - 10일차 : 개인 프로젝트 | 파이썬으로 게임만들기 쓰리 | 제출 (0) | 2022.04.27 |
[내일배움캠프] - 8일차 : 개인 프로젝트 | 파이썬으로 게임만들기 (1) | 2022.04.26 |
[내일배움캠프] - 1주차 : 웹프로그래밍 학습부터 팀프로젝트까지 | 전부 다 처음 (0) | 2022.04.24 |
[내일배움캠프] - 6~7일차 : 휴일 (0) | 2022.04.24 |