글 작성자: Doublsb


전 시간 자료 : http://doublsb.tistory.com/56

저번 시간에는 타이틀에 선택지를 추가하고, 삭제해 보았다.


이번 시간에는 아예 타이틀 화면 없이, 맵에서부터 게임을 시작할 수 있게 해 보자.




Scene_Title 스크립트가 어떻게 시작하는지 기억하는가? 기억나지 않아도 좋다.

한번 구문을 하나씩 보면서, 어떻게 해야 맵부터 게임을 시작할 수 있을지 보도록 하자.


  

def start

    super    : Scene_Base의 start 메소드를 불러온다.

    SceneManager.clear    : SceneManager를 초기화한다.

    Graphics.freeze    : 그래픽을 잠시 멈춘다.

    create_background    : 배경화면을 생성한다.

    create_foreground    : 전경화면을 생성한다.

    create_command_window    : 타이틀 커맨드 선택지를 만든다.

    play_title_music    : 타이틀 음악을 재생한다.

  end 



이 중 맵부터 시작한다고 하면, 필요 없는 부분은 어떤 부분일까?

배경화면 생성하기, 전경화면 생성하기, 타이틀 커맨드 선택지 만들기, 타이틀 음악 재생하기는 전부 필요 없는 부분이다.


그래서 이 네가지 구문은 지우기로 한다.



  

def start

    super

    SceneManager.clear

    Graphics.freeze

  end 



안타깝게도, 이대로 실행하면 그저 검은 화면만 나오고, 어떠한 조작도 하지 못한다.

이 상태에서 바로 맵으로 넘어가려면 어떻게 해야 하는 걸까?


답은 command_new_game에 있다.

우리가 게임을 처음 시작하는 선택지를 눌렀을 때를 start 메소드에 집어넣으면 된다.


우선 command_new_game의 내용을 보자.



def command_new_game

    DataManager.setup_new_game    : 데이터매니저가 새 게임을 실행하도록 한다.

    close_command_window    : 윈도우 커맨드를 닫는다.

    fadeout_all    : 모든 화면을 보이지 않게 한다.

    $game_map.autoplay    : 게임 시작 맵의 시작 BGM등을 재생한다.

    SceneManager.goto(Scene_Map)    : 씬매니저에게 Scene_Map으로 이동하라 명령한다.

  end



이를 start 메소드에 집어넣을 때, 필요 없는 내용은 무엇일까?

윈도우 커맨드를 닫는 close_command_window가 필요 없다. 커맨드를 만들지도 않았는데 닫을 수는 없으니 말이다.

모든 화면을 잠시 보이지 않게 하는 fadeout_all도 필요 없다.


그럼 이를 start 메소드에 넣어 수정하자.



  

def start

    super

    SceneManager.clear

    Graphics.freeze

    DataManager.setup_new_game

    $game_map.autoplay

    SceneManager.goto(Scene_Map)

  end 



아쉽게도 이대로 수정하면 문제가 생긴다. 오류의 내용은 다음과 같다.


Script 'Scene_Title' line 70: NoMethodError occurred.

undefined method 'bitmap' for nil:NilClass


Scene_Title 스크립트의 70번째 줄에 메소드 에러가 생겼다는 오류이다. (수정한 스크립트마다 줄은 다를 수 있다)

bitmap을 찾을 수가 없다고 한다. 이게 무슨 말이야? 하면서 70번째 줄로 달려가 보자.


  

def dispose_background

    @sprite1.bitmap.dispose

    @sprite1.dispose

    @sprite2.bitmap.dispose

    @sprite2.dispose

  end 



오류는 sprite1의 bitmap을 없앨 때 일어났다. 우리가 sprite1을 선언하지도 않은 채로 bitmap을 없애라고 하니까, 문제가 생긴 거다.

'근데 이상하네? 나는 dispose_background라는 명령을 내린 적이 없는데.' 라고 생각할 수 있다.


하지만 스크립트는 사실 명령을 내렸다. 바로 terminate 메소드에서 내렸다.

안타깝게도 씬은 다른 씬으로 전환할 때 자동적으로 terminate 메소드를 실행한다. 그러니 terminate 메소드를 수정하러 가야 한다.



  

  def terminate

    super

    SceneManager.snapshot_for_background

    dispose_background

    dispose_foreground

  end



terminate 메소드는 다음과 같이 이루어져 있다. 이 중 dispose_background와 dispose_foreground가 문제가 되는 부분이다.

우리는 배경화면과 전경화면을 만들지도 않았는데, 자동으로 없애라고 하니 문제가 생긴 것이다.

그럼 저 부분만 삭제하면 우리의 문제는 해결된다.



  

  def terminate

    super

    SceneManager.snapshot_for_background

  end



완벽하군! 이제 수정이 끝났으니 게임을 실행해 보자.

타이틀 화면은 나오지도 않고, 새 게임을 맵에서부터 시작할 수 있을 것이다.






요약


1. Scene_Title 스크립트의 start 메소드를 다음과 같이 수정한다.


def start

    super

    SceneManager.clear

    Graphics.freeze

    DataManager.setup_new_game

    $game_map.autoplay

    SceneManager.goto(Scene_Map)

  end


2. terminate 메소드를 다음과 같이 수정한다.


def terminate

    super

    SceneManager.snapshot_for_background

  end

반응형