생각해보면,우리는무언가를출력하는방법을먼저배우고(“Hello World”를생각해봐라)무언가를입력하는방법은나중에배운다.왜그런가?왜냐면입력은몇몇프로그램에선필수조건이아니지만,출력은모든프로그램에선항상필수조건이기때문이다.(프로그램의정의:0개이상의입력,1개이상의출력)그러나,모든게임은입력이필요하다。그것이우리는“나는게임을Play한다”라고말하는이유이다。玩라는단어는몸의일부분(아마도손가락)을움직인다는뜻이다。어쨌든,이프로젝트가진짜게임이되기위해입력로직을추가해보자.

../../../../_images/Bagic-INPUT-sourcecode1.png
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 220, 140
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("Bagic-INPUT-sourcecode.png")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()
../../../../_images/Bagic-INPUT-resultscreen1.png
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 220, 140
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("Bagic-INPUT-resultscreen.png")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()

(控制世界프로젝트의소스코드일부와실행결과)

(控制世界가키보드방향키를누르면해당방향으로움직인다。)

이전프로젝트와비교하여2개의큰차이점이생겼다.첫째는#5에KEWDOWN이벤트가트리거되었는지아닌지를판단하는것이다.다른줄들은이전의알고리즘의약간다르게동작하도록바꾼것에불과하다.똑같은명령어가Event문앞에있느냐뒤에있느냐결과는완전히달라질수있음을우리는알고있다。좌표를업데이트하는경우,Event문이종료되고이루어짐에주목해라。(세팅된후업데이트된다.(그것이두번째차이점이다.)객체Event.Key는키보드에마지막으로눌린키를의미한다。구체적인키의이름을보아라.K_UP、K_LEFT、K_DOWN、K_RIGHT매우직관적인K_시리즈이다。(Header의pygame.Locals로부터이용할수있다。)다른키의이름으로는K_8、K_a、K_L、K_LCTRL、K_DELETE、L_F4등이있다。이런키들도추가적인도움없이직관적으로이해할수있다.Https://www.pygame.org/docs/ref/key.html#pygame.key.name에서모든키이름목록은확인할수있다.

KEWDOWN은“이키는이전에는눌리지않았지만,지금은눌렸다.”를의미하고,“이전부터지금까지계속눌린채로있다。”를의미하지는않는다.눌려있는경우를다루기위해서는,KEYUP이라는이벤트를추가적으로확인해야한다。(변수와알고리즘이더추가된다)이는심화부분에서다루겠다.

입력을추가하는것은단순히이벤트인자를추가하는것이기때문에쉽다.이제게임프로젝트는완성되었다.왜냐하면프로젝트가출력,처리,입력을가지고있기때문이다.맞는가?아니다.이프로젝트는게임오브젝트간상호작용이전혀없고,플레이규칙(제약조건(惠普、시간등)도없고점수도없다)이없고,즐길것(동기부여요소,입력출력의다양성,컨텐츠)이없기때문에게임이라고불릴수없다.우선,게임의인터페이스/시스템을풍성하게하기위해우리는심화된입력(마우스상태반영),처리(적절한함수화),출력(이미지,소리및내부데이터시각화방법)을알아야한다.물론,기초단계에서의경험이반드시도움이된다.심화단계로가보자!

<참고코드>::

import pygame, sys
from pygame.locals import*

white = (255,255,255)
red = (255,0,0)
green = (0,255,0)
pygame.init()
pygame.display.set_caption("Controlling World Project")
myScreen = pygame.display.set_mode((640, 480))
myTextFont = pygame.font.Font("HoonWhitecatR.ttf", 32)
myText = myTextFont.render("Controlling World!", True, red, green)
myTextArea = myText.get_rect()
myTextArea.center = (320, 240)
fpsClock = pygame.time.Clock()
x = 0
y = 0
moveRight = 0 #1
moveDown = 0 #2

while True:
    moveRight = 0 #3
    moveDown = 0 #4
    myTextArea.center = (320 + x, 240 + y)
    myScreen.fill(white)
    myScreen.blit(myText, myTextArea)

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN: #5
            if event.key == K_UP:
                moveDown = -1
                moveRight = 0
            elif event.key == K_LEFT:
                moveDown = 0
                moveRight = -1
            elif event.key == K_DOWN:
                moveDown = 1
                moveRight = 0
            elif event.key == K_RIGHT:
                moveDown = 0
                moveRight = 1

    if(moveRight == 1): #6
        x = x + 10
    elif(moveRight == -1): #7
        x = x - 10
    if(moveDown == 1): #8
        y = y + 10
    elif(moveDown == -1): #9
        y = y - 10

    pygame.display.update()



Edit on GitHub