글 작성자: Doublsb

이전까지의 글에서는 타이틀 씬을 해부하고, 응용해 보았다.

이번 글에서는 맵 씬(Scene_Map)을 해부하고 응용해볼만한 구문을 찾아 보려 한다.




스크립트 전문


 

#==============================================================================

# ** Scene_Map

#------------------------------------------------------------------------------

#  This class performs the map screen processing.

#==============================================================================


class Scene_Map < Scene_Base

  #--------------------------------------------------------------------------

  # * Start Processing

  #--------------------------------------------------------------------------

  def start

    super

    SceneManager.clear

    $game_player.straighten

    $game_map.refresh

    $game_message.visible = false

    create_spriteset

    create_all_windows

    @menu_calling = false

  end

  #--------------------------------------------------------------------------

  # * Execute Transition

  #    Performs a fade in when the screen has been blacked out, such as

  #    immediately after a battle or load. 

  #--------------------------------------------------------------------------

  def perform_transition

    if Graphics.brightness == 0

      Graphics.transition(0)

      fadein(fadein_speed)

    else

      super

    end

  end

  #--------------------------------------------------------------------------

  # * Get Transition Speed

  #--------------------------------------------------------------------------

  def transition_speed

    return 15

  end

  #--------------------------------------------------------------------------

  # * Pre-Termination Processing

  #--------------------------------------------------------------------------

  def pre_terminate

    super

    pre_battle_scene if SceneManager.scene_is?(Scene_Battle)

    pre_title_scene  if SceneManager.scene_is?(Scene_Title)

  end

  #--------------------------------------------------------------------------

  # * Termination Processing

  #--------------------------------------------------------------------------

  def terminate

    super

    SceneManager.snapshot_for_background

    dispose_spriteset

    perform_battle_transition if SceneManager.scene_is?(Scene_Battle)

  end

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    super

    $game_map.update(true)

    $game_player.update

    $game_timer.update

    @spriteset.update

    update_scene if scene_change_ok?

  end

  #--------------------------------------------------------------------------

  # * Determine if Scene Transition Is Possible

  #--------------------------------------------------------------------------

  def scene_change_ok?

    !$game_message.busy? && !$game_message.visible

  end

  #--------------------------------------------------------------------------

  # * Update Scene Transition

  #--------------------------------------------------------------------------

  def update_scene

    check_gameover

    update_transfer_player unless scene_changing?

    update_encounter unless scene_changing?

    update_call_menu unless scene_changing?

    update_call_debug unless scene_changing?

  end

  #--------------------------------------------------------------------------

  # * Update Frame (for Fade In)

  #--------------------------------------------------------------------------

  def update_for_fade

    update_basic

    $game_map.update(false)

    @spriteset.update

  end

  #--------------------------------------------------------------------------

  # * General-Purpose Fade Processing

  #--------------------------------------------------------------------------

  def fade_loop(duration)

    duration.times do |i|

      yield 255 * (i + 1) / duration

      update_for_fade

    end

  end

  #--------------------------------------------------------------------------

  # * Fadein Screen

  #--------------------------------------------------------------------------

  def fadein(duration)

    fade_loop(duration) {|v| Graphics.brightness = v }

  end

  #--------------------------------------------------------------------------

  # * Fadeout Screen

  #--------------------------------------------------------------------------

  def fadeout(duration)

    fade_loop(duration) {|v| Graphics.brightness = 255 - v }

  end

  #--------------------------------------------------------------------------

  # * Screen Fade In (White)

  #--------------------------------------------------------------------------

  def white_fadein(duration)

    fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, 255 - v) }

  end

  #--------------------------------------------------------------------------

  # * Screen Fade Out (White)

  #--------------------------------------------------------------------------

  def white_fadeout(duration)

    fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, v) }

  end

  #--------------------------------------------------------------------------

  # * Create Sprite Set

  #--------------------------------------------------------------------------

  def create_spriteset

    @spriteset = Spriteset_Map.new

  end

  #--------------------------------------------------------------------------

  # * Free Sprite Set

  #--------------------------------------------------------------------------

  def dispose_spriteset

    @spriteset.dispose

  end

  #--------------------------------------------------------------------------

  # * Create All Windows

  #--------------------------------------------------------------------------

  def create_all_windows

    create_message_window

    create_scroll_text_window

    create_location_window

  end

  #--------------------------------------------------------------------------

  # * Create Message Window

  #--------------------------------------------------------------------------

  def create_message_window

    @message_window = Window_Message.new

  end

  #--------------------------------------------------------------------------

  # * Create Scrolling Text Window

  #--------------------------------------------------------------------------

  def create_scroll_text_window

    @scroll_text_window = Window_ScrollText.new

  end

  #--------------------------------------------------------------------------

  # * Create Map Name Window

  #--------------------------------------------------------------------------

  def create_location_window

    @map_name_window = Window_MapName.new

  end

  #--------------------------------------------------------------------------

  # * Update Player Transfer

  #--------------------------------------------------------------------------

  def update_transfer_player

    perform_transfer if $game_player.transfer?

  end

  #--------------------------------------------------------------------------

  # * Update Encounter

  #--------------------------------------------------------------------------

  def update_encounter

    SceneManager.call(Scene_Battle) if $game_player.encounter

  end

  #--------------------------------------------------------------------------

  # * Determine if Menu is Called due to Cancel Button

  #--------------------------------------------------------------------------

  def update_call_menu

    if $game_system.menu_disabled || $game_map.interpreter.running?

      @menu_calling = false

    else

      @menu_calling ||= Input.trigger?(:B)

      call_menu if @menu_calling && !$game_player.moving?

    end

  end

  #--------------------------------------------------------------------------

  # * Call Menu Screen

  #--------------------------------------------------------------------------

  def call_menu

    Sound.play_ok

    SceneManager.call(Scene_Menu)

    Window_MenuCommand::init_command_position

  end

  #--------------------------------------------------------------------------

  # * Determine if Debug Call by F9 key

  #--------------------------------------------------------------------------

  def update_call_debug

    SceneManager.call(Scene_Debug) if $TEST && Input.press?(:F9)

  end

  #--------------------------------------------------------------------------

  # * Player Transfer Processing

  #--------------------------------------------------------------------------

  def perform_transfer

    pre_transfer

    $game_player.perform_transfer

    post_transfer

  end

  #--------------------------------------------------------------------------

  # * Preprocessing for Transferring Player

  #--------------------------------------------------------------------------

  def pre_transfer

    @map_name_window.close

    case $game_temp.fade_type

    when 0

      fadeout(fadeout_speed)

    when 1

      white_fadeout(fadeout_speed)

    end

  end

  #--------------------------------------------------------------------------

  # * Post Processing for Transferring Player

  #--------------------------------------------------------------------------

  def post_transfer

    case $game_temp.fade_type

    when 0

      Graphics.wait(fadein_speed / 2)

      fadein(fadein_speed)

    when 1

      Graphics.wait(fadein_speed / 2)

      white_fadein(fadein_speed)

    end

    @map_name_window.open

  end

  #--------------------------------------------------------------------------

  # * Preprocessing for Battle Screen Transition

  #--------------------------------------------------------------------------

  def pre_battle_scene

    Graphics.update

    Graphics.freeze

    @spriteset.dispose_characters

    BattleManager.save_bgm_and_bgs

    BattleManager.play_battle_bgm

    Sound.play_battle_start

  end

  #--------------------------------------------------------------------------

  # * Preprocessing for Title Screen Transition

  #--------------------------------------------------------------------------

  def pre_title_scene

    fadeout(fadeout_speed_to_title)

  end

  #--------------------------------------------------------------------------

  # * Execute Pre-Battle Transition

  #--------------------------------------------------------------------------

  def perform_battle_transition

    Graphics.transition(60, "Graphics/System/BattleStart", 100)

    Graphics.freeze

  end

  #--------------------------------------------------------------------------

  # * Get Fade Out Speed

  #--------------------------------------------------------------------------

  def fadeout_speed

    return 30

  end

  #--------------------------------------------------------------------------

  # * Get Fade In Speed

  #--------------------------------------------------------------------------

  def fadein_speed

    return 30

  end

  #--------------------------------------------------------------------------

  # * Get Fade Out Speed for Title Screen Transition

  #--------------------------------------------------------------------------

  def fadeout_speed_to_title

    return 60

  end

