5.3 화면에 플래피버드(오브젝트)의 자연스러운 움직임 만들기

우리 눈에 플래피버드의 움직임이 자연스럽지 않았던 건 자연에 존재하는 실제 물리법칙 즉 중력과 유사하게 만들지 않았기 때문이다라고도 할 수도 있다. 그래서, 움직임을 실제 중력과 유사하게 구현해 보도록 하자. 우리가 아는 상식에서의 중력은 고정된 일정한 힘이며, 중력에 의해서 물체가 낙하할 때, 물체는 일정한 속도로 낙하하는게 아니라, 가속도가 붙어서 떨어질 때는 점점더 빠르게 떨어진다는 것이다. 따라서 우리도 이 두 가지(중력과 떨어지는 속도)를 두 가지 변수를 사용해 분리하자.

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

GRAVITY = 0.3
drop_speed = 0

flappy_bird = Actor('bird1', (75, 350))

def draw():
    screen.blit('background', (0, 0))
    flappy_bird.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

이처럼 drop_speed 값의 사용처는 update 함수와 on_mouse_down 함수 두 곳에서 함께 사용되고 있다는 것을 알 수 있고, 이러한 이유 때문에 해당 변수는 함수들 바깥쪽 영역에 정의되었다. 이 변수를 사용하는 함수에서의 활용을 유심히 살펴 본다면, 함수 밖에 있는 변수이고 함수 안쪽에서 그 값을 수정하려면 변수명 앞에 global 이라는 키워드(keyword)를 붙혀 함수 도입부분에서 변수명을 선언해야 하는 파이썬 문법이 존재하는 것을 발견할 수 있을 것이다. 그렇다. 파이썬 문법에서는 함수 밖에 존재하는 변수를 활용하고 있다는 의미를 명확하게 하기 위해 변수명 앞에 global(말 그대로 코드전체에서 사용가능한 변수의 의미로)를 붙히게 되어있다는 것을 기억하자. 이러한 변수들을 지칭하는 용어도 global 변수라고 불린다는 것도 함께 기억하자.

참고로 여기서 주의할 것이 있는데 파이썬이 갖는 엄밀히 문법을 따지지 않는 유연성이 장점이면서 동시에 때론 단점인데, 때로는 global 이라는 키워드를 명확히 쓰지 않았음에도 불구하고 실행시 에러없이 잘 실행되기때문에 이 경우, 왜 원하는데로 동작하지 않는지의 논리적 오류를 발견하기가 쉽지 않은 상황은 만날 수도 있으니 주의하도록 하자.

지금까지 플래피버드의 자연스러운 움직임을 만들기 위한 테크닉 적용에 대해 살펴보았고, 이를 통해 새로운 것들(파이썬 문법, 코딩관습 등)을 배울 수 있었다. 이제 다음장에서는 우리 게임무대의 두번째 Actor(배우)인 파이프 객체들을 생성하고 출현시켜 보자.

Last updated