Pygame 프로젝트 개발기 - 캐릭터 및 오브젝트 이미지 변경
밋밋한 캐릭터와 오브젝트의 이미지를 바꿔보자!
들어가기 전….
짜치는 캐릭터와 오브젝트 이미지.. 심지어 캐릭터는 이미지 그대로 수평이동을 한다.. 스크래치도 이것보단 역동적이고 재밌을듯 싶다ㅋㅎㅋㅎ 그 래 서 ! 싹 다 바꾸고 캐릭터에 애니메이션을 추가해줄 것이다!!
🎨 적당한 이미지 찾기
생각보다 시간이 엄청 걸렸던 작업… 이미지 컨셉은 픽셀 아트로 정했다.
이미지를 찾을 때는 웬만해서 저작권 관련 문제가 없고 무료로 다운받을 수 있는 걸로 서칭을 했다.
폭탄 이미지임당
캐릭터 이미지팩임당
캐릭터 이미지팩은 잘라서 써야하는데 주변 지인에게 포토샵을 부탁했다.. 좌우 반전까지.. 고오맙다..!!
적용해보자!
💣 폭탄
폭탄 이미지 적용은 간단하다.
원래 있던 폭탄 이미지 파일을 새로 가져온 이미지로 바꾸기만 하면 적용 끝이다!
🏃♂️ 캐릭터
캐릭터의 경우에는 애니메이션 기능을 추가하기 때문에 코드를 추가하고 수정해줘야한다.
먼저 이런식으로 왼쪽으로 갈 때와 오른쪽으로 갈 때 그리고 가만히 있을 때의 이미지 변수를 따로 저장해준다.
person_idle_image = pygame.image.load('bomb_game/img/person_idle.png').convert_alpha()
person_left_images = [
pygame.image.load('bomb_game/img/person_left1.png').convert_alpha(),
pygame.image.load('bomb_game/img/person_left2.png').convert_alpha()
]
person_right_images = [
pygame.image.load('bomb_game/img/person_right1.png').convert_alpha(),
pygame.image.load('bomb_game/img/person_right2.png').convert_alpha()
]
person_idle_image = pygame.transform.scale(person_idle_image, (100, 100))
person_left_images = [pygame.transform.scale(img, (100, 100)) for img in person_left_images]
person_right_images = [pygame.transform.scale(img, (100, 100)) for img in person_right_images]
양 방향으로 움직일 때는 두가지 이미지를 넣어서 걷는 느낌이 나게 표현을 하고싶었다. 그러기 위해서는 이런식으로 리스트로 저장해준다.
🙋♂️ convert_alpha()란?
pygame에서 이미지의 배경을 투명하게 하고싶을 때 사용하는 메소드이다.
이미지의 확장자는 PNG와 같은 투명도를 지원하는 확장자를 사용할 때 적용시킬 수 있다.
애니메이션 관련 변수
애니메이션 효과를 나타내기 위해선 코드 추가 및 수정이 필요하다고 위에서 말했다.
# 애니메이션 관련 변수
animation_index = 0 # 현재 애니메이션 프레임 인덱스
animation_speed = 0.2 # 애니메이션 속도 (작을수록 빠름)
animation_timer = 0 # 프레임 전환을 위한 시간 누적
person_image = person_idle_image # 초기 이미지는 가만히 있는 상태
이미지가 바뀌는 것에 대한 변수들이다.
global animation_index, animation_timer
전역 변수로도 추가해준다.
person_image = pygame.image.load('bomb_game/img/person_idle.png')
moving = False
기존 캐릭터의 이미지를 새로 추가한 이미지 중 가만히 있을 때의 이미지로 변경한다.
그리고 움직임에 대한 변수를 추가한다.
# 키 이벤트 처리
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True # 게임 종료
break
elif event.type == pygame.KEYDOWN and not game_over:
if event.key == pygame.K_LEFT:
person_dx = -5 # 왼쪽 키를 누르면 왼쪽으로 이동
moving = True
elif event.key == pygame.K_RIGHT:
person_dx = 5 # 오른쪽 키를 누르면 오른쪽으로 이동
moving = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
person_dx = 0 # 키를 떼면 이동 정지
moving = False
moving 변수를 키 이벤트 처리 부분에 추가해서 움직이는 지 가만히 있는 지에 대해 업데이트한다.
if moving:
animation_timer += animation_speed
if animation_timer >= 1:
animation_timer = 0
animation_index = (animation_index + 1) % len(person_left_images)
if person_dx < 0: # 왼쪽으로 이동 중
person_image = person_left_images[animation_index]
elif person_dx > 0: # 오른쪽으로 이동 중
person_image = person_right_images[animation_index]
else:
person_image = person_idle_image # 이동하지 않을 때는 기본 이미지
moving에 대해 조건문을 만들어서 방향에 맞는 이미지로 전환시켜준다.
try-except 문법을 여기서 사용할 줄은 몰랐는데 이런 경우에 꽤 유용한 것 같다. 학교 컴퓨터에 마침! 재생 장치가 없어서 이러한 버그를 발견할 수 있었고 그에 따른 대처를 바로 할 수 있었다. 다행이야~ 다음 글은 특수 폭탄 생성에 대해 작성할 것이다.