pygame에서 단순히 창을 띄우는 것이 목적이 아닌 엄밀히 game이기에 동적인 것을 구현하려 할 것이다.
이번 글에서는 움직이는 그림에 대한 처리에 대해 다룬다.
1) 화면 갱신( pygame.display.update() )
#플레이어가 WASD를 누르면 그 방향으로 움직이는 예제
import pygame
import sys
BLACK=(0,0,0)
screenw,screenh,FPS=700,700,80
PLAYER_SIZE=(60,60)
def create_player(image_path, initial_position):
player_image = pygame.transform.scale(pygame.image.load(image_path), PLAYER_SIZE)
player_rect = player_image.get_rect(center=initial_position)
return player_image, player_rect
def main():
pygame.init()
screen=pygame.display.set_mode((screenw,screenh))
pygame.display.set_caption("drawing_order2")
clock=pygame.time.Clock()
player1_image, player_rect1 = create_player(
"player.png",(screenw//3,screenh//2)
)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(BLACK)
key=pygame.key.get_pressed()
if key[pygame.K_a]:
player_rect1.x-=5
if key[pygame.K_d]:
player_rect1.x+=5
if key[pygame.K_w]:
player_rect1.y-=5
if key[pygame.K_s]:
player_rect1.y+=5
screen.blit(player1_image,player_rect1)
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()
pygame에서 움직이는 코드에 대한 피드백을 하려면 모든 그리기 함수가 호출된 후일 것이다. 이때에 while안에 pygame.display.update()나 pygame.display.flip()을 호출해야 while안에 코드를 첨부터 끝까지 읽고 화면에 최종 상태가 반영된다.
이 코드가 빠진다면 화면 갱신이 안되기에 들어가 줘야한다.
2) 배경 처리( screen.blit(background,(0,0)) / screen.fill(color) etc.. )
screen.fill(BLACK)를 배경이라고 한다면 이 또한 while 안에 들어가야 하는데, 이 코드가 while 밖에 있다면 어떻게 될까?
#바꾼 예시
screen.fill(BLACK)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(BLACK)이 while 루프 밖에 있을 경우, 영상과 같이 이전의 플레이어의 잔상이 화면을 뒤덮게 된다.
이런 현상이 일어나는 이유는 코드 실행 시에 배경을 한 번만 채우고 이후에는 화면을 업데이트할 때 배경이 덮어지지 않기에 생긴다. 즉, 게임 캐릭터가 이동하는 등 변화가 있을 때, 그 배경이 갱신되지 않아서 덮어지는 결과가 발생한다.
만약 움직이는 것이 플레이어뿐만 아니면 어떻게 될까? 배경이 갱신되지 않아서 이상한 결과가 발생할 수 있다.
그렇기에 배경에 해당하는 코드까지 while 루프 안에 있어야 매번 새로 배경을 채우면서 게임 오브젝트들을 올바르게 업데이트할 수 있다.
3) FPS( clock.tick(FPS) )
clock.tick(FPS)는 게임의 프레임 속도를 설정하는 코드이다. 여기서 FPS 값은 1초에 얼마나 화면을 업데이트할지 설정하는 값이다. 적절한 FPS 값을 설정하는 것은 게임의 부드러움과 성능에 큰 영향을 미치므로, 자신이 개발하는 프로젝트에 맞는 최적의 값으로 조정하는 것이 중요하다. 높은 FPS는 개발시에 코드를 많이 실행하기에 컴퓨터에 무리가 축적되기 때문이다.
정리하면, 동적인 그리기를 pygame에서 사용할 경우에
1. while 안에 화면을 갱신하는 함수에 pygame.display.update()나 pygame.display.flip()호출해야한다.
2. 배경을 매 프레임마다 갱신하기 위해서는 배경을 그리는 함수를 while 루프 안에 배치해야 한다.
3. clock.tick(FPS)는 게임의 프레임 속도를 제어하는 함수로, FPS 값에 따라 게임의 실행 속도와 부드러움이 결정된다.
추가로 screen=pygame.display.set_mode((screenw, screenh))이 코드를 반복문 안에 넣으면 화면이 엄청 깜박이니 주의하자
그럼 pygame.init()은? pygame.init()을 적은 후로부터 pygame 관련 코드가 작동되기에 screen 등에 오류가 생길 것이다. pygame.init()를 굳이 while 안에 넣으면 screen 등까지도 .while 안에 들어가야하고 이는 while안에 들어가면 생기는 모든 문제를 떠안게 될 것이다.
그럼 clock=pygame.time.Clock()은? 계속 0으로 초기화된다.
그러면 font=pygame.font.SysFont('font',n)의 경우에는? Pygame에서 글꼴 객체를 생성하는 작업은 상대적으로 비용이 많이 들기 때문에 성능 최적화와 코드 가독성을 위해서 위해 밖에 두자.
def main():
pygame.init()
screen=pygame.display.set_mode((screenw, screenh))
pygame.display.set_caption("BASE")
font=pygame.font.SysFont('arial',30)
clock=pygame.time.Clock()
이렇게는 그냥 while 밖에 두자.
'python study > import pygame' 카테고리의 다른 글
python)pygame, font(+개행문자 문제 해결 방법) 텍스트 띄우기(2) (0) | 2024.12.27 |
---|---|
python)pygame, font(+한글 띄우기) 텍스트 띄우기(1) (0) | 2024.12.26 |
python)pygame에서 그림이 그려지는 순서, 제대로 이해하기 (0) | 2024.12.23 |
python)pygame 좌표계의 특성과 컴퓨터 화면 스캔 방식 이해 (0) | 2024.12.23 |
python) pygame 도형 그리기 모음 (1) | 2024.12.21 |