이전프로젝트는게임이아니라이미지한장같아보인다.출력을바꾸는입력이나처리가없기때문이다.물론,윈도우의종료버튼을누르는것은고려되지않는다(프로그램을종료하는것에불과하므로)。우선,우리는“你好,世界!”가자동적으로움직이게할것이다.그러면이제프로젝트는이미지한장이아닌애니메이션같아보일것이다.어떻게텍스트를움직일까?우리는텍스트의위치가初始语句에서초기화됨을알고있다。그렇다면,이위치가始终声明에서업데이트되게하면된다。물론,추가적인변수가필요할것이다.

../../../../_images/Bagic-PROCESS-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-PROCESS-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-PROCESS-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-PROCESS-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()

(Moving World프로젝트의소스코드일부와실행결과)

(Moving World가알카노이드의공이나DVD화면보호기처럼움직인다。)

#1-#5가初始문의뒷부분에추가되었다。또한,다중If-Else문은Always문의앞부분에추가되었고,#11이Always문의뒷부분에추가되었다.#2-#10이무엇을처리하는지는쉽다。Always문이시작될때Moving World의좌표에해당되는변수를바꾸고있다。하지만문제가있다.移动世界는얼마나빠를까?移动世界의변위는루트2임은확실하다。(피타고라스정리를이용하면)하지만얼마나자주Moving World의변위가바뀌는가?이것은Always문의시간복잡도를분석하지않는이상알아낼수없다。(이것은Always문이시작하는빈도에따라달라지므로)그리고시간복잡도는컴퓨터마다다르다.그래서이시간은고정될수없다.

우리는이프로젝트의고정속도이라는개념을추가해야한다.어떻게?#1과#11을보면,初始语句에pygame.time.Clock()함수가,Always문에Tick(60)함수가있음을확인할수있다。60이라는수는여기서FPS(每秒帧)를의미한다。FPS가1초에화면이얼마나자주바뀌는지를의미한다。화면을바꾸는(업데이트하는)파이게임의함수는무엇인가?바로PyGame.display.UPDATE()함수이다그러므로,fps는1초에Always문이실행되는횟수를의미하게된다。이는Always문속에는단하나의pygame.display.update()함수가존재하기때문이다。Fps는일종의선택적인딜레이함수와같은기능(프로그램처리속도에따라)을한다,선택적인가속함수가아니므로,fps값이너무크면fps대로작동하지않을수있다。우리가프로젝트내에서시간(Fps)을고정시켜두면,특정게임오브젝트의적절한변위만찾아내면그오브젝트의속도를정할수있다.Pygame.time.Clock()은게임이시작되기이전속도를고정시키는기능을한다。勾选함수는pygame.display.update()보다나중에와야한다。왜냐하면Tick함수는화면이몇번업데이트되었는지를계산하기때문이다.함수보다나중에실행되야하는몇안되는함수중하나이다()。

화면이업데이트될때,시간을고정하는방법을알았다.정지된화면보다는정신없이움직이는화면이게임에선많으므로,이를반드시알고있어야한다.그러나,이프로젝트는결과가너무쉽게예측되기때문에게임이아닌것처럼보인다는단점은아직도있다.(결과를바꿀입력이없으므로)이젠,입력로직이추가되어야만한다.

<참고코드>::

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("Moving World Project")
myScreen = pygame.display.set_mode((640, 480))
myTextFont = pygame.font.Font("HoonWhitecatR.ttf", 32)
myText = myTextFont.render("Moving World!", True, red, green)
myTextArea = myText.get_rect()
myTextArea.center = (320, 240)
fpsClock = pygame.time.Clock() #1
x = 0 #2
y = 0 #3
moveRight = 1 #4
moveUp= 1 #5

while True:
    if (moveRight == 1): #6
        x = x + 1
        if (x >= 320 - 75):
            moveRight = 0
    elif (moveRight == 0): #7
        x = x - 1
        if (x <= -320 + 75):
            moveRight = 1

    if (moveUp == 1): #8
        y = y + 1
        if (y >= 240 - 15):
            moveUp = 0
    elif (moveUp == 0): #9
        y = y - 1
        if (y <= -240 + 15):
            moveUp = 1



myTextArea.center = (320 + x, 240 + y) #10

myScreen.fill(white)
myScreen.blit(myText, myTextArea)

for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
        sys.exit()

pygame.display.update()
fpsClock.tick(60) #11



Edit on GitHub