Sprite(스프라이트) 앞 뒤로 움직이기
페이지정보
내용
Sprite(스프라이트) 앞 뒤로 움직이기
Sprite를 움직이게 하는 것은 앞서 했던 자동차 게임에서 자동차들이 움직이는 원리와 같다.
다만, 캐릭터들이 좌우로 움직이는 이미지가 달라져야 한다.
왼쪽과 오른쪽을 모두 표현하는 이미지들이 있다면 그것을 그대로 사용해도 되지만, 한쪽 방향만 바라보는 이미지만 있다면, 그 이미지의 방향을 좌우로 변경하여 사용할 수 있다.
Sprite가 방향을 바꾸어서 움직이는 것을 구현해본다.
1. 걸어가는 image들 추가
다운 받은 샘플 파일 안에는 Sprite를 위한 여러가지 이미지들이 있다. 이 중에 걸음걸이를 표현한 이미지들을 추가한다.
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): ...... ......
|
2. 좌우 모습을 보여줘야 하므로, 이미지 좌우로 변경하여 저장
걷기 이미지들은 오른쪽을 향한 이미지들이다. 이것들을 왼쪽으로 바라보게 하기 위해서는 세로를 기준으로 좌우를 뒤집어준다.
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): ...... ......
# 원본 캐릭터 이미지들 |
3. 플레이어 방향과 속도 설정
플레이어는 가만히 서있기와 걷기 두 가지 상태를 가지며, 서있기와 걷기는 왼쪽 오른쪽 방향이 필요하다.
또한 걷을 때 움직이는 거리, 즉 속도를 지정해준다.
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): ...... ......
# 캐릭터의 현재 상태 |
4. update() 수정
상태와 방향에 따라 이미지들을 변경시켜주며 움직임을 재생한다.
def update(self, mt):
# 현재 상태에 따라 반복해줄 이미지의 index 설정과 속도
# 방향이 오른쪽이면, 오른쪽 이미지 선택
# loop 시간 더하기
# idle 상태는 0 ~ 9, 걷기 상태는 10 ~ 19
self.image = self.images[self.index]
# 좌우 위치값 변경, 이동 |
5. key event 수정
키보크 화살표 키 이벤트에 따라 설정값들을 변경해준다.
def main(): ...... ......
while running:
# 각 loop를 도는 시간. clock.tick()은 밀리초를 반환하므로 mt = clock.tick(60) / 1000
elif event.type == pygame.KEYDOWN:
...... ...... |
6. 전체 코드
import pygame
SCREEN_WIDTH = 1020
# pygame 초기화 pygame.init()
# 스크린 객체 저장
# FPS를 위한 Clock 생성 FPS = 60
BACKGROUND_COLOR = pygame.Color('white')
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): super(AnimatedSprite, self).__init__()
# 이미지를 Rect안에 넣기 위해 Rect의 크기 지정
# 여러장의 이미지를 리스트로 저장한다. 이미지 경로는 자신들의 경로를 사용한다. # 서있는 상태 0 ~ 10
# rect 만들기
# 원본 캐릭터 이미지들
# 캐릭터의 현재 상태
# 캐릭터의 첫번째 이미지
# 1초에 보여줄 1장의 이미지 시간을 계산, 소수점 3자리까지 반올림
def update(self, mt):
# 현재 상태에 따라 반복해줄 이미지의 index 설정과 속도
# 방향이 오른쪽이면, 오른쪽 이미지 선택
# loop 시간 더하기
# idle 상태는 0 ~ 9, 걷기 상태는 10 ~ 19
self.image = self.images[self.index]
# 좌우 위치값 변경, 이동
def main(): # player 생성
running = True
# 각 loop를 도는 시간. clock.tick()은 밀리초를 반환하므로 mt = clock.tick(60) / 1000
elif event.type == pygame.KEYDOWN:
# all_sprites 그룹안에 든 모든 Sprite update
if __name__ == '__main__': |
7. 실행 결과
좌우로 방향 전환할 때, 위치가 변하는 것은 이미지 자체에 앞쪽 흰 공백 때문이다.
좀 더 정밀하게 좌우 방향 전환을 하려면, 이미지의 공백 부분을 제거하고 캐릭터의 중심을 이미지 전체에 똑같이 유지시켜야 한다.