RPGXP [스크립트] 대화창 크기 위치를 내맘대로! 좀더 간단화 시켰습니다.(소형윈도우 네임도 추가)
2006.05.24 09:39
아래 대화창 크기 조절은 쓸데 없이 클래스를 만들어서 했기 때문에
조금 복잡한 감도 있고, 조절 한번 할때마다 오브젝트 생성해야 하기 때문에 여러가지고 안좋은 점이 있는것 같아
간단화 시킨 걸로 새로 올립니다.
여기에다가 아래 천무분서 올리신 대화창에 소형윈도우네임을 참고해서, 좌표 변하는것에 따라 자동으로 변환시키게 했습니다.
윈도우스킨이 바뀌어도 같이 바뀌게 했습니다.
이번 버젼에서 좌표를 바꾸실때는
$message_rep = [x, y, width, height] 로 해주시면 됩니다.
역시 원상태로 바꾸시려면 x에 음수를 넣으시면 됩니다.
소형 윈도우를 사용 하시려면 아래 천무님께서 올린것과 비슷하게
$msg_name = [ 이름, RL ] 로 해주시면 됩니다.
이름 에는 케릭터 이름같은거 넣어주시면 되고
RL부분에는 0이면 메세지 윈도우 왼쪽에 1이면 오른쪽에 배치 됩니다.
소형윈도우가 필요 없을때에는 $msg_name = [ nil, 0 ]이라고 해주시면 됩니다.
그럼 더 공부해서 더 좋은걸 만들어 보도록 하겠습니다. ^^
예제화면
$msg_name = [ "gunmong", 0]
$message_rep = [ 10, 360, 450, 120 ]
문장 : 안녕하세요 xp초보 gunmong입니다.
$msg_name = [ nil, 0]
$message_rep = [ 180, 360, 450, 120 ]
문장 : 헛! 이름이 사라졌습니다.
$msg_name = [ "haha", 1 ]
$message_rep = [ -10, 0, 0, 0]
문장 : haha란 녀석의 기본상태입니다.
윈도우 스킨의 변경 : 'wskin_a'
문장 : 앗 스킨이 바뀌었네요!
※그림파일이 2개밖에 안올라 예제 화면을 두개밖에 못올렸네요 ;;
#sssssssssssssssss 와 #eeeeeeeeeeeeeeee 차이만 추가하시면 됩니다.
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
# 시스템 주위의 데이터를 취급하는 클래스입니다. BGM 등의 관리도 실시합니다.
# 이 클래스의 인스턴스는 $game_system 로 참조됩니다.
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 공개 인스턴스 변수
#--------------------------------------------------------------------------
attr_reader :map_interpreter # 맵 이벤트용 interpreter
attr_reader :battle_interpreter # 배틀 이벤트용 interpreter
attr_accessor :timer # 타이머
attr_accessor :timer_working # 타이머 작동중 플래그
attr_accessor :save_disabled # 세이브 금지
attr_accessor :menu_disabled # 메뉴 금지
attr_accessor :encounter_disabled # 엔카운트 금지
attr_accessor :message_position # 문장 옵션 표시 위치
attr_accessor :message_frame # 문장 옵션 윈도우범위
attr_accessor :save_count # 세이브 회수
attr_accessor :magic_number # magic number -
#ssssssssssssssssssssssssssssssssssssssssssssssssss
attr_accessor :message_rep # 문장 윈도우 재배치 좌표(x, y, width, height)
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
@map_interpreter = Interpreter.new(0, true)
@battle_interpreter = Interpreter.new(0, false)
@timer = 0
@timer_working = false
@save_disabled = false
@menu_disabled = false
@encounter_disabled = false
@message_position = 2
@message_frame = 0
@save_count = 0
@magic_number = 0
#ssssssssssssssssssssssssssssssssssssssssssssssssss
@message_rep = [0, 0, 0, 0] # 문장 윈도우 재배치 좌표 초기화
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
end
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
# 문장 표시에 사용하는 메세지 윈도우입니다.
#==============================================================================
class Window_Message < Window_Selectable
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
def initialize
super(80, 304, 480, 160)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
self.z = 9998
@fade_in = false
@fade_out = false
@contents_showing = false
@cursor_width = 0
self.active = false
self.index = -1
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
# 이름용 소형 윈도우 작성
@name_window = Window_Base.new(80, 240, 160, 48)
@name_window.visible = false
@name_window.back_opacity = 160
@name_window.z = 9999
# 소형윈도우네임 변수 초기화
$msg_name = [ nil , 0]
# 윈도우 좌표 재배치 변수 초기화
$message_rep = [0, 0, 0, 0]
end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
#-------------------------------------------------------------------
# ● 해방
#--------------------------------------------------------------------------
def dispose
terminate_message
$game_temp.message_window_showing = false
if @input_number_window != nil
@input_number_window.dispose
end
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
# 소형윈도우 해방
@name_window.dispose
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
super
end
#--------------------------------------------------------------------------
# ● 메세지 종료 처리
#--------------------------------------------------------------------------
def terminate_message
self.active = false
self.pause = false
self.index = -1
self.contents.clear
# 표시중 플래그를 클리어
@contents_showing = false
# 메세지 콜백을 부른다
if $game_temp.message_proc != nil
$game_temp.message_proc.call
end
# 문장, 선택사항, 수치 입력에 관한 변수를 클리어
$game_temp.message_text = nil
$game_temp.message_proc = nil
$game_temp.choice_start = 99
$game_temp.choice_max = 0
$game_temp.choice_cancel_type = 0
$game_temp.choice_proc = nil
$game_temp.num_input_start = 99
$game_temp.num_input_variable_id = 0
$game_temp.num_input_digits_max = 0
# 골드 윈도우를 개방
if @gold_window != nil
@gold_window.dispose
@gold_window = nil
end
end
#--------------------------------------------------------------------------
# ● 리프레쉬
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
x = y = 0
@cursor_width = 0
# 선택사항이라면 인덴트를 실시한다
if $game_temp.choice_start == 0
x = 8
end
# 표시 기다리는 메세지가 있는 경우
if $game_temp.message_text != nil
text = $game_temp.message_text
# 제어 문자 처리
begin
last_text = text.clone
text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
end until text == last_text
text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
# 편의상,"\\\\" 을 "\000" 에 변환
text.gsub!(/\\\\/) { "\000" }
# "\\C" 를 "\001" 에,"\\G" 를 "\002" 에 변환
text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
text.gsub!(/\\[Gg]/) { "\002" }
# c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
while ((c = text.slice!(/./m)) != nil)
# \\ 의 경우
if c == "\000"
# 본래의 문자에 되돌린다
c = "\\"
end
# \C[n] 의 경우
if c == "\001"
# 문자색을 변경
text.sub!(/\[([0-9]+)\]/, "")
color = $1.to_i
if color >= 0 and color <= 7
self.contents.font.color = text_color(color)
end
# 다음의 문자에
next
end
# \G 의 경우
if c == "\002"
# 골드 윈도우를 작성
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 128 ? 32 : 384
end
@gold_window.opacity = self.opacity
@gold_window.back_opacity = self.back_opacity
end
# 다음의 문자에
next
end
# 개행 문자의 경우
if c == "\n"
# 선택사항이라면 커서의 폭을 갱신
if y >= $game_temp.choice_start
@cursor_width = [@cursor_width, x].max
end
# y 에 1 을 가산
y += 1
x = 0
# 선택사항이라면 인덴트를 실시한다
if y >= $game_temp.choice_start
x = 8
end
# 다음의 문자에
next
end
# 문자를 묘화
self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
# x 에 묘화 한 문자의 폭을 가산
x += self.contents.text_size(c).width
end
end
# 선택사항의 경우
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
self.index = 0
end
# 수치 입력의 경우
if $game_temp.num_input_variable_id > 0
digits_max = $game_temp.num_input_digits_max
number = $game_variables[$game_temp.num_input_variable_id]
@input_number_window = Window_InputNumber.new(digits_max)
@input_number_window.number = number
@input_number_window.x = self.x + 8
@input_number_window.y = self.y + $game_temp.num_input_start * 32
end
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
# 이름이 설정 되어 있는 경우
if $msg_name[0]!= nil
text_buf = Bitmap.new(608, 448)
# 기존 윈도우스킨과 다른경우
if self.windowskin != @name_window.windowskin
@name_window.windowskin = RPG::Cache.windowskin(@windowskin_name)
end
bitmap = Bitmap.new(32, 32)
text_buf.font.size = 18
cx = text_buf.text_size($msg_name[0]).width
@name_window.width = cx + 32
if $msg_name[1] == 0
@name_window.x = self.x
@name_window.y = self.y - 48
else
@name_window.x = self.x + self.width - @name_window.width
@name_window.y = self.y - 48
end
@name_window.contents.dispose if @name_window.contents != nil
@name_window.contents = Bitmap.new(cx, 16)
@name_window.contents.font.size = 18
@name_window.contents.draw_text(0, 0, cx + 8, 16, $msg_name[0])
@name_window.visible = true
# 이름이 설정되어 있지 않은 경우 , 윈도우 소거
else
@name_window.visible = false
end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
end
#--------------------------------------------------------------------------
# ● 윈도우의 위치와 불투명도의 설정
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 16
else
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
# 윈도우 재배치 여부
if $message_rep[0] >= 0
self.x = $message_rep[0]
self.y = $message_rep[1]
self.width = $message_rep[2]
self.height = $message_rep[3]
else
case $game_system.message_position
when 0 # 상
self.y = 16
when 1 # 중
self.y = 160
when 2 # 하
self.y = 304
end
self.x = 80
self.width = 480
self.height = 160
end
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
end
if $game_system.message_frame == 0
self.opacity = 255
else
self.opacity = 0
end
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
@name_window.y = self.y - 32
@name_window.opacity = self.opacity
self.back_opacity = 160
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
# 용명의 경우
if @fade_in
self.contents_opacity += 24
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
@name_window.contents_opacity += 24 if $msg_name[0] != nil
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if self.contents_opacity == 255
@fade_in = false
end
return
end
# 수치 입력중의 경우
if @input_number_window != nil
@input_number_window.update
# 결정
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
$game_variables[$game_temp.num_input_variable_id] =
@input_number_window.number
$game_map.need_refresh = true
# 수치 입력 윈도우를 해방
@input_number_window.dispose
@input_number_window = nil
terminate_message
end
return
end
# 메세지 표시중의 경우
if @contents_showing
# 선택사항의 표시중이 아니면 포즈 싸인을 표시
if $game_temp.choice_max == 0
self.pause = true
end
# 캔슬
if Input.trigger?(Input::B)
if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
$game_system.se_play($data_system.cancel_se)
$game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
terminate_message
end
end
# 결정
if Input.trigger?(Input::C)
if $game_temp.choice_max > 0
$game_system.se_play($data_system.decision_se)
$game_temp.choice_proc.call(self.index)
end
terminate_message
end
return
end
# 페이드아웃중 이외로 표시 기다리는 메세지나 선택사항이 있는 경우
if @fade_out == false and $game_temp.message_text != nil
@contents_showing = true
$game_temp.message_window_showing = true
reset_window
refresh
Graphics.frame_reset
self.visible = true
self.contents_opacity = 0
if @input_number_window != nil
@input_number_window.contents_opacity = 0
end
@fade_in = true
return
end
# 표시해야 할 메세지가 없지만, 윈도우가 가시 상태의 경우
if self.visible
@fade_out = true
self.opacity -= 48
#ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
@name_window.opacity -= 48
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
if self.opacity == 0
self.visible = false
#sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
@name_window.visible = false
#eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
@fade_out = false
$game_temp.message_window_showing = false
end
return
end
end
end
출처 : gunmong