7.2 배우들의 움직임과 총알 공격 구현하기
이번 절부터는 이전 절에서 전체적인 구조적 윤곽을 잡으면서 구현체 없이 빈 함수로 만들어 두었던 각 함수들의 구현체를 채우도록 하겠다.
제일 첫번째로 move_player 함수다. 기존 게임들에서는 마우스로만 조작했던 게임이라 키보드 조작에 대해서는 처음 등장하고 있다. 파이게임제로의 편리한 점은 키보드 조작에 대해 on_key_down 콜백함수를 꼭 쓰지 않더라도, update 콜백함수 안에서 특정 키보드의 키들(예를들어 방향키)에 대해 사전 정의된 변수들(예를 들어, keyboard. up/down/left/right 등)을 통해 키의 눌림을 검사할 수 있다는 것이다. 각 방향키의 눌림에 따라 5픽셀 값 만큼의 이동을 만든다. 주인공 비행기는 전후좌우 사방으로 이동이 가능하나 단, 주어진 화면을 넘어서까지의 이동은 막도록 경계를 두는게 필요하다(10~17라인). 이제 이정도 수준의 코딩은 이미 이전 게임들에서 많이 해봤기 때문에 이해나 구현에는 큰 어려움이 없을 것이다.
그 다음, 주인공이 총알발사는 부분인 shoot_bullets 함수를 구현하자. 먼저, 기억해야 할 것은 총알도 크기가 작고 사소해 보여도 총알 한개한개가 다 객체라는 것이다. 사용자가 스페이스바를 눌러 총알을 발생할 때 발생할 수 있는 모든 일련의 작업순서를 생각해보면, 먼저는 총알 발사효과음 내고(3번 라인), 총알 객체를 생성하되(5번 라인), 그 총알의 발사 최초위치는 주인공 비행기에서부터 시작되야 하고(6번 라인), 총날이 날아가야 하는 방향의 각도는 상단전방이다(7번 라인). 총알이 15픽셀씩 이동해 날아가되(10-11라인), 만약, 날아가던 총알이 화면상단 밖으로 넘어가면, 그 총알은 더 이상의 존재의미가 없기 때문에 계속 메모리에 자리를 차지하면서 메모리를 고갈시키지 않도록(참고로 메모리가 full로 다 차면, 프로그램이 갑자기 강제종료될 수 있음) 그런 총알객체는 메모리에서 제거시킨다(12-13번 라인). 메모리에서 제거시키다는 것이 결국 총알객체를 모아놓은 모음인 bullets 리스트 객체 안에서 해당 총알객체를 삭제한다는 것이고, 이를 위해서 리스트 내장메소드 중에 remove 메소드를 사용하면 편리하다(13번 라인).
1회 발사되는 총알개수를 MAX_BULLETS 으로 왜 제약하는지에 궁금할텐데, 그 총알개수 최대값을 검사하는 코드를 제거하고 게임을 실행시켜 보면 왜 그게 필요한지 단번에 이해할게 될 것이다. 우리는 스페이스 바를 아주 잠깐 1회 누른다고 생각하지만, 사실은 update 콜백함수가 초당 60번이나 실행되는(60 FPS) 엄청나게 빠른 속도로 반복해서 불리기 때문에, 스페이스 바가 계속 눌린 상태로 인식되어 생성 총알개수가 순식간에 늘어나 수많은 총알이 한번에 날아가는 것을 볼 수 있다. 이러한 현상은 우리가 적들에게서 지나친 공격적 우위를 점하게 되고, 이는 게임의 난이도를 너무 쉽게 만들어 게임의 재미를 반감시키기 때문에, 게임성을 위해서는 1회 발사되는 총알량을 어느 정도 제한하는 것이 필요하다.
파이게임제로에서 Actor객체의 angle 속성값을 설정할 때의 각도와 direction 속성값을 설정할 때의 각도는 동일한 의미를 갖기 때문에 코드에서 random.randint(-100, -80) 의 의미는 화면 정하단방향(-90도) 주변으로 10도씩 약간의 랜덤한 움직임을 주려는 목적인 것이다.
나머지 2개 함수(check_collision, draw_text)에 대해서는 다음 절에서 계속 설명을 이어나가도록 하겠다. 만약, 공부하다가 코드에 대한 추가적인 문의가 생긴다면, 함께 소통할 채널을 준비해 두었으니 언제든 그곳을 통해 의문점을 함께 해결해 나갈 수 있다는 것을 기억하자.
Last updated