포스트 7에 이어서 Rect 객체를 조작해본다.
Rect 객체 요소들에 값을 할당하면 좌표가 바뀌게 된다. 아래 예제에서는 키보드와 연결시켜서 도형의 위치를 변화시킨다. 게임내 메뉴를 제작할때 사용할 수 있겠다. 내용은 딱히 설명이 필요없다. 오른쪽으로 붙이고 싶으면 윈도우창의 너비를 도형의 오른쪽에 입력한 후 다시 그리면 된다.
import pygame
from pygame.locals import *
from pygame.rect import *
import pyc
size = width, height = 800,600
screen = pygame.display.set_mode(size)
rect1 = Rect(50,60,200,80)
pygame.init()
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key == K_l:
rect1.left = 0
if event.key == K_c:
rect1.centerx = width // 2
if event.key == K_r:
rect1.right = width
if event.key == K_t:
rect1.top = 0
if event.key == K_m:
rect1.centery = height // 2
if event.key == K_b:
rect1.bottom = height
screen.fill(pyc.GRAY)
pygame.draw.rect(screen,pyc.BLUE, rect1)
pygame.display.flip()
pygame.quit()
앞선 포스트에서 다른 메소드를 도형의 연속 이동을 해봤다. 이 예제는 도형을 카피해서 원래 있던 도형은 그대로 있고 새로운 도형이 앞으로 나아가는 것이다. 여기서 dictionary 를 사용하여 키에 이동거리(속도)를 설정한다. 딕셔너리 인덱스는 키보드 입력코드이며 사각형을 이동시키기 위한 벡터를 전달한다. move_ip() 메소드에 전달하는 튜플은 다음 그림과 같다.
K_RIGHT 를 입력할 때 (5,0) 이 대응되는지 알 수 있다. 나머지 키도 방향에 따라 사각형을 이동시킨다. move_ip는 rect 모듈에 이미 만들어진 함수라 편하게 사용하면 된다. 포스트 5처럼 사용자가 만들 수도 있지만 역시 번거롭다. 가급적이면 라이브러리 개발자의 검증된 기능을 사용하는 것을 권장한다.
import pygame
from pygame.locals import *
from pygame.rect import *
import pyc
size = width, height = 800,600
screen = pygame.display.set_mode(size)
rect1 = Rect(50,60,400,210)
rect2 = rect1.copy()
dir = {K_LEFT:(-5,0), K_RIGHT:(5,0), K_UP:(0,-5), K_DOWN:(0,5)}
pygame.init()
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key in dir:
v = dir[event.key]
rect2.move_ip(v)
screen.fill(pyc.GRAY)
pygame.draw.rect(screen,pyc.BLUE, rect1,2)
pygame.draw.rect(screen,pyc.RED,rect2,5)
pygame.display.flip()
pygame.quit()
겹치는 도형의 부분을 특정해낼 수 있다. 또 합친 부분도 만들어 낼 수 있다. 캐릭터가 겹친 부분에 대한 처리도 필요하다. clip 메소드로 겹치는 Rect 객체를 만들어 낼 수 있다. (교집합: 작은 초록색 사각형) 또한 union 메소드는 합집합을 만들어낸다. 합집합이라기 보다는 가장 큰 가장자리를 활용해 더 큰 사각형을 만든것이다. 그림으로 보면 무슨말인지 알수 있을 것이다. 사각형 네개를 색칠한다. 가장큰 노란색을 먼저 칠해야 다른 사각형이 보인다. 마치 레이어처럼 칠하는 순서에 따라 전의 사각형을 가릴 수 있으니까 주의한다.
import pygame
from pygame.locals import *
from pygame.rect import *
import pyc
size = width, height = 800,600
screen = pygame.display.set_mode(size)
rect1 = Rect(50,60,300,150)
rect2 = Rect(100,20,200,130)
dir = {K_LEFT:(-5,0), K_RIGHT:(5,0), K_UP:(0,-5), K_DOWN:(0,5)}
pygame.init()
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key in dir:
v = dir[event.key]
rect2.move_ip(v)
clip = rect1.clip(rect2)
union = rect1.union(rect2)
screen.fill(pyc.GRAY)
pygame.draw.rect(screen,pyc.YELLOW,union,0)
pygame.draw.rect(screen,pyc.GREEN,clip,0)
pygame.draw.rect(screen,pyc.BLUE, rect1,2)
pygame.draw.rect(screen,pyc.RED,rect2,5)
pygame.display.flip()
pygame.quit()
게임에서 아이템을 이동하거나 그럴 때 마우스를 클릭하여 이동하거나 한다. 그럴때 쓰는 방법과 비슷하다. 드래그해서 마우스를 놓는다. 이벤트 루프(While)에서 마우스를 클릭했을 때 조건문을 검사한다. 사각형 안에 마우스를 클릭한 좌표가 있다면 moving 을 True로 하여 마우스모션 이벤트를 활성화 시킨다. move_ip로 이동을 시키는데 이때 전달되는값은 마우스의 상대적인 값이다. (Relative) 쉽게 말해 마우스가 움직이는 대로 따라간다.
import pygame
from pygame.locals import *
from pygame.rect import *
import pyc
size = width, height = 800,600
screen = pygame.display.set_mode(size)
rect1 = Rect(50,60,300,150)
moving = False
dir = {K_LEFT:(-5,0), K_RIGHT:(5,0), K_UP:(0,-5), K_DOWN:(0,5)}
pygame.init()
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == MOUSEBUTTONDOWN:
if rect1.collidepoint(event.pos):
moving=True
if event.type == MOUSEBUTTONUP:
moving=False
if event.type == MOUSEMOTION and moving:
rect1.move_ip(event.rel)
screen.fill(pyc.GRAY)
pygame.draw.rect(screen,pyc.RED, rect1)
if moving:
pygame.draw.rect(screen,pyc.BLUE,rect1,5)
pygame.display.flip()
pygame.quit()
다음 포스트에 한번 더 Rect 객체를 다루고 이미지로 넘어간다.