본문 바로가기

내일배움캠프/1 ~ 4 주차

[내일배움캠프] - 9일차 : 개인 프로젝트 | 파이썬으로 게임만들기 투

 시작하는 글 

 

오늘은 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)

 


 

 끝내는 글 

 

이번 프로젝트는 생각보다 만족스러우면서 아쉽다.

 

 

기획했던 것들은 전부 구현했지만,

더 구현하고 싶은 기능이 많고

구글링보다는 머리로 계산해서 경우의 수를 구성한 부분이 많기에 분명히 취약점이 있을 것이기 때문이다.

 

 

 

그래도 모든 코드 부분을 이해하면서 코딩했기에

이번엔 이정도로 만족하려고 한다.

 

앞으로 이 게임을 틈나는대로 업데이트할 생각이다.