end



맵 씬의 스크립트는 34개의 메소드로 이루어져 있다. 

글 하나에 모두 담아내기엔 너무 많은 양이므로, 이번 글에서는 17개의 메소드만 해부해보기로 한다.


배틀 화면, 타이틀 화면으로의 화면 전환과 프레임 업데이트, 화면의 페이드 인과 페이드 아웃, 스프라이트 셋 만들기와 윈도우 만들기가 17개 메소드의 주요 내용이다.


class Scene_Map < Scene_Base에서 맵 씬은 씬 베이스의 하위 클래스임을 확인할 수 있다.




Start Processing


함수 목적 : 맵 씬(Scene_Map)을 불러왔을 때, 제일 먼저 시작되는 메소드. 주로 씬을 이동했으니 초기화 작업을 한다.


함수 내용

  def start

    super

    SceneManager.clear

    $game_player.straighten

    $game_map.refresh

    $game_message.visible = false

    create_spriteset

    create_all_windows

    @menu_calling = false

  end


설명

(1) super

제일 먼저 맵 씬을 불러오게 되면, Scene_Base의 start 메소드를 불러오게 된다. 뷰포트를 변경하는 역할을 한다. 뷰포트의 의미는 생략.


(2) SceneManager.clear

씬 매니저의 내용을 초기화한다. 씬 매니저는 이름답게 현재 사용중인 씬과 다른 씬으로의 이동을 관리하는 역할을 한다.


