[Pygame] Momentum Based Movement 관성이 적용된 자연스러운 움직임
Python 2023. 9. 5. 18:12 |반응형
움직이던 물체의 속도가 갑자기 0이 되는 것은 자연스럽지 못하다. 자연스럽게 천천히 멈추는 캐릭터를 만들어 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
import pygame
pygame.init()
pygame.display.set_caption("Super fun game development")
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
running = True
player = pygame.image.load("player.png").convert()
player.set_colorkey(player.get_at((0, 0)))
player_size = (player.get_width()*1.5, player.get_height()*1.5)
player = pygame.transform.scale(player, player_size)
player_pos = player.get_rect()
player_pos.center = (screen.get_width()/2, screen.get_height()/2)
player_speed = 4
player_direction = -1
left_released = False
right_released = False
slipcount = 0
slipduration = 60
# 캐릭터 미끄러지는 동작 관련 변수들.
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
running = False
# 왼쪽, 오른쪽 방향키를 떼는 순간.
if event.type == pygame.KEYUP and event.key == pygame.K_LEFT:
left_released = True
right_released = False
slipcount = 0
elif event.type == pygame.KEYUP and event.key == pygame.K_RIGHT:
right_released = True
left_released = False
slipcount = 0
# 캐릭터의 미끄러지는 동작이 끝나기 전에 반대 방향 키를 누르는 경우에 대비.
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
if player_direction > 0:
player = pygame.transform.flip(player, True, False)
player_direction = -1
player_pos.move_ip(-player_speed, 0)
if keys[pygame.K_RIGHT]:
if player_direction < 0:
player = pygame.transform.flip(player, True, False)
player_direction = 1
player_pos.move_ip(player_speed, 0)
# 왼쪽으로 이동 중 키를 놓았을때 slipduration 프레임 동안 미끄러진다.
if left_released == True:
player_pos.move_ip(-pygame.math.lerp(player_speed, 0, (slipcount/slipduration)), 0)
slipcount += 1
# sliupduration이 지나면 초기화.
if slipcount > slipduration:
slipcount = 0
left_released = False
# 오른쪽으로 이동 중 키를 놓았을때 slipduration 프레임 동안 미끄러진다.
if right_released == True:
player_pos.move_ip(pygame.math.lerp(player_speed, 0, (slipcount/slipduration)), 0)
slipcount += 1
# sliupduration이 지나면 초기화.
if slipcount > slipduration:
slipcount = 0
right_released = False
screen.fill("black")
screen.blit(player, player_pos)
pygame.display.flip()
clock.tick(60)
pygame.quit()
|
이번엔 관성이 적용된 것처럼 천천히 출발하고 천천히 멈추는 캐릭터를 만들어 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import pygame
pygame.init()
pygame.display.set_caption("Super fun game development")
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
running = True
player = pygame.image.load("player.png").convert()
player.set_colorkey(player.get_at((0, 0)))
player_size = (player.get_width()*1.5, player.get_height()*1.5)
player = pygame.transform.scale(player, player_size)
player_pos = player.get_rect()
player_pos.center = (screen.get_width()/2, screen.get_height()/2)
player_direction = -1
player_speed = 0
player_speed_step = 0.1
player_max_speed = 4
# 속도 관련 변수들.
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
if player_direction > 0:
player = pygame.transform.flip(player, True, False)
player_direction = -1
if (abs(player_speed) <= player_max_speed):
player_speed -= player_speed_step
if player_speed < -player_max_speed:
player_speed = -player_max_speed
# 왼쪽 방향키를 누르면 속도가 음의 방향으로 player_speed_step 씩 증가하다
# player_max_speed 에서 멈춘다.
if keys[pygame.K_RIGHT]:
if player_direction < 0:
player = pygame.transform.flip(player, True, False)
player_direction = 1
if (abs(player_speed) <= player_max_speed):
player_speed += player_speed_step
if player_speed > player_max_speed:
player_speed = player_max_speed
# 오른쪽 방향키를 누르면 속도가 양의 방향으로 player_speed_step 씩 증가하다
# player_max_speed 에서 멈춘다.
# 왼쪽으로 가는 도중 오른쪽 방향키를 동시에 누른다고 오른쪽으로 가지는
# 않지만 오른쪽을 바라본다. 하지만 오른쪽으로 가는 도중 왼쪽 방향키를
# 동시에 눌러도 바라보는 방향이 바뀌지는 않는다. 이유는 왼쪽 방향키
# 검사보다 오른쪽 방향키 검사(오른쪽으로 바라보게 하는)가 나중에 오기
# 때문이다. 두 방향 중 나중에 검사하는 오른쪽 방향이 항상 적용되는 것이다.
if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT]:
if player_speed > 0:
player_speed -= player_speed_step
elif player_speed < 0:
player_speed += player_speed_step
# 오른쪽이나 왼쪽 방향키를 누르고 있지 않으면 속도가 0에 가까워진다.
if abs(player_speed) < 0.1:
player_speed = 0
# 속도의 절대값이 0.1보다 작으면 0으로 변경한다.
player_pos.move_ip(player_speed, 0)
screen.fill("black")
screen.blit(player, player_pos)
pygame.display.flip()
clock.tick(60)
pygame.quit()
|
반응형
'Python' 카테고리의 다른 글
[Pygame] Cursor 파이게임 커서 (0) | 2023.09.10 |
---|---|
[Pygame] Joystick 파이게임 조이스틱 (0) | 2023.09.06 |
[Pygame] Look at the Mouse Slowly 파이게임 마우스 따라 천천히 회전하기 (0) | 2023.09.05 |
[Pygame] Look at the Mouse 파이게임 마우스 따라 회전하기 (0) | 2023.09.05 |
[Pygame] Sprite Collision Detection 파이게임 스프라이트 충돌 감지 (0) | 2023.09.04 |