메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Perl로 게임 만들기!

한빛미디어

|

2002-03-25

|

by HANBIT

11,511

저자: 김진중 / 라이센스 : GPSL(http://shovel.dnip.net)

1. 바로 이것! SDL 패키지!

"Perl로 게임 만들기!"라는 제목을 본 순간 "저게 무슨 헛소리인가…" 하고 코웃음을 친 독자분들도 있을 것이다. 훗… 그렇지만 이번엔 필자가 코웃음을 칠 차례다.

필자가 펄을 다루면서 가장 궁금했던 것 중의 하나이자 또 해보고 싶었던 것 중의 하나가 바로 "펄로 게임을 만들 수 있는가?"였다. 그러나 오늘 필자는 이 기사에서 "펄로도 훌륭한 게임을 만들 수 있다!"라고 자신있게 말 할 수 있게 되었다.

이런 생각을 가능하게 해 준 장본인은 바로 SDL 패키지.

오픈소스 프로젝트중에 SDL(Simple DirectMedia Layer)이라는 것이 있다. SDL은 저수준 그래픽 루틴에 접근 할 수 있도록 해 주고, 여러 가지 멀티미디어 프로그래밍도 가능하게 해 주는 라이브러리이다. 한 마디로 윈도우의 "Direct X" 와 비슷하다고 보면 된다. 하지만 이 라이브러리는 윈도우, 리눅스, 맥 OS를 비롯한 BSD 등 많은 운영체제에서 사용 할 수 있는 플랫폼에 구애받지 않는 라이브러리이며 또한 자유롭고 아주 막강한 기능을 가지고 있다 (라고들 한다..^^;;).

이런 막강한 기능을 가진 그래픽 라이브러리인 SDL을 펄용으로 살짝 포장한 것이 바로 SDL::* 패키지이다. 즉 SDL 패키지를 쓰면 막강한 기능을 가진 SDL 라이브러리를 쉽게 사용 할 수 있다는 말이다. 이 패키지로 여러분은 CD, 키보드, 조이스틱, 팔레트등의 조작 뿐만이 아니라 하드웨어 가속 기능까지도 아주 간단하게 사용할 수 있다. 뿐만 아니라 믹서(SDL::Mixer) 모듈을 사용하면 MP3 연주 마저도 단지 몇 줄로 할 수 있기 때문에 그야말로 게임을 위한 슈퍼 패키지라 아니 할 수 없다. ^^/

2. 펄로 게임을 만들면 느리지 않을까?

천만의 말씀! 만만의 콩떡!

물론 C같은 언어로 만든 것 보다는 느리겠지만 웬만한 게임의 경우, 전혀 느리지 않다. 믿어지지 않는가? 그렇다면 다음 사이트를 한 번 방문해 보라. 입이 떡 벌어질 것이다(필자는 턱이 빠질 뻔했다!).

http://www.frozen-bubble.org

자 어떤가? 필자의 말이 허풍은 아니라는 것을 느꼈을 것이다.
어차피 SDL 라이브러리는 C로 작성되어 있기 때문에 그래픽 처리나 기타 멀티미디어 처리에 관해서는 C로 만든거나 펄로 만든 거나 별반 차이가 없다.

그것 뿐만이 아니다. 펄이 어떤 언어인가? 펄은 인터프리트 언어이다.
펄의 이와 같은 성질 덕분에 빠른 프로토타입의 개발을 할 수 있다. 즉 결과를 빨리 볼 수 있다는 것이다. 게다가 펄은 당연히 객체지향 프로그래밍을 할 수 있으며 배우기도 쉽다. 그리고 어차피 상용 프로그램을 만들 것이 아니라면 대체적으로 무지막지하게 큰 프로그램은 되지 않을 터~! 작은 프로그램이라도 C로 게임을 만든다고 생각해보자. 필자는 생각만해도 쓰러질 것 같다.

3. 실전 펄로 게임 만들기

제목은 거창하지만 사실 별 거 없으니 너무 큰 기대는 하지 말기 바란다..^^;

필자가 SDL 패키지를 접하고 perldoc과 샘플 코드를 본 후 약 두 시간 여 만에 만들어 낸 코드이다(필자가 머리가 좀 많이 나쁘다..-_-;;;).

이 프로그램은 화면 하단에 키보드로 입력한 글자를 쓸 수 있고, 화살표키로 Gimp의 마스코트인 wilbur를 움직일 수 있는 겨우 100줄 밖에 안되는 아주 간단한 프로그램이다. 하지만 이 정도를 할 줄 아는 실력이라면 테트리스 정도는 조금만 손보면 뚝딱 만들 수 있을 것이라고 믿어 의심치 않는다.

별로 어려운 것도 없고(원래 펄이 쉽지 않은가!) 주석도 많이 달아 놓았으니 굳이 설명이 필요한 부분이 있을 것 같지는 않으므로 설명은 소스로 대신 하겠다(필자는 주석을 달지 않기로 유명한데 글을 쓰면서 주석 쓰는 버릇을 길렀다. 다행이라고 해야 하나? -_-;;).
#!/usr/bin/env perl

use SDL::App;     # SDL 의 기본적인 모듈 로딩
use SDL::Surface; # 그림 파일을 처리하기 위한 모듈
use SDL::Event;   # 각종 이벤트를 처리하는 모듈
use SDL::Font;    # 그림 파일을 폰트처럼 이용하여 글씨를 쓸 수 있게 해줌

# 글자를 출력할 위치
$text_x = 50;
$text_y = 450;

$text = "";

# wilbur.png 그림을 불러온다.
$img = new SDL::Surface -name => "wilbur.png";
# 배경으로 쓸 back.png 그림 파일을 불러온다.
$back = new SDL::Surface -name => "back.png";

# 화면의 넓이와 높이
$screen_width  = $back->width;
$screen_height = $back->height;

# wilbur.png 파일을 그릴 위치 지정. 정중앙
$img_x = ($screen_width - $img->width) / 2;
$img_y = ($screen_height - $img->height) / 2;

# SDL 환경을 초기화 하고, 화면을 설정
$app = new SDL::App( 
# 하드웨어 가속과 더블버퍼링 이용
      -flags => SDL_HWSURFACE | SDL_DOUBLEBUF,
      -width => $screen_width,   # 화면 넓이 설정
      -height => $screen_height, # 화면 높이 설
      -title => "SDL Perl",      # 창의 타이틀 설정
      -icon => "wilbur.png"      # 아이콘 그림 설정
    );

# 전체 화면 범위
$rect = new SDL::Rect(
      -width => $screen_width,
      -height => $screen_height
    );

# wilbur.png 그림이 그려질 화면 범위
$drect = new SDL::Rect(
      -width => $img->height,
      -height => $img->width,
      -x => $img_x, 
      -y => $img_y
    );

# font.png 파일을 로드해서 폰트를 생성한다.
$font = new SDL::Font "font.png";

# 배경 그림을 버퍼에 전송
$back->blit($rect, $app, $rect);
# wilbur.png 그림을 버퍼에 전송
$img->blit($rect, $app, $drect);

# 화면 버퍼를 표시한다.
$app->flip;

# 이벤트 객체 생성
$e = new SDL::Event;

while (1) {
  $e->wait; # 이벤트를 잡아라! ...^^;
  if ($e->type == SDL_QUIT ) { exit; } # 종료 이벤트가 발생하면 프로그램 종료
  if ($e->type == SDL_KEYDOWN) { # 어떤 키가 눌려지면
    if ($e->key_sym() == SDLK_ESCAPE) { # ESC 키가 눌려지면 종료
      exit;
    } elsif ($e->key_sym() == SDLK_SPACE) { # SPACE 키가 눌려지면 화면 갱신
      $text = "";
      $img_x = ($screen_width - $img->width) / 2;
      $img_y = ($screen_height - $img->height) / 2;
      draw_img(); # 화면 그리는 함수. 맨 끝에 정의 해 놓았다.
    } elsif ($e->key_sym() == SDLK_LEFT) { # 화살표 키가 눌려지면 그 방향으로 wilbur.png 그림 이동
      $img_x -= $img->width;
      draw_img();
    } elsif ($e->key_sym() == SDLK_RIGHT) {
      $img_x += $img->width;
      draw_img();
    } elsif ($e->key_sym() == SDLK_UP) {
      $img_y -= $img->height;
      draw_img();
    } elsif ($e->key_sym() == SDLK_DOWN) {
      $img_y += $img->height;
      draw_img();
    } else { # 다른키가 눌려지면 그 글자를 출력한다.
      if (length($text) <= 20) { # 20글자가 넘으면 처음부터..
        $text .= chr($e->key_sym());
        draw_img();
      } else {
        $text = chr($e->key_sym());
        draw_img();
      }
    }
  }
}

# 화면을 그려주는 허접한 함수
sub draw_img() {
        # wilbur.png 이미지가 그려질 위치 지정
  $drect->x($img_x);
  $drect->y($img_y);
        # 배경을 그리고..
  $back->blit($rect, $app, $rect);
        # 저장되어 있는 글씨를 쓴 다음,
  $app->print($text_x, $text_y, $text);
        # wilbur.png 그림을 그려 넣고
  $img->blit($rect, $app, $drect);
        # 화면 출력.
  $app->flip;
}


[그림] 프로그램 실행화면

멋지다!

4. 맺음말

이번에도 역시 참고한 것은 SDL 패키지의 perldoc만 참고했다. 펄을 쓰는 사람들이 문서를 많이 남기자 않기 때문일까? 아니면 필자가 잘 안쓰는 패키지들만 찾아 다니는 걸까? -_-;; 하지만 대부분의 모듈은 문서화가 상당히 잘 되어 있으므로 그 정도면 충분하다고 생각된다.

이 글을 다 읽은 독자들(특히 펄을 사랑하는 분들)은 흥분의 도가니에 빠져 있을 것이다. 필자도 그랬으니까… 이것 뿐만 아니라 펄에는 Socket 모듈도 있으므로 원한다면 멀티플레이 게임도 만들 수 있을 것이다. 또한 그리 신경쓰지 않아도 멀티플랫폼에 구애받지 않는 프로그램이 될 것이기 때문에 게임 구현보다는 게임 아이디어를 짜 내는 데 더 많은 시간을 쓸 수 있으로 C로 게임 프로그램을 짜는 것 보다 훨씬 좋은 프로그램들을 쉽게 그리고 많이 만들 수 있을 것으로 기대된다.

자~ 이제는 게임도 펄이다!

Happy Hacking !!
김진중님은 매일매일을 숫자와 컴퓨터 프로그래밍으로 보내고 있는 프로그래머로 그들만의 세계에서는 nuthack으로 통합니다. Perl, Python, Ruby 등의 언어를 다루지만, 가장 이쁘고 아름다운 언어는 Perl이라고 우기는 Perl 예찬론자이며 모든 사람들이 Perl의 아름다움에 매료되었으면 하는 Perl 프로그래머입니다.
TAG :
댓글 입력
자료실

최근 본 상품0