pygame
화면에 그리기
수색…
통사론
- pygame.draw.rect (Surface, color, Rect, width = 0)
- pygame.draw.polygon (표면, 색상, 포인트 목록, 너비 = 0)
- pygame.draw.circle (표면, 색상, 위치, 반지름, 너비 = 0)
- pygame.draw.ellipse (Surface, color, Rect, width = 0)
- pygame.draw.arc (Surface, color, Rect, start_angle, stop_angle, width = 1)
- pygame.draw.line (표면, 색상, 시작점, 끝점, 폭 = 1)
- pygame.draw.lines (표면, 색상, 닫힘, 포인트리스트, 너비 = 1)
- pygame.draw.aaline (Surface, color, startpos, endpos, blend = 1)
- pygame.draw.aalines (표면, 색상, 닫힘, 포인트리스트, 블렌드 = 1)
매개 변수
매개 변수 | 세부 |
---|---|
표면 | 도형을 그릴면. |
색깔 | 빨간색, 녹색 및 파란색 (및 알파)을 나타내는 3 또는 4 정수 시퀀스이며 각 값은 0-255 사이입니다. |
직사각형 | 도형이 그려지는 직사각형 영역입니다. |
폭 | 선의 너비입니다. width = 0 인 경우 도형이 채워집니다. |
포인트리스트 | 임의의 양의 점 / 꼭짓점 목록 (픽셀 (x, y))입니다. |
pos | 원의 중심 위치 (픽셀 단위)입니다 (x, y). |
반지름 | 원의 반경 (픽셀 단위)입니다. |
닫은 | true 인 경우 마지막 점과 첫 번째 점 사이의 선이 그려져 도형이 닫힙니다. |
블렌드 = 1 | true 인 경우, 쉐이드는 기존의 픽셀 쉐이드와 겹쳐 쓰지 않고 블렌드됩니다. |
start_angle | 원호의 초기 각도입니다 (라디안 단위). |
stop_angle | 호의 최종 각도입니다 (라디안 단위). |
start_pos | 선의 시작 위치 (픽셀 단위)입니다. |
end_pos | 선의 끝 위치 (픽셀 단위)입니다. |
그리기 모듈로 그리기
파이 게임에는 표면에 직접 셰이프를 그릴 수있는 함수가 들어있는 pygame.draw
모듈이 있습니다.
기능 | 기술 |
---|---|
pygame.draw.rect | 직사각형 모양을 그리다. |
pygame.draw.polygon | 여러면을 가진 모양을 그리시오. |
pygame.draw.circle | 점 둘레에 원을 그린다. |
pygame.draw.ellipse | 직사각형 안에 둥근 모양을 그리시오. |
pygame.draw.arc | 타원의 부분 부분 그리기 |
pygame.draw.line | 직선을 그린다. |
pygame.draw.lines | 연속 된 여러 선분 그리기 |
pygame.draw.aaline | 훌륭한 안티 앨리어스 라인을 그려라. |
pygame.draw.aalines | 연결된 에일 리어 징 제거 된 선을 긋는다. |
모듈 사용 방법
모듈을 사용하려면 먼저 파이 게임을 가져 와서 초기화하고 디스플레이 모드를 설정해야합니다. 색상 상수를 미리 정의하여 코드를보다 읽기 쉽고 아름답게 만드는 것이 편리합니다. 모든 함수는 Pygame Rect 또는 2 요소 정수 / float 시퀀스 ( pygame.draw.circle
은 정의되지 않은 이유로 만 정수를 취합니다) 인 색상 및 위치 인수를 그릴 Surface를 사용합니다.
예
아래의 코드는 모든 다른 기능, 사용 방법 및 모양을 보여줍니다. 예제 전에 파이 게임을 초기화하고 몇 가지 상수를 정의합니다.
import pygame
from math import pi
pygame.init()
screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0)
검은 색은 서페이스의 기본 색으로 그려지지 않은 서페이스의 부분을 나타냅니다. 각 기능의 매개 변수는 아래의 매개 변수 에서 설명합니다.
직사각형
size = (50, 50)
rect_border = pygame.Surface(size) # Create a Surface to draw on.
pygame.draw.rect(rect_border, RED, rect_border.get_rect(), 10) # Draw on it.
rect_filled = pygame.Surface(size)
pygame.draw.rect(rect_filled, RED, rect_filled.get_rect())
다각형
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)] # The corner points of the polygon.
polygon = pygame.Surface(size)
pygame.draw.polygon(polygon, RED, points, 10)
polygon_filled = pygame.Surface(size)
pygame.draw.polygon(polygon_filled, RED, points)
원
size = (50, 50)
radius = 25
circle = pygame.Surface(size)
pygame.draw.circle(circle, RED, (radius, radius), radius, 10) # Position is the center of the circle.
circle_filled = pygame.Surface(size)
pygame.draw.circle(circle_filled, RED, (radius, radius), radius)
구멍은 파이 게임의 그리기 알고리즘의 불행한 결과입니다.
타원
size = (50, 25) # Minimize it's height so it doesn't look like a circle.
ellipse = pygame.Surface(size)
pygame.draw.ellipse(ellipse, RED, ellipse.get_rect(), 5)
ellipse_filled = pygame.Surface(size)
pygame.draw.ellipse(ellipse_filled, RED, ellipse.get_rect())
구멍은 파이 게임의 그리기 알고리즘의 불행한 결과입니다.
호
size = (50, 50)
arc = pygame.Surface(size)
pygame.draw.arc(arc, RED, arc.get_rect(), 0, pi) # 0 to pi is 180° creating a half circle.
선
size = (50, 50)
line = pygame.Surface(size)
pygame.draw.line(line, RED, (0, 0), (50, 50)) # Start at topleft and ends at bottomright.
윤곽
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]
lines = pygame.Surface(size)
pygame.draw.lines(lines, RED, False, points)
lines_closed = pygame.Surface(size)
pygame.draw.lines(lines_closed, RED, True, points)
안티 앨리어스 라인
size = (50, 50)
antialiased_line = pygame.Surface(size)
pygame.draw.aaline(antialiased_line, RED, (0, 0), (50, 50))
앤티 엘리 어싱 된 라인
size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]
antialiased_lines = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines, RED, False, points)
antialiased_lines_closed = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines_closed, RED, True, points)
그것을 밖으로 시도하십시오
직접 해보기 : 위의 코드 스 니펫 중 하나와 아래 코드를 빈 파일에 복사하고 이름 이미지 를 blit 및 실험하려는 곡면 이름으로 변경하십시오.
import pygame
from math import pi
pygame.init()
screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0)
# But code snippet here
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
screen.blit(image, (25, 25))
pygame.display.update()
표면들
파이 게임에서는 대개 표면을 사용하여 객체의 모양을 나타내고 직사각형은 위치를 나타냅니다. 표면은 색상이나 이미지가 포함 된 빈 종이와 같습니다. 서페이스를 만드는 방법에는 두 가지가 있습니다 : 처음부터 비워 두거나 이미지를로드하는 것입니다.
표면 만들기
Surface를 만들려면 크기가 최소한이어야합니다. 크기는 픽셀 단위로 나타내는 너비와 높이의 2 요소 정수 시퀀스입니다.
Surface를 생성 할 때 비트 심도, 마스크 및 픽셀 당 추가 기능을 제어하거나 비디오 메모리에 이미지를 생성하기 위해 추가 인수를 전달할 수도 있습니다. 이것은이 예제의 범위를 벗어납니다.
size = width, height = (32, 32)
empty_surface = pygame.Surface(size)
pygame.draw
모듈을 사용하여 Surface에 도형을 그리거나 Surface 메서드 fill(color)
를 호출하여 색상으로 fill(color)
있습니다. 인수 color 는 3 또는 4 요소 정수 시퀀스 또는 pygame.Color
객체입니다.
이미지로드
게임에서 자신의 이미지 (스프라이트라고 함)를 사용하고 싶을 때가 많습니다. 이미지를 사용하여 서페이스를 만드는 것은 다음과 같이 쉽습니다.
my_image = pygame.image.load(path_to_image)
이미지의 경로는 상대적이거나 절대적 일 수 있습니다. 성능을 향상 시키려면 일반적으로 이미지를 화면과 동일한 픽셀 형식으로 변환하는 것이 좋습니다. 이는 Surface 메소드 convert()
를 호출하여 수행 할 수 있습니다.
my_image = pygame.image.load(path_to_image).convert()
이미지에 투명도 (알파 값)가있는 경우 대신 convert_alpha()
메서드를 호출하면됩니다.
my_image = pygame.image.load(path_to_image).convert_alpha()
블리 팅
화면을 표시하려면 화면이 화면에 블리트되어야합니다. 블리 팅이란 한 표면에서 다른 표면으로 픽셀을 복사하는 것을 의미합니다 (화면은 표면이기도합니다). 또한 Surface의 위치를 전달해야합니다. Surface는 2 요소 정수 시퀀스 또는 Rect 객체 여야합니다. 서피스의 최상단이 그 위치에 놓입니다.
screen.blit(my_image, (0, 0))
pygame.display.update() # or pygame.display.flip()
화면이 아닌 다른 서페이스로 blit하는 것이 가능합니다. 화면에 blitted 된 것을 표시하려면 pygame.display.update()
또는 pygame.display.flip()
을 호출해야합니다.
투명도
파이 게임에서 지원되는 투명도의 종류는 3 가지입니다 : 컬러 키, 서페이스 알파 및 픽셀 별 알파.
컬러 키
색상을 완전히 투명하게 만들거나보다 정확하게 만들어 색상을 단순히 블리트가되지 않게 만듭니다. 내부에 검은 색 직사각형이있는 이미지가있는 경우 검정색이 블리 트되지 않도록 컬러 키를 설정할 수 있습니다.
BLACK = (0, 0, 0)
my_image.set_colorkey(BLACK) # Black colors will not be blit.
서페이스는 하나의 색상 키만 가질 수 있습니다. 다른 색상 키를 설정하면 이전 색상을 덮어 씁니다. 컬러 키는 다른 알파 값을 가질 수 없으며, 색상을 보이지 않게 할 수 있습니다.
표면 알파
전체 Surface를 알파 값으로 투명하게 만듭니다. 이 방법을 사용하면 다른 알파 값을 가질 수 있지만 전체 표면에 영향을 미칩니다.
my_image.set_alpha(100) # 0 is fully transparent and 255 fully opaque.
픽셀 별 알파
Surface의 모든 픽셀을 개별 알파 값으로 투명하게 만듭니다. 이것은 당신에게 가장 자유와 유연성을 제공하지만 또한 가장 느린 방법입니다. 이 방법은 또한 Surface를 픽셀 당 알파 표면으로 생성해야하며 색상 인수는 네 번째 알파 정수를 포함해야합니다.
size = width, height = (32, 32)
my_image = pygame.Surface(size, pygame.SRCALPHA) # Creates an empty per-pixel alpha Surface.
Color가 네 번째 알파 값을 포함하고 있으면 Surface가 투명도를 그립니다.
BLUE = (0, 0, 255, 255)
pygame.draw.rect(my_image, BLUE, my_image.get_rect(), 10)
다른 곡면과 달리이 곡면 기본 색상은 검은 색이 아니라 투명합니다. 그래서 검은 색 사각형이 사라집니다.
색상환 및 표면 알파 결합
Colorkeys와 Surface alphas는 결합 될 수 있지만 픽셀 별 알파는 결합 될 수 없습니다. 이것은 픽셀 당 표면의 성능이 저하되는 것을 원하지 않는 경우에 유용 할 수 있습니다.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)
전체 코드
이것을 빈 파일에 복사하고 실행하십시오. 1, 2, 3 또는 4 건반을 눌러 이미지를 나타냅니다. 2, 3 또는 4를 여러 번 눌러 더 불투명하게하십시오.
import pygame
pygame.init()
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255, 50) # This color contains an extra integer. It's the alpha value.
PURPLE = (255, 0, 255)
screen = pygame.display.set_mode((200, 325))
screen.fill(WHITE) # Make the background white. Remember that the screen is a Surface!
clock = pygame.time.Clock()
size = (50, 50)
red_image = pygame.Surface(size)
green_image = pygame.Surface(size)
blue_image = pygame.Surface(size, pygame.SRCALPHA) # Contains a flag telling pygame that the Surface is per-pixel alpha
purple_image = pygame.Surface(size)
red_image.set_colorkey(BLACK)
green_image.set_alpha(50)
# For the 'blue_image' it's the alpha value of the color that's been drawn to each pixel that determines transparency.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)
pygame.draw.rect(red_image, RED, red_image.get_rect(), 10)
pygame.draw.rect(green_image, GREEN, green_image.get_rect(), 10)
pygame.draw.rect(blue_image, BLUE, blue_image.get_rect(), 10)
pygame.draw.rect(purple_image, PURPLE, purple_image.get_rect(), 10)
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
screen.blit(red_image, (75, 25))
elif event.key == pygame.K_2:
screen.blit(green_image, (75, 100))
elif event.key == pygame.K_3:
screen.blit(blue_image, (75, 175))
elif event.key == pygame.K_4:
screen.blit(purple_image, (75, 250))
pygame.display.update()