=begin
GDC - Message GDC = Goldencolor = =找戳。。。
= =b未完善啊。还有部分功能没有写出来。。。时间。不够。这个工程写好好了N9。
没有来得及完善。算了。有兴趣的朋友帮忙加强完善。
准备把那个漫画对话框加强一下。。结果一看。那个什么啊。啊。咋么可以那样写。
因为是RMXP Standard Development Kit (SDK)基础上扩展的。。
看不懂。。
算了等下次更新。= =b我坑坑坑
V1.0 by Goldencolor
注:本脚本和公共事件开关变量使用起来会更加方便。如:用变量来控制显示头像。开关
来控制各种文字效果。
还有那个初始化配置不要乱改。
颜色的设置 在text_color方法内。 ● 枚举颜色
┏━━━━ 使用说明 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┠──── Class - 显示文章 ──────────────────────────
┃ \V[n] - N = 变量ID 显示第 n 号变量中的值。
┃
┃ \C[n] - N = 枚举颜色值 之后的文字用第 n 号的颜色显示。
┃ 定义枚举颜色:def text_color(n)
┃
┃ \G - 显示金钱窗口
┃
┃ \F[name] - name = 图片名字。显示一张图片在信息框里面.注:Pictures文件内
┃
┃ \FL - 设置显示图片的位置在左边。
┃
┃ \FR - 设置显示图片的位置在右边。
┃
┃ \BT[name] - name = 战斗图名字。显示一张战斗图。注:Battlers 文件内
┃
┃ \BL - 设置战斗图片的位置在左边。
┃
┃ \BR - 设置战斗图片的位置在右边。
┃
┃ \H - 可以和NPC对话的时候走动~-_-!! 具体实现方法见Game_Player
┃ - 修改部分地方就可以实现了。
┃
┃ \NA[name] - name =你要设定角色的名字。 会在左上角出现一个名字窗口(俗称盒子= =b)
┃
┃ \MW[N] - 改变窗口的宽度\MH n=数字
┃
┃ \MH[N] - 改变窗口的高度\MH n=数字
┃
┃ \B - 之后的文字为粗体 \i 文字 \i 这样可以只让文字2个字呈现粗体
┃
┃ \I - 之后的文字为斜体 重复2个可以取消效
┃
┃ \U - 下划线~
┃
┃ \SH - 文字带有投影效果
┃
┃ \WX[n] - 信息窗口的X位置 N=数字
┃
┃ \WY[n] - 信息窗口的X位置 N=数字
┃
┃ \TP[n] - 出现在目标身上。N = EVENT ID 。0指角色。
┃
┃ \MW[n] - 层叠窗口 N=数字。
┃
┃ \MT[n] - 自动根据文字内容调整大小。0=不适用。1=使用。
┃
┃ \SCO — 实现对话框卷动效果(像读书系统一样自动翻页阅读)
┃
┃ \SCO — 停止卷动
┃
┃ \CD — 显示多窗口。可以多人同时说话 注:使用如果使用这个,
┃ — 请设置好每个对话框的位置否则会重叠
┃
┃ \CT[ n ] — 等待n帧数 N=数字
┃
┃ \CL — 停止等待
┃
┃ \Sk — 显示技能图标及名字 I = 技能ID
┃
┃ \WP — 显示物品图标及名字 I = 物品ID
┃
┃ \WQ — 显示武器图标及名字 I = 武器ID
┃
┃
┃
┃= =b其他没有来得及写。下次补上
┃
┃
┃
┃
┃
┃
┃
┃
┃
┠──── Class - 事件 ────────────────────────────
┃
┃ 一坨。。。。。。。。。。。。。。。。。。。。。。。。。。。
┃ 有时间在补上吧。啊
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=end
#==============================================================================
# ■ Game_Temp
#------------------------------------------------------------------------------
# 在没有存档的情况下,处理临时数据的类。这个类的实例请参考
# $game_temp 。
#==============================================================================
class Game_System
alias mrmo_settings_ms_system_initialize initialize #别名
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :letterBYletter
attr_accessor :letter_speed
attr_accessor :letter_se
attr_accessor :window_x
attr_accessor :window_y
attr_accessor :player_skip
attr_accessor :window_to_text
attr_accessor :message_width
attr_accessor :message_height
attr_accessor :nameBox_opacity
attr_accessor :nameBox_to_window_opacity
attr_accessor :message_font
attr_accessor :hover_message
attr_accessor :face_graphic
attr_accessor :face_justify
attr_accessor :battler_graphic
attr_accessor :battler_justify
attr_accessor :multiple_windows
attr_accessor :scrolling_text
attr_accessor :scroll_speed
attr_accessor :scroll_lines
attr_accessor :auto_scroll
attr_accessor :close_on_display
attr_accessor :close_on_time
#--------------------------------------------------------------------------
# ● 初始化对像
# 下面是对整个对话框的配置
#--------------------------------------------------------------------------
def initialize
mrmo_settings_ms_system_initialize
@nameBox_opacity = 0 # 名字窗口不透明度数
@nameBox_to_window_opacity = true # true对名字框不设置不透明,false设置
@letterBYletter = true # 如果真可以用\lbl控制显示样式。
#0=直接在上面显示文本。其他以打字方式出现
@letter_speed = 2 # 控制对话框的速度
#建议变量控制起来
@player_skip = true #如果按下决定键可以让对话跳过吗?
#\ps[0] 可以跳过。\PS[1]不可以
@letter_se = ""#"033-Switch02" 对话打字效果播放的SE音效
#如果不想使用""就可以了
@window_x = 80 #对话框的X位置。\wx
@window_y = 304 #对话框的X位置。\wy
@window_to_text =false #使用模式对话框。对话框会根据文本大小自动调整。
#建议用开关控制起来 #\mt[0]
@message_width = 480 # 信息窗口的宽度
# \mw[width]
@message_height = 160 # 信息窗口的高度
# \mh[height]
@message_font = Font.default_name # 信息框字体类型
# \ft[name]
@hover_message = false # 对话框的时候玩家可以移动
# \h
@face_graphic = "" # 信息框显示图片。这个用变量控制起来最好用了
# \f[name]
# 注:在 picture
@face_justify = 0 # 0 = 左边 1 = 右边 #图片
# \fl = 左边 \fr = 右边
@battler_justify = 0 # 0 = 左边 1 = 右边
# \bl = 左边 \br = 右边
@battler_graphic = "" #显示战斗图。
# \bt[name]
@scroll_speed = 30 # 卷动速度。数字越高越慢。
@scroll_lines = 4 # 卷动数字
@close_on_display = false # 结束等待。
# \cl
@close_on_time = nil # 等待时间
# \ct[time]
#############下面东西不要修改。
@multiple_windows = []
@scrolling_text = nil
@auto_scroll = true #决定键
end
#--------------------------------------------------------------------------
# ● 枚举颜色。可以自定义颜色\C[n] 文字用第 n 号的颜色显示。
#---------------------------------------------------------------------------
# 例:
# when N Color.new(R,R,R,A)
# N = 你枚举的数
# R = RGB标准值
# A = 颜色透明度
#--------------------------------------------------------------------------
def text_color(n)
case n
when 0
return Color.new(255, 255, 255, 255) # 白色
when 1
return Color.new(128, 128, 255, 255) # 黑色
when 2
return Color.new(255, 128, 128, 255) # 红色
when 3
return Color.new(128, 255, 128, 255) # 绿色
when 4
return Color.new(128, 255, 255, 255) # 浅蓝
when 5
return Color.new(255, 128, 255, 255) # 紫色
when 6
return Color.new(255, 255, 128, 255) # 黄色
when 7
return Color.new(192, 192, 192, 255) # 灰色
#when 8
#return Color.new(RED,BLUE,GREEN,ALPHA)#枚举标准格式
else
normal_color
end
end
#--------------------------------------------------------------------------
# ● 定义实例变量(如果想要添加:实例Name)
#--------------------------------------------------------------------------
attr_accessor :letterBYletter, :letter_speed, :letter_se, :window_x, :window_y,
:player_skip, :window_to_text, :message_width, :message_height, :nameBox_opacity,
:nameBox_to_window_opacity, :message_font, :hover_message, :face_graphic,
:face_justify, :battler_graphic, :battler_justify, :multiple_windows,
:scrolling_text, :scroll_speed, :scroll_lines, :auto_scroll, :close_on_display,
:close_on_time
end
class Window_Message < Window_Selectable
#--------------------------------------------------------------------------
attr_accessor :text
attr_accessor :messboxStyle
attr_accessor :messboxName
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(80, 304, $game_system.message_width, $game_system.message_height)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
self.z = 9998
@fade_in = @fade_out = @contents_showing = false
@cursor_width = 0
self.active = false
self.index = -1
@lbl_count = @face_width = @battler_width = 0
@name_box = Window_NameBoxMd.new
# 空文本
@text = nil
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
terminate_message
$game_temp.message_window_showing = false
@input_number_window.dispose if @input_number_window != nil
@name_box.dispose
super
end
#--------------------------------------------------------------------------
# ● 处理信息结束
#--------------------------------------------------------------------------
def terminate_message
self.active = false
self.pause = false
self.index = -1
self.contents.clear
####
$game_system.hover_message = false
# 清除显示中标志
@contents_showing = false
# 呼叫信息调用
$game_temp.message_proc.call if $game_temp.message_proc != nil
# 清除文章、选择项、输入数值的相关变量
$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
# 其他
@lbl_count = 0
@temp_skip = false
$game_system.close_on_display = false
$game_system.close_on_time = nil
@name_box.visible = false
# Text
@text = nil
$game_system.scrolling_text = nil
# 多重窗口
if !$game_system.multiple_windows.include?(self)
for i in 0..$game_system.multiple_windows.size
w = $game_system.multiple_windows
next if w.nil?
w.terminate_message
w.dispose
end
$game_system.multiple_windows = []
end
# ShowImamgs =v-!
self.contents.dispose
self.contents = Bitmap.new(width - 32, height - 32)
self.oy = 0
@scroll_up = nil
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
@scroll_up = nil
x = y = 0
@cursor_width = 0
# 到选择项的下一行字
x = 8 if $game_temp.choice_start == 0
# 有等待显示的文字的情况下
if $game_temp.message_text != nil
@text = $game_temp.message_text if @text.nil?
@saved_text = @text
#调整改变窗口大小
modify_window
#开始文本处理~
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
#跳动
@text.gsub!(/\\[Pp][Ss]\[([0-9]+)\]/) do
bool = $1.to_i
$game_system.player_skip = (bool == 0 ? false : true)
""
end
# 为了方便、将 "\\\\" 变换为 "\000"
@text.gsub!(/\\\\/) { "\000" }
# "\\C" 变为 "\001" 、"\\G" 变为 "\002"
@text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
@text.gsub!(/\\[Gg]/) { "\002" }
# lbl
@text.gsub!(/\\[Ll][Bb][Ll]\[([0-9]+)\]/) { "\003[#{$1}]" }
# lse =w= 音效!
@text.gsub!(/\\[Ss][Ee]\[(.*?)\]/) { "\004[#{$1}]" }
# ls
@text.gsub!(/\\[Ll][Ss]\[([0-9]+)\]/) { "\005[#{$1}]" }
# 图标
@text.gsub!(/\\[Ii][Cc]\[(.*?)\]/) { "\015[#{$1}]" }
# 物品图标
@text.gsub!(/\\[Ww][Pp]\[([0-9]+)\]/) {
item = $data_items[$1.to_i]
"\016[#{$1}]"+item.name }
# 武器图标
@text.gsub!(/\\[Ww][Qq]\[([0-9]+)\]/) {
item = $data_weapons[$1.to_i]
"\017[#{$1}]" + item.name
}
# 防具图标
@text.gsub!(/\\[Dd][Ff]\[([0-9]+)\]/) {
item = $data_armors[$1.to_i]
"\018[#{$1}]" + item.name
}
# 技能图标
@text.gsub!(/\\[Ss][Kk]\[([0-9]+)\]/) {
item = $data_skills[$1.to_i]
"\019[#{$1}]"+ item.name
}
# 字体
@text.gsub!(/\\[Ff][Tt]\[(.*?)\]/) { "\013[#{$1}]" }
# b - 粗体
@text.gsub!(/\\[Bb]/) { "\006" }
# i - 斜体字
@text.gsub!(/\\[Ii]/) { "\007" }
# st - 特殊字符
@text.gsub!(/\\[Tt][Ss]/) { "\010" }
# u - 文字下划线
@text.gsub!(/\\[Uu]/) { "\011" }
# sh - 文字影子
@text.gsub!(/\\[Yy][Zz]/) { "\014" }
# 等待?帧数 \CT[帧数]
@text.gsub!(/\\[Cc][Tt]\[([0-9]+)\]/) do
$game_system.close_on_time = $1.to_i
""
end
# 停止等待
@text.gsub!(/\\[Cc][Ll]/) do
$game_system.close_on_display = true
""
end
#= =b这个暂时丢掉不用。以后更新在、、
# @text.gsub!(/\\[Pp][Ee]/) { "#{$game_player.social.personality}" }
if $game_system.face_graphic != ""
bitmap = RPG::Cache.picture($game_system.face_graphic)
if $game_system.face_justify == 0
self.contents.blt(0, y + 4, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
else
self.contents.blt(self.width-bitmap.width-32, y + 4, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
end
@face_width = bitmap.width
x = 0
x += @face_width if $game_system.face_justify == 0
else
@face_width = 0
end
# 显示Battle
if $game_system.battler_graphic != ""
bitmap = RPG::Cache.battler($game_system.battler_graphic,0)
if $game_system.battler_justify == 0
self.contents.blt(0, y + 4, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
else
self.contents.blt(self.width-bitmap.width-32, y + 4, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
end
@battler_width = bitmap.width
x = 0
x += @battler_width if $game_system.battler_justify == 0
else
@battler_width = 0
end
#循环获取文本。
while ((c = @text.slice!(/./m)) != nil)#54就可用了
# 卷动情况全解!!!!!独家啊
if !$game_system.scrolling_text.nil?
if !@scroll_up.nil?
if @scroll_up == y
scroll_frames = $game_system.scroll_speed
# 等待。。。。等啊等啊
while scroll_frames > 0
scroll_frames -= 1
end
@scroll_up = y+1
auto_s += 1
@temp_skip = false
if !$game_system.auto_scroll and auto_s == 4
auto_s = 0
#循环
loop do
#刷新游戏画面
Graphics.update
# Player Skip
Input.update
#按下C停止跳动
if Input.trigger?(Input::C)
break
end
end
end
#向上卷动
self.oy+=32
end
else
auto_s = 0
self.oy -= 32*3
@scroll_up = 1
end
end
# \lbl 的情况下卷动
if c == "\003"
@text.sub!(/\[([0-9]+)\]/, "")
bool = $1.to_i
$game_system.letterBYletter = (bool == 0 ? false : true)
next
end
# \ls 的情况下
if c == "\005"
@text.sub!(/\[([0-9]+)\]/, "")
bool = $1.to_i
$game_system.letter_speed = bool
next
end
# \lse 的情况下
if c == "\004"
@text.sub!(/\[(.*?)\]/, "")
$game_system.letter_se = $1.to_s
next
end
if $game_system.letterBYletter and !@temp_skip
@lbl_count = $game_system.letter_speed
# 循环
while @lbl_count > 0
# 刷新画面
Graphics.update
if $game_system.player_skip
Input.update
if Input.trigger?(Input::C)
@temp_skip = true
end
end
#更新计数
@lbl_count -= 1
end
if $game_system.letter_se != ""
Audio.se_play("Audio/SE/" + $game_system.letter_se, 100, 100)
end
end
# \\ 的情况下
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 = $game_system.text_color(color)
end
# 下面的文字
next
end
# \b 的情况下
if c == "\006"
# 变换文字
self.contents.font.bold = !self.contents.font.bold
# 下面的文字
next
end
# \i 的情况下
if c == "\007"
# 变换文字
self.contents.font.italic = !self.contents.font.italic
# 下面的文字
next
end
# \st 的情况下
if c == "\010"
# 变换文字
self.contents.font.strikethrough = !self.contents.font.strikethrough if self.contents.font.respond_to?(:strikethrough)
# 下面的文字
next
end
# \u 的情况下
if c == "\011"
#
self.contents.font.underline = !self.contents.font.underline if self.contents.font.respond_to?(:underline)
# 下面的文字
next
end
# \sh 的情况下
if c == "\014"
# 变换文字
self.contents.font.shadow = !self.contents.font.shadow if self.contents.font.respond_to?(:shadow)
# 下面的文字
next
end
# \font 的情况下
if c == "\013"
@text.sub!(/\[(.*?)\]/, "")
$game_system.message_font = $1.to_s
# 下面的文字
next
end
if $game_system.message_font.downcase == ""
self.contents.font.name = Font.default_name
else
self.contents.font.name = $game_system.message_font
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-@gold_window.height
@gold_window = self.y+self.height if @gold_window.y < 0
@gold_window.x = self.x
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
x += @face_width if $game_system.face_justify == 0
x += @battler_width if $game_system.battler_justify == 0
# 刷新选择项及光标的高
if y >= $game_temp.choice_start
index = y-$game_temp.choice_start
cursor_width = self.width / 2 - 32
x = index % 2 * (cursor_width + 32) + 8
end
# 下面的文字
next
end
# 图标的情况下
if c == "\015"
@text.sub!(/\[(.*?)\]/, "")
bitmap = RPG::Cache.icon($1.to_s)
self.contents.blt(x, 32*y + 4, bitmap, Rect.new(0, 0, 24, 24))
# x 为要描绘文字的加法运算
x += 24
next
end
# 物品图标的情况下
if c == "\016"
@text.sub!(/\[([0-9]+)\]/, "")
name = $data_items[$1.to_i]
next if name.nil?
bitmap = RPG::Cache.icon(name.icon_name)
self.contents.blt(x, 32*y + 4, bitmap, Rect.new(0, 0, 24, 24))
# x 为要描绘文字的加法运算
x += 24
next
end
# 武器图标的情况下
if c == "\017"
@text.sub!(/\[([0-9]+)\]/, "")
name = $data_weapons[$1.to_i]
next if name.nil?
bitmap = RPG::Cache.icon(name.icon_name)
self.contents.blt(x, 32*y + 4, bitmap, Rect.new(0, 0, 24, 24))
# x 为要描绘文字的加法运算
x += 24
next
end
# 防具图标情况下
if c == "\018"
@text.sub!(/\[([0-9]+)\]/, "")
name = $data_armors[$1.to_i]
next if name.nil?
bitmap = RPG::Cache.icon(name.icon_name)
self.contents.blt(x, 32*y + 4, bitmap, Rect.new(0, 0, 24, 24))
# x 为要描绘文字的加法运算
x += 24
next
end
# 技能图标的情况下
if c == "\019"
@text.sub!(/\[([0-9]+)\]/, "")
index = $1.to_i
# name = $data_skills[$1.to_i]
item = $data_skills[index]
next if name.nil?
icon = RPG::Cache.icon(item.icon_name)
bitmap = RPG::Cache.icon(name.icon_name)
self.contents.blt(x, 32*y + 4, bitmap, Rect.new(0, 0, 24, 24))
#self.contents.blt(@x + 2, (@y * line) + 4, icon, Rect.new(0, 0, 24, 24))
# x 为要描绘文字的加法运算
x += 24
next
end
# 描绘文字
self.contents.draw_text(4 + x, 32 * y, 40, 32, c) if y < $game_temp.choice_start
index = y - $game_temp.choice_start
self.contents.draw_text(4 + x, (index/2*32)+((y-index)*32), 40, 32, c) if y >= $game_temp.choice_start
# x 为要描绘文字的加法运算
x += self.contents.text_size(c).width
end
end
self.oy += 32 if !$game_system.scrolling_text.nil?
# 选择项的情况
if $game_temp.choice_max > 0
@item_max = $game_temp.choice_max
self.active = true
@column_max = 2 if $game_temp.choice_max > 1
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
if $game_system.close_on_display
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
if $game_system.close_on_time != nil
loop do
Graphics.update
$game_system.close_on_time -= 1
break if $game_system.close_on_time <= 0
end
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
end
#--------------------------------------------------------------------------
# ● 改变窗口
#--------------------------------------------------------------------------
# 有关控制信息窗口的都在这里
#--------------------------------------------------------------------------
def modify_window
# 改变窗口的宽度
@text.gsub!(/\\[Mm][Ww]\[([0-9]+)\]/) do
$game_system.message_width = self.width = $1.to_i
""
end
# 改变窗口的高度\MH
@text.gsub!(/\\[Mm][Hh]\[([0-9]+)\]/) do
$game_system.message_height = self.height = $1.to_i
""
end
# 窗口的大小根据文本长度改变\Mt 模态窗口
@text.gsub!(/\\[Mm][Tt]\[([0-9]+)\]/) do
bool = $1.to_i
$game_system.window_to_text = (bool == 0 ? false : true)
""
end
if $game_system.window_to_text
size = 0
for string in (@text.clone).split("\n")
next if string.nil?
w = contents.text_size(string).width+32
size = w+32 if size+32 < w
end
self.width = size
self.width = size*2 if $game_temp.choice_start == 0
self.height = (@text.clone).split("\n").size * 32 + 32
self.height = self.height/2 + 32 if $game_temp.choice_start == 0
self.contents.dispose
if $game_system.scrolling_text.nil?
self.contents = Bitmap.new(width - 32, height - 32)
else
h = ($game_temp.message_text.clone).split("\n").size * 32 + 32
self.contents.dispose
self.contents = Bitmap.new(width - 32, h+32)
end
else
self.width = $game_system.message_width
self.height = $game_system.message_height
if $game_system.scrolling_text.nil?
self.contents = Bitmap.new(width - 32, height - 32)
else
h = ($game_temp.message_text.clone).split("\n").size * 32 + 32
self.contents.dispose
self.contents = Bitmap.new(width - 32, h+32)
end
end
# X 位置
@text.gsub!(/\\[Ww][Xx]\[([0-9]+)\]/) do
$game_system.window_x = self.x = $1.to_i
""
end
# Y 位置
@text.gsub!(/\\[Ww][Yy]\[([0-9]+)\]/) do
$game_system.window_y = self.y = $1.to_i
""
end
# 消息框的位置。0=角色
@text.gsub!(/\\[Ww][Zz]\[([0-9]+)\]/) do
id = $1.to_i
if id == 0
self.x = $game_player.screen_x - self.width/2
self.y = $game_player.screen_y
self.y = $game_player.screen_y - (64+self.height) if $game_system.window_to_text
else
self.x = $game_map.events[id].screen_x - self.width/2
self.y = $game_map.events[id].screen_y
self.y = $game_map.events[id].screen_y - (64+self.height) if $game_system.window_to_text
end
""
end
# 正常窗口
correct_window
# 显示名字盒子\Nm[name]
@text.gsub!(/\\[Nn][Mm]\[(.*?)\]/) do
name = $1.to_s
@name_box.text = name
@name_box.visible = true
@name_box.y = self.y-@name_box.height
@name_box.x = self.x
@name_box.y = self.height if @name_box.y < 0
""
end
# 显示图片
@text.gsub!(/\\[Ff]\[(.*?)\]/) do
name = $1.to_s
$game_system.face_graphic = name
@face_width = 0 if name == ""
""
end
# 设置头像位置左边
@text.gsub!(/\\[Ff][Ll]/) do
$game_system.face_justify = 0
""
end
# 设置头像位置右边
@text.gsub!(/\\[Ff][Rr]/) do
$game_system.face_justify = 1
""
end
# 显示战斗图片
@text.gsub!(/\\[Bb][Tt]\[(.*?)\]/) do
name = $1.to_s
$game_system.battler_graphic = name
@battler_width = 0 if name == ""
""
end
# 设置战斗图位置左边
@text.gsub!(/\\[Bb][Ll]/) do
$game_system.battler_justify = 0
""
end
# 设置战斗图位置右边
@text.gsub!(/\\[Bb][Rr]/) do
$game_system.battler_justify = 1
""
end
end
#--------------------------------------------------------------------------
# ● 正常窗口
#--------------------------------------------------------------------------
def correct_window
if self.x > 640-self.width
self.x = 640-self.width
elsif self.x < 0
self.x = 0
end
if self.y > 480-self.height
self.y = 480-self.height
elsif self.y <= 0
self.y = 0
end
end
#--------------------------------------------------------------------------
# ● 设置窗口位置与不透明度
#--------------------------------------------------------------------------
# 这里可以修改文章选项位置和不透明度~~
#--------------------------------------------------------------------------
def reset_window
if $game_temp.in_battle
self.y = 16
else
case $game_system.message_position
when 0 # 上
self.y = 16
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
self.back_opacity = 160
self.x = $game_system.window_x
self.y = $game_system.window_y
@temp_skip = false
# 更新图片大小
if !$game_system.scrolling_text.nil?
h = ($game_temp.message_text.clone).split("\n").size * 32
self.contents.dispose
self.contents = Bitmap.new(width - 32, h)
end
end
#--------------------------------------------------------------------------
# ● 向下卷动
#--------------------------------------------------------------------------
def scroll_down
i = 0
h = @text.split("\n").size * 32 + 32
while i < 32*4
# 刷新游戏画面
Graphics.update
self.oy += $game_system.scroll_speed
i += $game_system.scroll_speed
if self.oy >= self.contents.height
break
end
end
end
#--------------------------------------------------------------------------
# ● 搞定卷动
#--------------------------------------------------------------------------
def scroll_done
return true if self.oy >= self.contents.height - 32*4
return false
end
#--------------------------------------------------------------------------
# ● 显示多个窗口(本脚本的特点啊!)
#--------------------------------------------------------------------------
def show_m_window
@contents_showing = true
reset_window
self.visible = true if $game_system.letterBYletter or !$game_system.scrolling_text.nil?
refresh
Graphics.frame_reset
self.visible = true
if @input_number_window != nil
@input_number_window.contents_opacity = 0 if !$game_system.letterBYletter and $game_system.scrolling_text.nil?
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 = =b又到了刷新的时候了。刷一刷天天都干净!-_-!!
#--------------------------------------------------------------------------
def update
super
#在存在的时候。名字框刷新。
@name_box.update if @name_box.visible
@name_box.opacity = $game_system.nameBox_opacity if !$game_system.nameBox_to_window_opacity and @name_box.opacity != $game_system.nameBox_opacity
@name_box.opacity = self.opacity if $game_system.nameBox_to_window_opacity and @name_box.opacity != self.opacity
# 渐变的情况下
if @fade_in and !$game_system.letterBYletter and $game_system.scrolling_text.nil?
self.contents_opacity += 24
if @input_number_window != nil
@input_number_window.contents_opacity += 24
end
if self.contents_opacity == 255
@fade_in = false
end
return
elsif ($game_system.letterBYletter or !$game_system.scrolling_text.nil?) and @fade_in
return @fade_in = false
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::UP) or Input.trigger?(Input::DOWN) or
Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT)
if $game_temp.choice_max <= 0 and $game_system.hover_message
return 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
self.visible = true if $game_system.letterBYletter or !$game_system.scrolling_text.nil?
refresh
Graphics.frame_reset
self.visible = true
self.contents_opacity = 0 if !$game_system.letterBYletter and $game_system.scrolling_text.nil?
if @input_number_window != nil
@input_number_window.contents_opacity = 0 if !$game_system.letterBYletter and $game_system.scrolling_text.nil?
end
# 显示多窗口
if !$game_system.multiple_windows.include?(self)
for w in $game_system.multiple_windows
next if w.nil?
w.show_m_window
end
end
return @fade_in = true
end
# 没有可以显示的信息、但是窗口为可见的情况下
if self.visible
@fade_out = true
self.opacity -= 48
if self.opacity == 0
self.visible = false
@fade_out = false
$game_temp.message_window_showing = false
end
return
end
end
#--------------------------------------------------------------------------
# ● 更新光标矩形
#-------------------------------------------------------------------------- def update_cursor_rect
def update_cursor_rect
# 光标位置不满 0 的情况下
return self.cursor_rect.empty if @index < 0
# 获取当前的行
row = @index / @column_max
# 当前行被显示开头行前面的情况下
if row < self.top_row
# 从当前行向开头行滚动
self.top_row = row
end
# 当前行被显示末尾行之后的情况下
if row > self.top_row + (self.page_row_max - 1)
# 从当前行向末尾滚动
self.top_row = row - (self.page_row_max - 1)
end
# 计算光标的宽度
cursor_width = self.width / @column_max - 32
# 计算光标坐标
x = @index % @column_max * (cursor_width + 32)
y = @index / @column_max * 32 - self.oy
# 更新光标矩形
self.cursor_rect.set(x, y+($game_temp.choice_start*32), cursor_width, 32)
end
end
#==============================================================================
#● 名字框家族= =b之一
#-------------------------------------------------------------------------------
# 这个算老大吧。
#===============================================================================
class Window_NameBoxMd < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(0, 0, 160, 32)
self.visible = false
@text = ""
@dummy_window = Window_NameBoxModel.new(self)
end
#--------------------------------------------------------------------------
# ● 文本
#--------------------------------------------------------------------------
def text=(t)
return if @text == t
# 编辑文本
@dummy_window.text = @text = t
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
super
@dummy_window.dispose if !@dummy_window.nil?
end
# X
def y=(v)
super(v)
@dummy_window.y = v-16 if !@dummy_window.nil?
end
# Y
def x=(v)
super(v)
@dummy_window.x = v if !@dummy_window.nil?
end
#--------------------------------------------------------------------------
# ● 显示端口
#--------------------------------------------------------------------------
def visible=(v)
super(v)
@dummy_window.visible = v if !@dummy_window.nil?
end
end
#==============================================================================
# ● 名字框家族= =b之一
#------------------------------------------------------------------------------
# 这个就是传说中又上角那个小框框~显示名字那个地方
#===============================================================================
class Window_NameBoxModel < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize(parent)
super(0, 0, 160, 64)
self.visible = false
self.opacity = 0
@name_box = parent
self.contents = Bitmap.new(width - 32, height - 32)
@text = ""
end
#--------------------------------------------------------------------------
# ● 文本
#--------------------------------------------------------------------------
def text=(t)
return if @text == t
@text = t
refresh
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
# 变化大小~
self.width = cx = contents.text_size(@text).width + 32
@name_box.width = self.width
self.contents.dispose if !self.contents.disposed?
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.draw_text(0, 0, cx-32, 32, @text)
end
end
=begin
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
=end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
# 处理地图画面的类。
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 循环
loop do
# 按照地图、实例、主角的顺序刷新
# (本更新顺序不会在满足事件的执行条件下成为给予角色瞬间移动
# 的机会的重要因素)
$game_map.update
$game_system.map_interpreter.update
$game_player.update
# 系统 (计时器)、画面刷新
$game_system.update
$game_screen.update
# 如果主角在场所移动中就中断循环
unless $game_temp.player_transferring
break
end
# 执行场所移动
transfer_player
# 处理过渡中的情况下、中断循环
if $game_temp.transition_processing
break
end
end
# 刷新活动块
@spriteset.update
# 刷新信息窗口
@message_window.update
# 游戏结束的情况下
if $game_temp.gameover
# 切换的游戏结束画面
$scene = Scene_Gameover.new
return
end
# 返回标题画面的情况下
if $game_temp.to_title
# 切换到标题画面
$scene = Scene_Title.new
return
end
# 处理过渡中的情况下
if $game_temp.transition_processing
# 清除过渡处理中标志
$game_temp.transition_processing = false
# 执行过渡
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# 显示信息窗口中的情况下。
if $game_temp.message_window_showing and !$game_system.hover_message
return
end
# 遇敌计数为 0 且、且遇敌列表不为空的情况下
if $game_player.encounter_count == 0 and $game_map.encounter_list != []
# 不是在事件执行中或者禁止遇敌中
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
# 确定队伍
n = rand($game_map.encounter_list.size)
troop_id = $game_map.encounter_list[n]
# 队伍有效的话
if $data_troops[troop_id] != nil
# 设置调用战斗标志
$game_temp.battle_calling = true
$game_temp.battle_troop_id = troop_id
$game_temp.battle_can_escape = true
$game_temp.battle_can_lose = false
$game_temp.battle_proc = nil
end
end
end
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 不是在事件执行中或菜单禁止中
unless ($game_system.map_interpreter.running? and !$game_system.hover_message) or
$game_system.menu_disabled
# 设置菜单调用标志以及 SE 演奏
$game_temp.menu_calling = true
$game_temp.menu_beep = true
end
end
# 调试模式为 ON 并且按下 F9 键的情况下
if $DEBUG and Input.press?(Input::F9)
# 设置调用调试标志
$game_temp.debug_calling = true
end
# 不在主角移动中的情况下
unless $game_player.moving?
# 执行各种画面的调用
if $game_temp.battle_calling
call_battle
elsif $game_temp.shop_calling
call_shop
elsif $game_temp.name_calling
call_name
elsif $game_temp.menu_calling
call_menu
elsif $game_temp.save_calling
call_save
elsif $game_temp.debug_calling
call_debug
end
end
end
end
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
# 处理主角的类。事件启动的判定、以及地图的滚动等功能。
# 本类的实例请参考 $game_player。
#==============================================================================
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 画面更新
#--------------------------------------------------------------------------
def update
# 本地变量记录移动信息
last_moving = moving?
# 移动中、事件执行中、强制移动路线中、
# 信息窗口一个也不显示的时候
unless moving? or ($game_system.map_interpreter.running? and !$game_system.hover_message) or
@move_route_forcing or ($game_temp.message_window_showing and !$game_system.hover_message)
# 如果方向键被按下、主角就朝那个方向移动
#= =b我个人比较喜欢8方向行走所有改了这里如果你喜欢改下面注释就好了
case Input.dir8 #表示8方向
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
when 1
move_lower_left
when 3
move_lower_right
when 7
move_upper_left
when 9
move_upper_right
end
#case Input.dir4 #表示4方向
# when 2
# move_down
# when 4
# move_left
# when 6
# move_right
# when 8
# move_up
# end
end
# 本地变量记忆坐标
last_real_x = @real_x
last_real_y = @real_y
super
# 角色向下移动、画面上的位置在中央下方的情况下
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
# 画面向下卷动
$game_map.scroll_down(@real_y - last_real_y)
end
# 角色向左移动、画面上的位置在中央左方的情况下
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
# 画面向左卷动
$game_map.scroll_left(last_real_x - @real_x)
end
# 角色向右移动、画面上的位置在中央右方的情况下
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
# 画面向右卷动
$game_map.scroll_right(@real_x - last_real_x)
end
# 角色向上移动、画面上的位置在中央上方的情况下
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
# 画面向上卷动
$game_map.scroll_up(last_real_y - @real_y)
end
# 不在移动中的情况下
unless moving?
# 上次主角移动中的情况
if last_moving
# 与同位置的事件接触就判定为事件启动
result = check_event_trigger_here([1,2])
# 没有可以启动的事件的情况下
if result == false
# 调试模式为 ON 并且按下 CTRL 键的情况下除外
unless $DEBUG and Input.press?(Input::CTRL)
# 遇敌计数下降
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 判定为同位置以及正面的事件启动
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end
#==============================================================================
# ■ Interpreter (分割定义 3)
#------------------------------------------------------------------------------
# 执行事件指令的解释器。本类在 Game_System 类
# 和 Game_Event 类的内部使用。
# 重新定义101号事件 = =b这里也是整个信息框的核心部分
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 显示文章
# 重定义。
#--------------------------------------------------------------------------
def command_101
# # 结束已经设置过 message_text 的情况
return false if $game_temp.message_text != nil
# 设置信息结束后待机和返回调用标志
@message_waiting = true
$game_temp.message_proc = Proc.new { @message_waiting = false }
# message_text 设置为 1 行
$game_temp.message_text = @list[@index].parameters[0] + "\n"
line_count = 1
# 循环
loop do
# 下一个事件指令为文章两行以上的情况
if @list[@index+1].code == 401
# message_text 添加到第 2 行以下
$game_temp.message_text += @list[@index+1].parameters[0] + "\n"
line_count += 1
# 事件指令不在文章两行以下的情况
else
# 下一个事件指令为显示选择项的情况下
if @list[@index+1].code == 102
# 如果选择项能收纳在画面里
if @list[@index+1].parameters[0].size <= 6 - line_count
# 推进索引
@index += 1
# 设置选择项
$game_temp.choice_start = line_count
setup_choices(@list[@index].parameters)
end
# 下一个事件指令为处理输入数值的情况下
elsif @list[@index+1].code == 103
# 如果数值输入窗口能收纳在画面里
if line_count < 4
# 推进索引
@index += 1
# 设置输入数值
$game_temp.num_input_start = line_count
$game_temp.num_input_variable_id = @list[@index].parameters[0]
$game_temp.num_input_digits_max = @list[@index].parameters[1]
end
end
# = =b人物可以在对话的时候走动
$game_temp.message_text.gsub!(/\\[Hh]/) do
$game_system.hover_message = true
""
end
# 显示多窗口(层叠)= =b终于要写完了
$game_temp.message_text.gsub!(/\\[Cc][Dd]/) do
window = Window_Message.new
window.text = $game_temp.message_text
$game_system.multiple_windows.push(window)
$game_temp.message_text = nil
$game_temp.message_proc = nil
@message_waiting = false
""
end
return true if $game_temp.message_text.nil?
# 向上卷动
$game_temp.message_text.gsub!(/\\[Ss][Cc][Oo]/) do
$game_system.scrolling_text = "" if $game_system.scrolling_text.nil?
$game_system.scrolling_text += $game_temp.message_text
#$game_system.scrolling_text += "\n"
# 清除文章、选择项、输入数值的相关变量
$game_temp.message_text = nil
$game_temp.message_proc = nil
@message_waiting = false
""
end
return true if $game_temp.message_text.nil?
$game_temp.message_text.gsub!(/\\[Ss][Cc][Rr]/) do
$game_system.scrolling_text = "" if $game_system.scrolling_text.nil?
$game_system.scrolling_text += $game_temp.message_text
$game_system.scrolling_text.gsub!(/\\[Ss][Cc][Rr]/) { "" }
$game_system.scrolling_text.gsub!(/\\[Ss][Cc][Oo]/) { "" }
$game_temp.message_text = $game_system.scrolling_text
""
end
# 继续
return true
end
# 推进索引
@index += 1
end
end
end
2009-11-09_141014.png (87.06 KB, 下载次数: 14)
2009-11-09_140755.png (70.04 KB, 下载次数: 11)
name.png (343.94 KB, 下载次数: 11)
2.png (343.35 KB, 下载次数: 10)
3.png (351.59 KB, 下载次数: 11)
4.png (345.16 KB, 下载次数: 11)
5.png (342.33 KB, 下载次数: 10)
203.91 KB, 下载次数: 211
未命名.jpg (8.77 KB, 下载次数: 14)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |