设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

fuki对话框(又名呼出对话框、漫画对话框)

2006-1-10 00:00| 发布者: 柳柳| 查看: 28114| 评论: 0|原作者: パラ犬(http://rpg.para.s3p.net/)

摘要:   作者 呼出对话框 ver. 1.31 By パラ犬(日)来自 http://rpg.para.s3p.net/汉化修改 66RPG bbschat(2006.1.5)来自 版本与更新 2006年1月 相关网址  点此进入讨论贴 范例工程 点此下载范例工
 

作者

呼出对话框 ver. 1.31 By パラ犬(日)
来自 http://rpg.para.s3p.net/
汉化修改 66RPG bbschat(2006.1.5)
来自

版本与更新

2006年1月

相关网址

 点此进入讨论贴

范例工程

点此下载范例工程

(此外《神迹时代》,《白马王子探寻记》等解密游戏中也用了此脚本,可自行查看) 



脚本功能


这个对话增强脚本在已经在不少游戏(比如:柳柳的ARPG神迹时代)里面用过了,

现在根据最新版本汉化并修改强化正式推出。

效果类似于漫画上的人物对话,有个小箭头指向这个人,

箭头后面的框框里面显示文字。

该脚本日文叫Message(メッセージ) FuKiDaSi(吹出し),

汉化意译成“呼出对话框”(又称Fuki)。

使用方法

复制全部脚本内容,在Main脚本之前按insert,插入此脚本全部内容。

 #    ●准备工作-窗口Skin
#
#    首先,确认自己使用的对话框窗口Skin,(数据库-系统-窗口外观图形)
#    然后根据该窗口Skin制作对话框尾部使用的两个箭头图形
#    尾部箭头图形命名方式:“窗口skin名-top”,“窗口skin名-under”
#    将该图形文件存放在“Graphics/Windowskins”文件夹下。
#
#    本演示游戏内置2套窗口和箭头图形,
#    一套是游戏默认的“001-Blue01”,一套是定制的“fk”
#    玩家可以根据自己的需要参照样本定制自己的呼出对话框窗口Skin。
#
#    ●呼出对话框使用方法
#
#    在事件命令行使用[脚本]将事件ID代入[$mes_id]
#    该事件就可以使用呼出对话框了。
#   (举例:$mes_id=4)
#
#    ID 代入 -1 表示玩家,代入 0 表示事件自身。
#    代入 nil 或者 "" 则返回成通常的信息窗口。
#    对话框的表示位置可以通过事件的“更改文章选项”来设定(上、中、下)。
#    表示位置为“中央”的话,不管事件位置在哪里,对话框都将显示在画面中央。
#
#    ●角色名字窗口的使用文字的方法
#
#    在事件命令行使用[脚本]将文字列代入[$mes_name]
#    对话框就会显示角色名字窗口
#   (举例:$mes_name="阿尔西斯")
#    代入 nil 或者 "" 则不显示角色名字窗口。
#
#    以上两个机能是独立的,所以可以单独使用
#
#   $mes_id=(ID) + $mes_name="名字"  :呼出对话框显示 + 角色名字窗口
#   $mes_id=(ID) + $mes_name=""      :呼出对话框显示(没有角色名字)
#   $mes_id=nil  + $mes_name="名字"  :默认信息窗口 + 角色名字窗口
#   $mes_id=nil  + $mes_name=""      :默认信息窗口(没有角色名字)
#
#    ●角色名字窗口使用角色图片的方法(汉化特别追加功能,原脚本只能使用文字)
#    
#    如果能在对应文件夹中找到文件名和角色名字相同的图片,    
#    则角色名字窗口显示角色头像图片,角色图片最好能包括角色的名字。
#    默认头像图片保存目录为“Graphics/Heads/”,玩家可自行修改。
#
#    如果不想使用角色名字直接作为头像文件名。
#    可以使用下面在 Game_Temp 类里增加的namebmp属性。
#    重新设定角色名字与文件名的对应关系。
#
#    ●信息表示速度的变更方法
#
#    在事件命令行使用[脚本]将数值代入[$mes_speed]
#    速度为 0 即瞬间显示全部信息,数字越大,信息表示速度越慢。
#   (举例:$mes_speed=1)
#
#    ●其他设置
#
#    请参照注释

其它

补一句,用脚本chat(id,"名字")就相当于

$mes_id=ID
$mes_name="名字"

注意:

该脚本修改了Scene_Map的main方法,并且替代了Window_Message,所以可能会带来冲突。

工程附带了2套窗口背景(Graphics/Windowskins下)
001-Blue01-top_b.png和001-Blue01-under_b.png是半透明窗口用尾部图标。(用的时候去掉_b)

该脚本可自定义文字,颜色,头像图片目录,是否使用尾部图标等,具体请参看注释。

 

 
 

 脚本内容

 #
#    呼出对话框 ver. 1.31 By パラ犬(日)
#  来自 http://rpg.para.s3p.net/
#
#  汉化修改 66RPG bbschat(2006.1.5)
#    来自
#
#    ●准备工作-窗口Skin
#
#    首先,确认自己使用的对话框窗口Skin,(数据库-系统-窗口外观图形)
#    然后根据该窗口Skin制作对话框尾部使用的两个箭头图形
#    尾部箭头图形命名方式:“窗口skin名-top”,“窗口skin名-under”
#    将该图形文件存放在“Graphics/Windowskins”文件夹下。
#
#    本演示游戏内置2套窗口和箭头图形,
#    一套是游戏默认的“001-Blue01”,一套是定制的“fk”
#    玩家可以根据自己的需要参照样本定制自己的呼出对话框窗口Skin。
#
#    ●呼出对话框使用方法
#
#    在事件命令行使用[脚本]将事件ID代入[$mes_id]
#    该事件就可以使用呼出对话框了。
#   (举例:$mes_id=4)
#
#    ID 代入 -1 表示玩家,代入 0 表示事件自身。
#    代入 nil 或者 "" 则返回成通常的信息窗口。
#    对话框的表示位置可以通过事件的“更改文章选项”来设定(上、中、下)。
#    表示位置为“中央”的话,不管事件位置在哪里,对话框都将显示在画面中央。
#
#    ●角色名字窗口的使用文字的方法
#
#    在事件命令行使用[脚本]将文字列代入[$mes_name]
#    对话框就会显示角色名字窗口
#   (举例:$mes_name="阿尔西斯")
#    代入 nil 或者 "" 则不显示角色名字窗口。
#
#    以上两个机能是独立的,所以可以单独使用
#
#   $mes_id=(ID) + $mes_name="名字"  :呼出对话框显示 + 角色名字窗口
#   $mes_id=(ID) + $mes_name=""      :呼出对话框显示(没有角色名字)
#   $mes_id=nil  + $mes_name="名字"  :默认信息窗口 + 角色名字窗口
#   $mes_id=nil  + $mes_name=""      :默认信息窗口(没有角色名字)
#
#    ●角色名字窗口使用角色图片的方法(汉化特别追加功能,原脚本只能使用文字)
#   
#    如果能在对应文件夹中找到文件名和角色名字相同的图片,   
#    则角色名字窗口显示角色头像图片,角色图片最好能包括角色的名字。
#    默认头像图片保存目录为“Graphics/Heads/”,玩家可自行修改。
#
#    如果不想使用角色名字直接作为头像文件名。
#    可以使用下面在 Game_Temp 类里增加的namebmp属性。
#    重新设定角色名字与文件名的对应关系。
#
#    ●信息表示速度的变更方法
#
#    在事件命令行使用[脚本]将数值代入[$mes_speed]
#    速度为 0 即瞬间显示全部信息,数字越大,信息表示速度越慢。
#   (举例:$mes_speed=1)
#
#    ●其他设置
#
#    请参照下面的注释
#
#    补一句,用脚本chat(id,"名字")就相当于$mes_id=ID;$mes_name="名字"
#==============================================================================

module FUKI

 # 头像图片保存目录的设定
 HEAD_PIC_DIR = "Graphics/Heads/"

 # 是否显示尾部图标
 TAIL_SHOW = true
 
 # Skin的设定
 # 使用数据库默认窗口Skin情况下这里使用[""]
 FUKI_SKIN_NAME = "001-Blue01"   # 呼出对话框用Skin
 NAME_SKIN_NAME = "001-Blue01"   # 角色名字窗口用Skin
 
 # 字体大小
 MES_FONT_SIZE = 22    # 呼出对话框
 NAME_FONT_SIZE = 14   # 角色名字窗口
 
 # 字体颜色
 #(设定为 Color.new(0, 0, 0, 0) 表示使用普通文字色)
 FUKI_COLOR = Color.new(255, 255, 255, 255)  # 呼出对话框
 NAME_COLOR = Color.new(255, 255, 255, 255)  # 角色名字窗口
 
 # 窗口透明度
 # 如修改窗口透明度请同时修改尾部箭头图形内部的透明度
 FUKI_OPACITY = 255    # 呼出对话框
 MES_OPACITY = 255     # 默认信息窗口
 NAME_OPACITY = 255    # 角色名字窗口
 
 # 角色名字窗口的相对位置
 NAME_SHIFT_X = 0      # 横坐标
 NAME_SHIFT_Y = 16     # 纵坐标
 
 # 窗口表示时是否根据画面大小自动检查窗口出现的位置,
 # 自动改变位置( true / false )
 # 设置成 true 可能出现箭头图标颠倒的问题 <- bbschat
 POS_FIX = false

 # 在画面最边缘表示时的稍微挪动
 # 使用圆形Skin的角和方框的角重合的情况下为 true
 CORNER_SHIFT = false
 SHIFT_PIXEL = 4   # true 时挪动的象素
 
 # 角色高度尺寸
 CHARACTOR_HEIGHT = 48
 # 呼出对话框的相对位置(纵坐标)
 POP_SHIFT_TOP = 0         # 表示位置为上的时候
 POP_SHIFT_UNDER = 0       # 表示位置为下的时候
 
 # 信息的表示速度(数字越小速度越快,0为瞬间表示)
 # 游戏中 可随时用数字代入 $mes_speed 来改变消息表示速度。
 MES_SPEED = 1

end

#==============================================================================
# 方便用户同时设置2个常用参数而使用的函数
#==============================================================================
def chat(id = 0,name = "")
 $mes_id = id
 $mes_name = name
end

#==============================================================================
# □ Game_Temp
#==============================================================================

class Game_Temp
 attr_accessor  :namebmp              #保存头像图片的Hash表
 alias initialize_fuki initialize
 def initialize
   initialize_fuki
   # 如果不想使用角色名字直接作为头像文件名
   # 可在这里重新设定角色名字与文件名的对应关系
   @namebmp ={"玩家"=>"001-Player-Face", "维斯特"=>"002-Player-Face"}
 end
end

#==============================================================================
# □ Window_FukiMessage
#==============================================================================

class Window_FukiMessage < 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
   @w = 0
   @h = 0
   @wait = 0
   @dx = 0
   @dy = 0
   $mes_speed = FUKI::MES_SPEED
 end
 
 #--------------------------------------------------------------------------
 # ○ 决定窗口尺寸并生成窗口
 #--------------------------------------------------------------------------
 def refresh_create
   self.contents.clear
   self.contents.font.color = normal_color
   self.contents.font.size = FUKI::MES_FONT_SIZE
   # 取得窗口尺寸
   get_windowsize
   w = @w + 32 + 8
   h = @h * (self.contents.font.size + 10) + 26
   # 生成呼出窗口
   set_fukidasi(self.x, self.y, w, h)
   # 生成角色名字窗口
   set_namewindow
   # 初始化信息表示使用的变量
   @dx = @dy = 0
   @cursor_width = 0
   @contents_drawing = true
   # 瞬间表示的情况下
   if $mes_speed == 0
     # 循环信息描绘处理
     while $game_temp.message_text != ""
       draw_massage
     end
     draw_opt_text
     @contents_showing_end = true
     @contents_drawing = false
   else
     # 一个一个描绘文字
     refresh_drawtext
   end
 end
 
 #--------------------------------------------------------------------------
 # ○ 一个一个描绘文字
 #--------------------------------------------------------------------------
 def refresh_drawtext
   if $game_temp.message_text != nil
     if @wait > 0
       @wait -= 1
     elsif @wait == 0
       # 描绘处理
       draw_massage
       @wait = $mes_speed
     end
   end
   # 描绘结束
   if $game_temp.message_text == ""
     draw_opt_text
     @contents_showing_end = true
     @contents_drawing = false
   end
 end
 
 #--------------------------------------------------------------------------
 # ○ 取得窗口尺寸
 #--------------------------------------------------------------------------
 def get_windowsize
   x = y = 0
   @h = @w = 0
   @cursor_width = 0
   # 有选择项的话,处理字的缩进
   if $game_temp.choice_start == 0
     x = 16
   end
   # 有等待显示的文字的情况下
   if $game_temp.message_text != nil
   text = $game_temp.message_text.clone
     # 限制文字处理
     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" }
     text.gsub!(/\\[Gg]/) { "\002" }
     # c 获取 1 个字 (如果不能取得文字就循环)
     while ((c = text.slice!(/./m)) != nil)
       # \\ 的情况下
       if c == "\000"
         # 还原为本来的文字
         c = "\\"
       end
       # \C[n] 或者 \G 的情况下
       if c == "\001" or c == "\002"
         # 下面的文字
         next
       end
       # 另起一行文字的情况下
       if c == "\n"
         # y 累加 1
         y += 1
         # 取得纵横尺寸
         @h = y
         @w = x > @w ? x : @w
         if y >= $game_temp.choice_start
           @w = x + 8 > @w ? x + 8 : @w
         end
         x = 0
         # 移动到选择项的下一行
         if y >= $game_temp.choice_start
           x = 8
         end
         # 下面的文字
         next
       end
       # x 为要描绘文字的宽度加法运算
       x += self.contents.text_size(c).width
     end
   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]
     @h += 1
     x = digits_max * self.contents.font.size + 16
     @w = x > @w ? x : @w
   end
 end
 
 #--------------------------------------------------------------------------
 # ○ 描绘信息处理
 #--------------------------------------------------------------------------
 def draw_massage
   # 有等待显示的文字的情况下
   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 个字
     if ((c = text.slice!(/./m)) != nil)
       # 选择项的情况
       if @dy >= $game_temp.choice_start
         # 处理字的缩进
         @dx = 8
         # 描绘文字
         self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)
         # x 为要描绘文字宽度的加法运算
         @dx += self.contents.text_size(c).width
         # 循环
         while ((c = text.slice!(/./m)) != "\n")
           # 描绘文字
           self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)
           # x 为要描绘文字宽度的加法运算
           @dx += self.contents.text_size(c).width
         end
         if c == "\n"
           # 更新光标宽度
           @cursor_width = [@cursor_width, @dx].max
           # dy 累加 1
           @dy += 1
           @dx = 0
         end
         return
       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 = text_color(color)
         end
       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
       end
       # 另起一行文字的情况下
       if c == "\n"
         # dy 累加 1
         @dy += 1
         @dx = 0
       end
       # 描绘文字
       self.contents.font.size = FUKI::MES_FONT_SIZE
       font_size = self.contents.font.size
       self.contents.draw_text(4+@dx, (font_size+10)*@dy, font_size, font_size, c)
       # dx 为要描绘文字的宽度加法运算
       @dx += self.contents.text_size(c).width
     end
   end
 end
 
 #--------------------------------------------------------------------------
 # ○ 选择项和输入数值的情况下
 #--------------------------------------------------------------------------
 def draw_opt_text
   # 选择项的情况下
   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
 end
 
 #--------------------------------------------------------------------------
 # ○ 设置呼出对话框
 #--------------------------------------------------------------------------
 def set_fukidasi(x, y, width, height)
   # $mes_id 为空的时候,不显示呼出对话框
   if $mes_id == nil or $mes_id == ""
     del_fukidasi
     reset_window
   else
     # 不显示暂停标志
     self.pause = false
     # 取得对话框位置
     pos = get_fuki_pos(width, height)
     x = pos[0]
     y = pos[1]
     skin = FUKI::FUKI_SKIN_NAME != "" ? FUKI::FUKI_SKIN_NAME : $game_system.windowskin_name
     # 生成呼出对话框
     self.windowskin = RPG::Cache.windowskin(skin)
     self.x = x
     self.y = y
     self.height = height
     self.width = width
     self.contents.dispose
     self.contents = Bitmap.new(width - 32, height - 32)
     self.back_opacity = FUKI::FUKI_OPACITY
     self.contents.clear
     self.contents.font.color = normal_color
     self.contents.font.size = FUKI::MES_FONT_SIZE
     # 描绘尾部图标
     if $game_system.message_frame == 0
       # 取得位置
       tale_pos = get_tale_pos
       @tale = Sprite.new
       # 是否显示尾部图标 <- bbschat
       if FUKI::TAIL_SHOW == true
         case @message_position
           when 0  # 上
             @tale.bitmap = RPG::Cache.windowskin(skin + "-top")
             @tale.x = tale_pos[0]
             @tale.y = tale_pos[1]
             @tale.z = self.z + 1
           when 1  # 中
             @tale.dispose
             @tale = nil
           when 2  # 下
             @tale.bitmap = RPG::Cache.windowskin(skin + "-under")
             @tale.x = tale_pos[0]
             @tale.y = tale_pos[1]
             @tale.z = self.z + 1
         end
       end
     end
   end
 end
 
 #--------------------------------------------------------------------------
 # ○ 计算呼出对话框的位置
 #--------------------------------------------------------------------------
 def get_fuki_pos(width, height)
  
   # 取得角色
   @character = get_character($mes_id)
   if @character == nil
     # 角色不存在的情况下使用默认信息框
     del_fukidasi
     reset_window
     return
   end
   # 处理坐标
   x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - (width / 2)
   # 为尽量显示在画面内而移动横坐标
   if x + width > 640
     x = 640 - width
   elsif x < 0
     x = 0
   end
   # 决定窗口位置
   case $game_system.message_position
     when 0  # 上
       y = (@character.real_y - $game_map.display_y + 64) * 32 / 128 - height - FUKI::CHARACTOR_HEIGHT + FUKI::POP_SHIFT_TOP
     when 1  # 中
       y = (480 - height) / 2
       x = (640 - width) / 2
     when 2  # 下
       y =  (@character.real_y - $game_map.display_y + 64) * 32 / 128 + 32 + FUKI::POP_SHIFT_UNDER
   end
   # 纪录文章显示位置
   @message_position = $game_system.message_position
   # 如果选择自动修正,则如果文章会显示到画面外则自动改变窗口的尺寸(高度)
   if FUKI::POS_FIX
     case @message_position
       when 0  # 上
         if y <= 0
           @message_position = 2
           y =  (@character.real_y - $game_map.display_y + 64) * 32 / 128 + 32 + FUKI::POP_SHIFT_UNDER
         end
       when 2  # 下
         if y + height >= 480
           p "上"
           @message_position = 0
           y = (@character.real_y - $game_map.display_y + 64) * 32 / 128 - height - FUKI::CHARACTOR_HEIGHT + FUKI::POP_SHIFT_TOP
         end
     end
   end
   return [x,y]
  
 end
 
 #--------------------------------------------------------------------------
 # ○ 计算尾部图标的位置
 #--------------------------------------------------------------------------
 def get_tale_pos
   case @message_position
     when 0  # 上
       # 处理坐标
       x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - 16
       # 画面边缘的话则移动位置
       if FUKI::CORNER_SHIFT
         if x == 0
           x = FUKI::SHIFT_PIXEL
         elsif x == 640 - 32
           x = 640 - 32 - FUKI::SHIFT_PIXEL
         end
       end
       y = self.y + self.height - 16
     when 1  # 中
       x = nil
       y = nil
     when 2  # 下
       # 处理坐标
       x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - 16
       # 画面边缘的话则移动位置
       if FUKI::CORNER_SHIFT
         if x == 0
           x = FUKI::SHIFT_PIXEL
         elsif @tale.x == 640 - 32
           x = 640 - 32 - FUKI::SHIFT_PIXEL
         end
       end
       y = self.y - 16
   end
   return [x,y]
 end

 #--------------------------------------------------------------------------
 # ○ 计算名字窗口的位置
 #--------------------------------------------------------------------------
 def get_name_pos
   case @face_pic_txt
     when 0  # 文字
       x = self.x + FUKI::NAME_SHIFT_X
       y = self.y - FUKI::NAME_FONT_SIZE - 16 + FUKI::N

2

鲜花

刚表态过的朋友 (2 人)

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码