[스크립트 005] 맵 씬 스크립트 - 해부편 (1)
이전까지의 글에서는 타이틀 씬을 해부하고, 응용해 보았다.
이번 글에서는 맵 씬(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 메소드를 호출한다.
'프로그래밍 > RPG Maker VXACE' 카테고리의 다른 글
[스크립트 007] 메뉴 호출 키 변경하기와 Input의 이해 (0) | 2018.01.19 |
---|---|
[스크립트 006] 맵 씬 스크립트 - 해부편 (2) (0) | 2018.01.18 |
[스크립트 004] 게임 도중 타이틀 이미지 변경하기 (0) | 2018.01.16 |
[스크립트 003] 타이틀 화면 없애고 맵부터 시작하기 (0) | 2018.01.15 |
[스크립트 002] 타이틀 선택지 추가/삭제하기 (0) | 2018.01.14 |
댓글
이 글 공유하기
다른 글
-
[스크립트 007] 메뉴 호출 키 변경하기와 Input의 이해
[스크립트 007] 메뉴 호출 키 변경하기와 Input의 이해
2018.01.19 -
[스크립트 006] 맵 씬 스크립트 - 해부편 (2)
[스크립트 006] 맵 씬 스크립트 - 해부편 (2)
2018.01.18 -
[스크립트 004] 게임 도중 타이틀 이미지 변경하기
[스크립트 004] 게임 도중 타이틀 이미지 변경하기
2018.01.16 -
[스크립트 003] 타이틀 화면 없애고 맵부터 시작하기
[스크립트 003] 타이틀 화면 없애고 맵부터 시작하기
2018.01.15