저번 글에서는 그리드를 작성해주었는데 이번 글에서는 플레이어가 팽이이기때문에 일정한 궤도를 따라 회전하는 것을 구현하겠습니다.
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
#player의 이미지를 받아온다
self.image = pygame.image.load(path.join(image_folder, 'player_idle1.png')).convert_alpha()
#player를 감싸는 사각형을 생성한다
self.rect = self.image.get_rect()
#player의 회전을 구현하기 위함
self.rotate_angle = 0
#player의 회전 속도
self.rotate_speed = 1
#player의 회전각
self.rotate_angle = 0
#player가 도는 궤도의 반지름
self.orbit_radius = 100
#player의 위치
self.pos_x = 0
self.pos_y = 0
#play가 도는 궤도 중심의 위치
self.orbit_pos_x = 0
self.orbit_pos_y = 0
def update(self):
self.rotate_angle += self.rotate_speed / 100
self.rect.centerx = self.orbit_pos_x + self.orbit_radius * math.cos(self.rotate_angle)
self.rect.centery = self.orbit_pos_y + self.orbit_radius * math.sin(self.rotate_angle)
먼저 player의 class를 구현해주었다. 먼저 player의 이미지, 위치, 회전속도, 회전각 등을 멤버 변수로 넣었고
밑에 update 메소드에는 매 프레임마다 갱신해줘야 되는 값들을 넣어주었다.
밑에 update에 플레이어가 궤도를 따라가는 회전하는 것을 구현해주었다.
이해를 돕기 위해 간단하게 그림을 그려보았습니다. 각도를 일정하게 늘려 가상의 궤도를 일정한 속도로 회전하게 만들어주었다
그리고 클래스 밖에서 player를 생성하기 위해 다음과 같은 코드들을 입력하였다.
# player을 생성
player = Player()
# sprite_group로 선언된 sprite의 Group()에 player를 넣는다.
sprite_group = pygame.sprite.Group()
sprite_group.add(player))
# player의 처음 위치를 화면의 중간으로 설정한다.
player.rect.x = WIDTH / 2
player.rect.y = HEIGHT / 2
# 처음 player가 생성되었을 때 궤도가 정해져있지 않으므로 지정해준다.
player.orbit_pos_x = player.rect.x - player.orbit_radius
player.orbit_pos_y = player.rect.y
# 그리고 game loop에 화면에 player의 sprite를 갱신시킨다
running = True
while running:
sprite_group.draw(game_world)
#가상의 궤도 중간에 점을 찍어 잘 회전하는지 확인해본다.
pygame.draw.circle(game_world, BLACK,[player.orbit_pos_x, player.orbit_pos_y],10)
sprite_group.draw(game_world)
그리고 게임을 실행하니 밑에 그림처럼 궤도를 잘 회전하고 있다.
다음으로는 스페이스 바를 입력했을 때 그 순간 플레이어를 중심으로 새로운 궤도는 원래 궤도를 플레이어의 위치에 대칭시킨 위치로 설정하고 회전방향을 반대로 할 것이다.
위의 그림을 보고 바뀔 위치와 각 등을 이해해보자
먼저 game loop에 스페이스바를 입력했을 때 change_orbit이라는 함수를 불러오게 만들자
# Game loop
running = True
while running:
'''
'''
# Process input (events)
for event in pygame.event.get():
#KEYDOWN 이벤트는 어떤 키가 눌렸을 때 작동하는 이벤트이다.
if event.type == pygame.KEYDOWN:
# 눌린 키가 space바 일 때
if event.type == pygame.K_SPACE:
# player class에 있는 change_orbit()함수를 실행한다.
player.change_orbit()
그리고 class Player에 change_orbit(self)를 추가시켜준다.
def change_orbit(self):
self.orbit_pos_x = self.pos_x * 2 - self.orbit_pos_x
self.orbit_pos_y = self.pos_y * 2 - self.orbit_pos_y
self.rotate_angle += math.pi
self.rotate_speed *= -1
이렇게 했는데 스페이스바 입력시 플레이어가 계속 사라지길래 몇시간 동안 해맸었다.
알고보니 self.pos_x는 아직 갱신해주지 않은 값이여서 계속 0이었는데 그러면 self.orbit_pos_x 가 -self.orbit_pos_x가 되어서 화면 밖으로 나갔던 것이다.
그래서 self.pos_x를 self.rect.centerx로 바꾸고 self.pos_y를 self.rect.centery로 바꿔주자 그리고 이참에 쓰지 않을 것같은 pos_x와 pos_y는 지워주었다. 나중에 필요하면 그때 다시 만들것이다.
def change_orbit(self):
self.orbit_pos_x = self.rect.centerx * 2 - self.orbit_pos_x
self.orbit_pos_y = self.rect.centery * 2 - self.orbit_pos_y
self.rotate_angle += math.pi
self.rotate_speed *= -1
수정 후 코드이다.
'프로그래밍 > pygame' 카테고리의 다른 글
Pygame 도전기 5 - 장애물 만들기 (0) | 2020.01.09 |
---|---|
Pygame 도전기 4 - 맵 짜기 (0) | 2020.01.09 |
Pygame 도전기 - 2(그리드 만들기) (2) | 2020.01.06 |
Pygame 도전기 - 1 (0) | 2019.10.22 |
Pygame에 도전하다 (0) | 2019.10.22 |