(3) $game_player.straighten

플레이어 캐릭터의 자세를 교정한다.


(4) $game_map.refresh

game_map 스크립트에 있는 refresh 메소드를 호출하여 맵의 내용을 초기화한다.


(5) $game_message.visible = false

메세지 윈도우를 보이지 않게 한다.


(6) create_spriteset

create_spriteset 메소드를 호출한다.


(7) create_all_windows

create_all_windows 메소드를 호출한다.


(8) @menu_calling = false

메뉴 호출 여부를 초기화한다.





Execute Transition


함수 목적 : 화면이 아예 검은 상태(배틀이나 불러오기 등)에서 맵 씬으로 전환할 때 실행되는 화면전환 메소드.


함수 내용

def perform_transition

    if Graphics.brightness == 0

      Graphics.transition(0)

      fadein(fadein_speed)

    else

      super

    end

  end


설명

(1)  if Graphics.brightness == 0

          Graphics.transition(0)

          fadein(fadein_speed)

만약 화면밝기가 0인 경우, 대기 시간 없이 화면전환한 뒤 기본 시간만큼 페이드 인한다.


(2) else

      super

화면밝기가 0이 아닌 경우, 평소와 같이 대기시간을 가지고 화면전환한다.





Get Transition Speed


함수 목적 : 맵 씬의 화면전환 속도를 입력하는 메소드.


함수 내용

  def transition_speed

    return 15

  end


설명

맵 씬으로 화면전환할 때 걸리는 시간은 15프레임이다. 이 수치는 수정할 수 있다.





Pre-Termination Processing


함수 목적 : 전투 씬, 타이틀 씬으로 이동할 때를 관리하는 메소드.


함수 내용

 def pre_terminate

    super

    pre_battle_scene if SceneManager.scene_is?(Scene_Battle)

    pre_title_scene  if SceneManager.scene_is?(Scene_Title)

  end


설명

(1) pre_battle_scene if SceneManager.scene_is?(Scene_Battle)

만약 배틀 씬으로 화면을 전환한다면, pre_battle_scene 메소드를 호출한다.


(2) pre_title_scene  if SceneManager.scene_is?(Scene_Title)

만약 타이틀 씬으로 화면을 전환한다면, pre_title_scene 메소드를 호출한다.





Termination Processing


함수 목적 : 다른 씬으로 화면전환 할 때 실행되는 메소드.


함수 내용

def terminate

    super

    SceneManager.snapshot_for_background

    dispose_spriteset

    perform_battle_transition if SceneManager.scene_is?(Scene_Battle)

  end


설명

(1) super

Scene_Base에 있는 terminate 메소드를 실행한다. 그래픽을 멈추고 윈도우를 닫은 뒤, 뷰포트를 해제하는 내용이다.


(2) SceneManager.snapshot_for_background

스크린샷을 찍어 임시로 배경화면으로 사용한다. 자연스러운 화면전환을 위해 사용하는 구문.


(3) dispose_spriteset

dispose_spriteset 메소드를 호출한다.


(4) perform_battle_transition if SceneManager.scene_is?(Scene_Battle)

만약 화면전환하려는 씬이 전투 씬이었을 경우, perform_battle_transition 메소드를 실행한다.





Frame Update


함수 목적 : 맵의 내용을 업데이트한다.


함수 내용

 def update

    super

    $game_map.update(true)

    $game_player.update

    $game_timer.update

    @spriteset.update

    update_scene if scene_change_ok?

  end


설명

(1) super

