5.4 화면에 파이프(오브젝트) 나타내기와 움직이기

이제 우리는 우리의 게임무대에서 필요한 파이프 객체 배우(Actor)들을 등장시킬 차례이다. 코드를 적기 전에 먼저 이 객체들에 대해 생각해보자. 실제 코딩을 시작하기 전 어떻게 코딩할지를 생각으로 먼저 틀을 잡는게 항상 선행되어야 하는 일인 것이다. 일단 우리에겐 파이프 객체가 2개가 필요하다. 왜냐하면 화면 위쪽에 매달린 파이프와 화면 아래쪽에 붙은 파이프가 필요하고, 두 파이프 사이는 일정한 간격의 공간 존재해야만 하는데, 이 게임의 목적은 플래피버드가 파이프에 닿지 않고, 그 공간을 통과하는 게임이기 때문이다. 마지막으로 파이프 객체들의 움직임(애니메이션)에 대해 생각해보자. 화면 우측 끝에서 등장해 화면 좌측방향으로 움직여가며 화면 좌측 끝까지 이동하여 화면 밖을 빠져나가는 것과 동시에 다시 처음 등장 때처럼 화면우측 끝에서부터 재등장이 필요하다. 다만, 이때 게임의 재미를 위해서는 파이프는 항상 같은 위치에서 등장하면 안되고, 등장 때마다 무작위(랜덤)한위치가 변화를 동반해야만 할 것이다. 이것이 우리의 파이프 객체가 가져야 할 요구사항인 것이다.

자, 이것을 코드로 어떻게 표현할 수 있는지 살펴보자.

TITLE = 'Flappy Bird'
WIDTH = 400
HEIGHT = 708

GRAVITY = 0.3
drop_speed = 0

# Actor 객체들
flappy_bird = Actor('bird1', (75, 350))
top_pipe = Actor('top', (350,0))
bottom_pipe = Actor('bottom', (350, 500))

def draw():
    screen.blit('background', (0, 0))
    flappy_bird.draw()
    top_pipe.draw()
    bottom_pipe.draw()

def update():
    global drop_speed
    drop_speed += GRAVITY
    flappy_bird.y += drop_speed

def on_mouse_down():
    global drop_speed
    drop_speed = -6.5
TITLE = 'Flappy Bird'
WIDTH = 400
HEIGHT = 708

GRAVITY = 0.3
drop_speed = 0
GAP = 140

# Actor 객체들
flappy_bird = Actor('bird1', (75, 350))
top_pipe = Actor('top', (350,0))
bottom_pipe = Actor('bottom', (350, top_pipe.height + GAP))

def draw():
    screen.blit('background', (0, 0))
    flappy_bird.draw()
    top_pipe.draw()
    bottom_pipe.draw()

def update():
    global drop_speed
    drop_speed += GRAVITY
    flappy_bird.y += drop_speed

def on_mouse_down():
    global drop_speed
    drop_speed = -6.5

파이프들 사이에 공간이 확보되었으니 이제 그 다음 요구사항인 파이프들이 플래피버드가 존재하는 방향으로 전진하는 움직임(애니매이션)이 필요하고, 4.2절에서 배운 플래피버드를 애니메이션 시키는 방법과 크게 다르지 않아 코드이해에 어려움은 없을 것이다.

TITLE = 'Flappy Bird'
WIDTH = 400
HEIGHT = 708

GRAVITY = 0.3
drop_speed = 0
GAP = 140
PIPE_SPEED = -3

# Actor 객체들
flappy_bird = Actor('bird1', (75, 350))
top_pipe = Actor('top', (350,0))
bottom_pipe = Actor('bottom', (350, top_pipe.height + GAP))

def draw():
    screen.blit('background', (0, 0))
    flappy_bird.draw()
    top_pipe.draw()
    bottom_pipe.draw()

def update():
    global drop_speed
    drop_speed += GRAVITY
    flappy_bird.y += drop_speed
    top_pipe.x += PIPE_SPEED
    bottom_pipe.x += PIPE_SPEED

def on_mouse_down():
    global drop_speed
    drop_speed = -6.5
TITLE = 'Flappy Bird'
WIDTH = 400
HEIGHT = 708

GRAVITY = 0.3
drop_speed = 0
GAP = 140
PIPE_SPEED = -3

# Actor 객체들
flappy_bird = Actor('bird1', (75, 350))
top_pipe = Actor('top', (350,0))
bottom_pipe = Actor('bottom', (350, top_pipe.height + GAP))

def draw():
    screen.blit('background', (0, 0))
    flappy_bird.draw()
    top_pipe.draw()
    bottom_pipe.draw()

def update():
    global drop_speed
    drop_speed += GRAVITY
    flappy_bird.y += drop_speed
    top_pipe.x += PIPE_SPEED
    bottom_pipe.x += PIPE_SPEED
    
    if top_pipe.right < 0 or bottom_pipe.right < 0: #파이프의 무한순환
        top_pipe.x = WIDTH
        bottom_pipe.x = WIDTH

def on_mouse_down():
    global drop_speed
    drop_speed = -6.5

이제 남은 요구사항은 게임의 재미를 위해 파이프의 재등장시 항상 같은 위치에서 등장하면 안되고, 등장 때마다 무작위(랜덤)한 위치변화를 동반해야만 할 것이다. 이 부분의 코딩은 일단은 뒤에 추가기능 구현으로 미뤄두겠다. 이 책은 순한맛 버전이므로 아무래도 처음에는 최대한 난이도를 최대한 낮춰 배우는 것에 중점을 두는 것이 필요하기 때문이다.

Last updated