6.2 배우들의 움직임 구현하기

이번 절에서 우리는 우리 무대의 등장인물을 각각 움직여 보도록 하겠다. 가장 먼저는 이 게임에서 유일하게 사용자가 조작할 수 있는 반사판을 화면 하단의 좌우방향으로만 움직이되 화면의 끝을 넘어가지는 못하도록 코딩하겠다.

TITLE = 'Breakout'
WIDTH = 800
HEIGHT = 600

GAP_FROM_SCREEN = 50
ball = Actor('ball', (WIDTH / 2, HEIGHT / 2))
bar = Actor('bar', (WIDTH / 2, HEIGHT - GAP_FROM_SCREEN))

# 4행*8열짜리 블록더미 만들기
blocks = []
for block_row in range(4):
    for block_col in range(8):
        block = Actor(
            'block', 
            (block_col * 100, block_row * 32 + GAP_FROM_SCREEN),
            anchor=('left', 'top')
        )
        blocks.append(block)

def draw():
    screen.blit('space', (0, 0))
    ball.draw()
    bar.draw()
    for block in blocks:
        block.draw()
        
def update():    
    # 반사판의 이동을 화면 안에 안에 가두기
    if bar.left < 0:
        bar.left = 0
    if bar.right > WIDTH:
        bar.right = WIDTH

def on_mouse_move(pos):
    x, y = pos
    bar.centerx = x
TITLE = 'Breakout'
WIDTH = 800
HEIGHT = 600

GAP_FROM_SCREEN = 50
ball = Actor('ball', (WIDTH / 2, HEIGHT / 2))
bar = Actor('bar', (WIDTH / 2, HEIGHT - GAP_FROM_SCREEN))

# 4행*8열짜리 블록더미 만들기
blocks = []
for block_row in range(4):
    for block_col in range(8):
        block = Actor(
            'block', 
            (block_col * 100, block_row * 32 + GAP_FROM_SCREEN),
            anchor=('left', 'top')
        )
        blocks.append(block)

# 볼의 초기 (방향이 있는)속도값
vx = 5
vy = -5

def draw():
    screen.blit('background', (0, 0))
    ball.draw()
    bar.draw()
    for block in blocks:
        block.draw()
        
def update():
    global vx, vy
    
    # 반사판의 이동을 화면 안에 안에 가두기
    if bar.left < 0:
        bar.left = 0
    if bar.right > WIDTH:
        bar.right = WIDTH
    
    # 각각의 x와 y 방향으로 거리 vx와 vy만큼 공을 이동시키기
    ball.move_ip(vx, vy)

def on_mouse_move(pos):
    x, y = pos
    bar.centerx = x

그리고, 이를 update 함수 안에 적용하여 초당 60회 호출이 되는(5.2절에서 이미 언급) update 함수 호출 때마다 객체를 계속 이동시키기 위해 41번 라인에 ball 객체가 갖고 있는 move_ip 함수(메소드)를 활용했다. 이 함수의 인자로 우리가 설정한 두축의 초기 속도값을 전달하면, 호출될 때마다 해당 객체의 현재 위치에서 그 속도의 다음위치를 이동시켜주게 된다. 만약 move_ip 함수}를 사용하기 싫으면 그 대신에 다음과 같이 코딩해도 똑같은 의미이고, 결국 ball 객체의 x, y 위치값을 속도 변화량인 vx, vy 만큼 매번 누적변화를 만든다는 의미이다.

ball.x += vx
ball.y += vy

우리는 지난 절에서 많은 것을 배우느라 머리 속에 넣을 것이 많아 약간 피곤(?)해졌을 수 있어서, 여기서 간단히 이정도로 이번 절을 마무리하겠다. 다음 절에서는 더 재미있는 공을 반사시키고, 블록을 격파하는 알고리즘에 대해 배워볼 것이다.

Last updated

Was this helpful?