XP 스크립트

R2x시리즈와 Rxp는 확실히 다르다고 합니다
알2000,3은 개조 그 자체가 불가능 하지만
알XP는 개조가 가능합니다
뭐냐고요?
바로 스크립트죠!
그런데 대화창에 얼굴을 할려 한다!
그런데 메뉴가 없다!
크아아악~!!!

라고 하시는 분들 스크립트가 있으니깐
괜찮다고요..

=-============================================================================

1. 스크립트 창을 열고
Game_System 항목으로 간다
그리고 밑의 스크립트를 첨부한다

attr_accessor :magic_number # magic number -

이 스크립트 아래에 이런 스크립트를 첨부해보세요

attr_accessor :message_auto_adjust # 메세지 윈도우 자동 사이즈 조정

@magic_number = 0

밑에

@message_auto_adjust = true

를 첨부하세요

2. Main 위에다가 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

이것으로 완료!

tip

   -「문장에 이름 표시」-
이벤트 커멘드 「스크립트」로
$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]

★주의사항★

기존에 대화창에 얼굴 띄워주는 스크립을 사용하신 분은 본 스크립트가 적용되지않습니다.
그 스크립을 삭제해준 후에 작업해야 합니다.

Who's 백호

?

이상혁입니다.

http://elab.kr

Comment '3'

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6153
34 HUD 주인공,NPC이름 머리 나타내기 49 file 송긔 2010.11.28 6059
33 HUD [게이지바]2.0버젼「체력,마나,경험치,직업,캐릭터,레벨,돈,맵이름」(HelloCoa2Ver2.0) 67 file 코아 코스튬 2010.10.23 5550
32 HUD [맵이동시 맵이름을 표시] 심플한 디자인 36 file 제로스S2 2009.08.05 5000
31 HUD [게이지바]3.0버젼「현재시간, 플레이시간, 걸음수, 윈도우 이동 추가」(HelloCoa2Ver3.0) 63 file 코아 코스튬 2010.10.30 4921
30 HUD 새로운방법의 맵이름 표시 31 file 백호 2009.02.21 4617
29 HUD HP과 SP 바 19 Man... 2008.11.04 4534
28 HUD 캐릭터 아래 SP,HP표시해주는 스크립트 33 file 김!제스! 2010.08.04 4269
27 HUD 맵 이름 표시와 미니맵을 같이하자 8 file 뮤리온。 2011.10.08 4191
26 HUD 이름띄우기스크립트 - [ID홍길동] 이 아닌 [홍길동]으로 표기하기 27 블루레스 2009.11.06 4054
25 HUD [VX 가능] 이벤트 이름 띄우기 41 file 독도2005 2009.08.22 3902
24 HUD 맵이름스크립트 52 file 이안 2010.01.17 3552
» HUD xp대화창에 얼굴, 이름 넣기!! [방법두 있음] 3 백호 2009.02.21 3545
22 HUD 맵이름표시 ps인간 2009.01.23 3441
21 HUD 시트르산의 나침반 스크립트 19 file 시트르산 2011.01.23 3195
20 HUD 강화 나침반 스크립트 (원본 by 허걱) 16 file JACKY 2010.08.16 3105
19 HUD 넷플레이 HUD표시 2 file 백호 2009.02.22 3094
18 HUD HP/SP 상태를 표시해주는 간이 윈도우 3 file 백호 2009.02.21 3067
17 HUD 맵이름 넣기(bs님의 강의랑 다르게 스크립트로) 16 file 아방스 2007.11.09 2981
16 HUD 맵 이름을 표시해주는 스크립트입니다. 25 임희성 2011.02.12 2936
15 HUD 맵이름 스크립트 1 file 긔염둥이♥ 2012.05.19 2913
Board Pagination Prev 1 2 Next
/ 2