강의노트 파이게임 창

강의노트 • 조회수 374 • 댓글 0 • 수정 2주 전  
  • 파이게임
  • 파이게임

스크린에 그리기

좌표계

좌표계에서 x축은 직교 좌표계와 같지만 y축은 상단이 0이고 다음 그림과 같이 화면 아래로 내려오면 y축은 증가한다.

Surface의 왼쪽 위 모서리는 좌표 (0, 0)입니다. 오른쪽으로 조금 이동하면 (10, 0)이 되고, 그다음 똑같이 아래로 이동하면 (10, 10)이 됩니다. 블리팅할 때 위치 인수는 소스의 왼쪽 위 모서리가 대상에 배치되어야 하는 위치를 나타냅니다.

좌표에 대한 편리한 컨테이너인 Rect가 있습니다. Rect는 기본적으로 이러한 좌표의 직사각형 영역을 나타냅니다. 왼쪽 위 모서리와 크기가 있습니다. Rect에는 이동 및 배치에 도움이 되는 많은 편리한 메서드가 있습니다.

이미지

파이게임에서 이미지는 Surface에 저장된다. 디스플레이 또한, 이미지로 취급된다. 이것이 스크린 매니지먼트를 쉽게한다.

스크린에 무엇을 그리기위해서는 첫 번째로 파일에서 이미지를 읽어온다. surface

Blitting은 한 이미지를 다른 이미지에 나타내는 것으로 프레임마다 조금씩 다른 위치에 배치하여 움직이는 착시현상을 준다.

파이게임에서 창의 크기가 (500,400)이고 pygame.display.set_mode()를 호출하면 왼쪽 위는 (0,0), 오른쪽 위는 (500,0), 왼쪽 아래는 (400,0), 오른쪽 아래는 (500,400)이다.

창크기 조절

import pygame

SCREEN_SIZE = (640. 480)
screen = pygame.display.set_mode(SCREEN_SIZE, pygame.RESIZABLE)
pygame.display.set_caption(’창 크기 조절하기 ∼ !’)
screen.fill((0, 0, 255))
pygame.display.flip()
running = True
while running:
    for event in pygame.event.get( ):
        if event.type== pygame.QUIT:
            running = False
    if event.type == pygame.VIDEORESIZE:
        SCREEN_SIZE_AFTER= event.size
        screen = pygame.display.set_mode(SCREEN_SIZE_AFTER, pygame.RESIZABLE)
        pygame.display.set_caption('창 크기 : ' + str(SCREEN_SIZE) + ' =>' +str(SCREEN_SIZE_AFTER))
        screen.fill((0, 0, 255))
        pygame.display.update()
pygame.quit()

No frame

import pygame

SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, pygame.NOFRAME)
pygame.display.set_caption('No Frame ∼ !’)
screen.fill((0, 0, 255))
pygame.display.flip()

empty surface

import pygame
pygame.init( )

screen_width = 640
screen_height = 480

WHITE= (255, 255, 255)
BLACK= (0, 0, 0)

screen = pygame.display.set_mode( (screen_width, screen_height))

running = True
while running:
    for event in pygame.event.get( ):
        if event.type == pygame.QUIT:
            running = False
    blankSurface = pygame.Surface((int(screen_width*0.8), int(screen_height*0.8)))
    blankSurface.fill(WHITE)
    screen.blit(blankSurface, (int(screen_width*0.1), int(screen_height*0.1)))
    pygame.display.update()

pygame.quit( )

Subsurface

import pygame
from pygame.locals import*

SCREEN_WIDTH = 600
SCREEN_HEIGHT= 400

pygame_init( )

screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption('Subsurface_Test’)
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    red_rect = pygame.Rect(50,50,200, 150)
    blue_rect = pygame.Rect(150, 150, 200, 150)
    red_surface = screen.subsurface(red_rect)
    blue_surface = screen.subsurface(blue_rect)
    red_surface.fill((255 , 0, 0))
    blue_surface.fill((0, 255, 0))
    red_surface = red_surface.copy( )
    blue_surface = blue_surface.copy( )
    screen.blit(red_surface, red_rect)
    screen.blit(blue_surface, blue_rect)
    pygame.display.update( )
pygame.quit( )    
import pygame
from pygame.locals import*

SCREEN_WIDTH = 600
SCREEN_HEIGHT= 400

pygame_init( )

screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption('Subsurface_Test’)
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    red_rect = pygame.Rect(50,50,400, 300)
    blue_rect = pygame.Rect(50, 50, 100, 100)
    
    red_surface = screen.subsurface(red_rect)
    blue_surface = red_surface.subsurface(blue_rect)
    
    red_surface.fill((255 , 0, 0))
    blue_surface.fill((0, 255, 0))
    
    red_surface = red_surface.copy( )
    blue_surface = blue_surface.copy( )
    
    screen.blit(red_surface, red_rect)
    screen.blit(red_surface, blue_rect)
    
    pygame.display.update( )
pygame.quit( )    

화면 업데이트

pygame.display.flip() -> 모든 화면을 업데이트한다.

pygame.display.update() -> 전달되는 인수가 없으면 전체 화면이 업데이트된다. 
                           인수가 전달되면 전달된 인수만 업데이트 된다.

무언가를 부드럽게 움직이는 것처럼 보이게 하려면 한 번에 몇 픽셀씩만 움직이면 됩니다.

이전 글
다음 글
댓글
댓글로 소통하세요.