포스트 7에 이어서 Rect 객체를 조작해본다.

 

1. 키보드 입력으로 도형 위치 바꾸기

 

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()

키보드 조작으로 위치변화

 

2. 키보드로 도형 이동시키기

앞선 포스트에서 다른 메소드를 도형의 연속 이동을 해봤다. 이 예제는 도형을 카피해서 원래 있던 도형은 그대로 있고 새로운 도형이 앞으로 나아가는 것이다. 여기서 dictionary 를 사용하여 키에 이동거리(속도)를 설정한다. 딕셔너리 인덱스는 키보드 입력코드이며 사각형을 이동시키기 위한 벡터를 전달한다. move_ip() 메소드에 전달하는 튜플은 다음 그림과 같다.

 

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()

도형 카피해서 이동하기

3. 겹치는 도형의 색상 바꾸기

 

겹치는 도형의 부분을 특정해낼 수 있다. 또 합친 부분도 만들어 낼 수 있다. 캐릭터가 겹친 부분에 대한 처리도 필요하다. 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()

 

4. 마우스로 드래그로 사각형 이동하기

게임에서 아이템을 이동하거나 그럴 때 마우스를 클릭하여 이동하거나 한다. 그럴때 쓰는 방법과 비슷하다. 드래그해서 마우스를 놓는다. 이벤트 루프(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 객체를 다루고 이미지로 넘어간다.

공유하기

facebook twitter kakaoTalk kakaostory naver band