Scene_Base에서 update 메소드를 실행한다. 그래픽을 업데이트하고, 입력이 있는지 확인하고, 윈도우를 업데이트하는 내용이다.


(2) $game_map.update(true)

맵의 내용을 업데이트하도록 한다. 


(3) $game_player.update

플레이어 캐릭터의 내용을 업데이트한다.


(4) @spriteset.update

스프라이트 셋을 업데이트한다.


(5) update_scene if scene_change_ok?

만약 scene_change_ok라는 스위치가 켜져 있으면, update_scene 메소드를 호출한다.





Determine if Scene Transition Is Possible


함수 목적 : scene_change_ok? 값의 내용을 결정한다.


함수 내용

 def scene_change_ok?

    !$game_message.busy? && !$game_message.visible

  end


설명

게임에서 메세지를 사용하고 있는 중이 아니라면, 씬을 바꿔도 된다는 표시를 한다.





Update Scene Transition


함수 목적 : 씬을 업데이트한다.


함수 내용

  def update_scene

    check_gameover

    update_transfer_player unless scene_changing?

    update_encounter unless scene_changing?

    update_call_menu unless scene_changing?

    update_call_debug unless scene_changing?

  end


설명

(1) check_gameover

만약 파티가 전멸 상태인 경우, 게임오버 씬이 되도록 한다.


(2) update_transfer_player unless scene_changing?

씬이 바뀌지 않았을 경우, update_transfer_player 메소드를 호출한다.


(3) update_encounter unless scene_changing?

씬이 바뀌지 않았을 경우, update_encounter 메소드를 호출한다.


(4) update_call_menu unless scene_changing?

씬이 바뀌지 않았을 경우, update_call_menu 메소드를 호출한다.


(5) update_call_debug unless scene_changing?

씬이 바뀌지 않았을 경우, update_call_debug 메소드를 호출한다.





Update Frame (for Fade In)


함수 목적 : 페이드 인을 위해 프레임을 업데이트하는 메소드.


함수 내용

 def update_for_fade

    update_basic

    $game_map.update(false)

    @spriteset.update

  end


설명

(1) update_basic

Scene_Base에서 update_basic 메소드를 호출한다. 그래픽을 업데이트하고, 입력이 있는지 확인하고, 윈도우를 업데이트하는 내용이다.


(2) $game_map.update(false)

게임 맵 내용을 업데이트한다. 괄호 안이 false인 경우, 인터프리터는 업데이트하지 않는다.


(3) @spriteset.update

스프라이트셋을 업데이트한다.





General-Purpose Fade Processing


함수 목적 : 지정한 밝기나 색조가 될 때까지 duration 동안 화면을 업데이트한다.


함수 내용

  def fade_loop(duration)

    duration.times do |i|

      yield 255 * (i + 1) / duration

      update_for_fade

    end

  end





Fadein Screen


함수 목적 : duration 동안 화면을 서서히 페이드인한다.


함수 내용

  def fadein(duration)

    fade_loop(duration) {|v| Graphics.brightness = v }

  end





Fadeout Screen


함수 목적 : duration 동안 화면을 서서히 페이드아웃한다.


함수 내용

  def fadeout(duration)

    fade_loop(duration) {|v| Graphics.brightness = 255 - v }

  end





Screen Fade In (White)


함수 목적 : duration 동안 화면을 서서히 밝은 색으로 페이드인한다.


함수 내용

  def white_fadein(duration)

    fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, 255 - v) }

  end





Screen Fade Out (White)


함수 목적 : duration 동안 화면을 서서히 밝은 색으로 페이드아웃한다.


함수 내용

  def white_fadeout(duration)

    fade_loop(duration) {|v| @viewport.color.set(255, 255, 255, v) }

  end





Create Sprite Set


함수 목적 : 새로운 스프라이트셋을 설정한다.


함수 내용

  def create_spriteset

    @spriteset = Spriteset_Map.new

  end


설명

(1) @spriteset = Spriteset_Map.new

새로운 맵 스프라이트셋을 만든다.





Free Sprite Set


함수 목적 : 만들었던 스프라이트셋을 없앤다.


함수 내용

  def dispose_spriteset

    @spriteset.dispose

  end


설명

(1) @spriteset.dispose

스프라이트 셋을 없앤다.





Create All Windows


함수 목적 : 모든 종류의 윈도우를 만든다.


함수 내용

 def create_all_windows

    create_message_window

    create_scroll_text_window

    create_location_window

  end


설명

create_message_window, create_scroll_text_window, create_location_window 메소드를 호출한다.

반응형