스크립트 대화창에 이름&얼굴 띄우기 새로운방식.
2007.11.05 11:02
extra_vars1 | http://f44.aaa.livedoor.jp/~ytomy/ |
---|---|
extra_vars2 | RPGXP |
extra_vars3 | 대화관련 |
extra_vars4 | 1 |
extra_vars5 | 2 |
extra_vars6 | |
extra_vars7 | |
extra_vars8 | |
extra_vars9 | |
extra_vars10 | |
extra_vars11 | |
extra_vars12 |
메세지 윈도우에 미묘한 기능을 추가하는 스크립트입니다.
이 스크립트에서는 , 아래의 기능을 이용할 수 있습니다.
- 메세지 윈도우 오른쪽 위에 이름을 표시.
- 문장 길이에 맞추어 윈도우 사이즈를 자동조정.
- 얼굴 그래픽을 표시. (그림 사이즈는 임의)
섹션: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 -
attr_accessor :message_auto_adjust # 메세지 윈도우 자동 사이즈 조정
#--------------------------------------------------------------------------
# ● 오브젝트 초기화
#--------------------------------------------------------------------------
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
@message_auto_adjust = true
end
섹션:Window_Message
여기는 기본에서 수정하게 없으면 전부다 복사하시고 뭔가 바뀐게 있으면 붉은부분만 찾아서 수정해주세요.
#==============================================================================
# ■ 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
# 이름용 소형 윈도우 작성
@name_window = Window_Base.new(80, 240, 160, 48)
@name_window.visible = false
@name_window.back_opacity = 160
@name_window.z = 9999
end
#--------------------------------------------------------------------------
# ● 해방
#--------------------------------------------------------------------------
def dispose
terminate_message
$game_temp.message_window_showing = false
if @input_number_window != nil
@input_number_window.dispose
end
@name_window.dispose
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
# 윈도우 초기화
initialize_window
# 문자 보존용 비트 맵 작성
text_buf = Bitmap.new(608, 448)
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
unless $game_system.message_auto_adjust
self.contents = Bitmap.new(width - 32, height - 32)
end
text_buf.font.color = self.normal_color
x = y = max_x = 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
# 편의상 ,"\\" 을 " 00" 에 변환
text.gsub!(/\\/) { " 00" }
# "\C" 을 " 01" 에 ,"\G" 를 " 02" 에 변환
text.gsub!(/\[Cc][([0-9]+)]/) { " 01[#{$1}]" }
text.gsub!(/\[Gg]/) { " 02" }
# c 에 1 문자를 취득 (문자를 취득할 수 없게 될 때까지 루프)
while ((c = text.slice!(/./m)) != nil)
# \ 의 경우
if c == " 00"
# 본래의 문자에 되돌리는
c = "\"
end
# C[n] 의 경우
if c == " 01"
# 문자색을 변경
text.sub!(/[([0-9]+)]/, "")
color = $1.to_i
if color >= 0 and color <= 7
text_buf.font.color = self.text_color(color)
end
# 다음의 문자에
next
end
# G 의 경우
if c == " 02"
# 골드 윈도우를 작성
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
# x 의 최대치 갱신 판정
max_x = [x, max_x].max
# y 에 1 를 가산
y += 1
x = 0
# 선택사항이라면 인덴트를 실시하는
if y >= $game_temp.choice_start
x = 8
end
# 다음의 문자에
next
end
# 문자를 묘화
text_buf.draw_text(4 + x, 32 * y, 40, 32, c)
# x 에 묘화 한 문자의 폭을 가산
x += text_buf.text_size(c).width
end
end
# 메세지 윈도우 자동 사이즈 조정이 온의 경우
if $game_system.message_auto_adjust
# 수치 입력의 경우는 1행 여분으로 추가
y += 1 if $game_temp.num_input_variable_id > 0
# 윈도우 사이즈를 조정
self.width = max_x + 40
self.height = y * 32 + 32
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil
# 윈도우의 폭을 가산
self.width += @face_bitmap.width + 16
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
self.contents = Bitmap.new(width - 32, height - 32)
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
self.contents = Bitmap.new(width - 32, height - 32)
end
# 중앙에 이동
centering_window
# 메세지 윈도우 자동 사이즈 조정이 오프의 경우
else
# 얼굴 그래픽이 존재하는 경우
if @face_bitmap != nil
# 윈도우의 높이가 얼굴 그래픽보다 작은 경우
if @face_bitmap.height + 32 > self.height
# 얼굴 그래픽보다 큰 사이즈로 설정
self.height = @face_bitmap.height + 32
end
face_y = (self.contents.height - @face_bitmap.height) / 2
# 얼굴 그래픽이 좌측 표시의 경우
if $msg_face[1] == 0
@text_x = @face_bitmap.width + 16
self.contents.blt(8, face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
else
@text_x = 0
self.contents.blt(self.contents.width - @face_bitmap.width - 8,
face_y, @face_bitmap,
Rect.new(0, 0, @face_bitmap.width, @face_bitmap.height))
end
else
@text_x = 0
end
end
# 윈도우 내용을 묘화
self.contents.blt(@text_x, 0, text_buf, Rect.new(0, 0, width - 32, height - 32))
# 선택사항의 경우
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 + @text_x
@input_number_window.y = self.y + $game_temp.num_input_start * 32
end
# 이름이 설정되어 있는 경우 , 이름 표시
if $msg_name != nil
bitmap = Bitmap.new(32, 32)
text_buf.font.size = 18
cx = text_buf.text_size($msg_name).width
@name_window.width = cx + 32
@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)
@name_window.visible = true
# 이름이 설정되어 있지 않은 경우 , 윈도우 소거
else
@name_window.visible = false
end
end
#--------------------------------------------------------------------------
# ● 윈도우 설정 초기화
#--------------------------------------------------------------------------
def initialize_window
if $msg_face == nil || $msg_face[0] == nil || $msg_face[1] == nil
@face_bitmap.dispose if @face_bitmap != nil
@face_bitmap = nil
self.width = 480
else
@face_bitmap = RPG::Cache.picture($msg_face[0])
self.width = 496 + @face_bitmap.width
end
self.x = (640 - self.width) / 2
self.y = 304
self.height = 160
reset_window
end
#--------------------------------------------------------------------------
# ● 윈도우를 중앙에 이동
#--------------------------------------------------------------------------
def centering_window
self.x = (640 - self.width) / 2
@name_window.x = self.x
end
#--------------------------------------------------------------------------
# ● 윈도우의 위치와 불투명도의 설정
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 32
else
case $game_system.message_position
when 0 # 상
self.y = 32
when 1 # 안
self.y = 160
when 2 # 하
self.y = 304
end
end
if $game_system.message_frame == 0
self.opacity = 255
else
self.opacity = 0
end
@name_window.y = self.y - 32
@name_window.opacity = self.opacity
self.back_opacity = 160
end
#--------------------------------------------------------------------------
# ● 프레임 갱신
#--------------------------------------------------------------------------
def update
super
# 용명의 경우
if @fade_in
self.contents_opacity += 24
@name_window.contents_opacity += 24 if $msg_name != nil
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
@name_window.opacity -= 48
if self.opacity == 0
self.visible = false
@name_window.visible = false
@fade_out = false
$game_temp.message_window_showing = false
end
return
end
end
#--------------------------------------------------------------------------
# ● 커서의 구형 갱신
#--------------------------------------------------------------------------
def update_cursor_rect
if @index >= 0
n = $game_temp.choice_start + @index
self.cursor_rect.set(8 + @text_x, n * 32, @cursor_width, 32)
else
self.cursor_rect.empty
end
end
end
이것으로 완료입니다.
-「문장에 이름 표시」-
이벤트 커멘드 「스크립트」로
$msg_name = "표시하는 이름"
이라고 하는 스크립트를 실행하면OK입니다.
이름을 지우는 경우는
$msg_name = nil
과 지정해 주세요.
「메세지 윈도우같이 ID[x] 의 엑터명을 표시하고 싶다!!」라고 하는 경우는
$msg_name = $game_actors[x].name
과 지정하면 ,ID[x] 의 엑터명이 표시됩니다.
-「윈도우 사이즈 자동조정」-
↑의 스크립트에서는 , 디폴트로 사이즈 조정을 합니다.
해제하는 경우는 , 이벤트 커멘드 「스크립트」로
$game_system.message_auto_adjust = false
를 실행해 주세요.
-「얼굴 그래픽 표시」-
이벤트 커멘드 「스크립트」로
$msg_face = ["화상 파일", {표시 위치}]
라고 하는 스크립트를 실행해 주세요.
화상 파일은 「GraphicsPictures」으로부터 읽힙니다.
표시 위치에는 , 이하의 값을 입력해 주세요.
[0] 윈도우 좌단에 표시
[1] 윈도우 우단에 표시
얼굴 그래픽을 소거하는 경우는
$msg_face = nil
을 실행하면OK입니다.
덧붙여서 , 화상 사이즈에 제한은 없습니다.
타테나가나 작은 화상도 사용 가능합니다.
(윈도우 거대화 방지를 위해 , 최대에서도 종횡96px정도로 거두어 주세요
예:「test.png」을 좌단에 표시하는 경우
$msg_face = ["test.png", 0]
★주의사항★
기존에 대화창에 얼굴 띄워주는 스크립을 사용하신 분은 본 스크립트가 적용되지 않습니다.
그 스크립을 삭제해준 후에 작업해야 합니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
1961 | 캐릭터 배틀칩와공격용배틀칩입니다. [21] | 거신 | 2005.05.23 | 1683 |
1960 | 탑뷰(위에서 바라보는)형태의 도시맵 [자작] [6] | MiNi'M' | 2005.11.18 | 1680 |
1959 | 캐릭터 변환좀 시켜주세요... [1] | 엑시아 | 2009.03.02 | 1679 |
1958 | 하하하... 미소녀 5,6.. NPC 쓸거라서 미리 많이 만들어 놓ㅇㄴ.. [9] | Mabi In 로토 | 2005.05.19 | 1675 |
1957 | xxx(절대 19금) 19금 게임에 넣으세요 | 별난바 | 2005.10.30 | 1667 |
1956 | 창세기전에 나오는 살라딘 입니다 =) [6] | brown_epik | 2007.09.01 | 1662 |
1955 | 뼈대2 [5] | 또라이몽 | 2006.06.27 | 1648 |
1954 | RPG판타지-엑스트라 [1] | RPG판타지 | 2006.04.09 | 1628 |
1953 | 액알칩 검은옷에 철검들고있는 남자. [16] | 의지 | 2006.03.01 | 1627 |
1952 | 젤다의 전설 퍼즐 끝내면 나오는 소리 | 朝地 | 2006.08.07 | 1622 |
1951 | 고급스러운 맵칩 | ※TheWow※ | 2005.05.19 | 1617 |
1950 | 마을맵칙 [4] | 『邪神』 | 2005.05.30 | 1606 |
1949 | 대고구려제국 가온누리 [9] | Mania | 2009.03.01 | 1600 |
1948 | 맵칩 올리기 5 [ 시골마을 / 시골마을 내부 ] [8] | 켈리시 | 2005.08.08 | 1600 |
1947 | 멋잇는(?)몬스터들 [9] | =ROD= | 2006.06.29 | 1571 |
1946 | 고 퀄리티 캐릭터칩 [6] | 후냥 | 2009.08.16 | 1560 |
1945 | 게임오버 [바람의나라] 글고 캐릭터칩 1개더올립니다. [1] | 판테스티아 | 2005.06.24 | 1555 |
1944 | 'ㅅ' 캐릭뼈대.. [3] | 하라파 | 2009.03.23 | 1543 |
» | 대화창에 이름&얼굴 띄우기 새로운방식. | 창조도시 | 2007.11.05 | 1535 |
1942 | 아르시스 액알모션 [2] | ps인간 | 2009.02.26 | 1516 |