| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 2323 |  
| 最后登录 | 2014-2-26 |  
| 在线时间 | 98 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间98 小时注册时间2013-6-21帖子5 | 
| 
首先是创立Heads文件夹识别:
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  module Cache
 #--------------------------------------------------------------------------
 # ○ 取得半身像
 def self.head(filename)
 load_bitmap("Graphics/Heads/", filename)
 end
 end
 复制代码
 模仿XP的FUKI对话框创建事件脚本代号
 class Game_Interpreter
 =begin ═════════════════════════════════
 □ FUKI对话框的自定义
 --------------------------------------------------
 考虑到用户的习惯,就不改变了
 ○ 方便用户同时设置2个常用参数而使用的函数,
 =end #--------------------------------------------------
 def chat(id = nil ,name = nil , nes_width = true , mes_line = 4 )
 if id == 0
 # 没办法了,只好在这里动动手脚吧
 $mes_id = @event_id
 else
 $mes_id = id
 end
 $mes_name = name
 $mes_width = nes_width
 pngFile = "Graphics/Heads/" + name + ".png"
 if FileTest.exist?(pngFile) == true
 p "真的存在啊"
 $has_head = true
 else
 $has_head = false
 
 end
 
 SceneManager::scene.changelines(mes_line)
 end
 
 
 
 end
 复制代码
 设定FUKI对话框参数
 module FUKI
 
 
 # Skin的设定使用数据库默认窗口Skin情况下这里使用[""]
 FUKI_SKIN_NAME = ""   # 呼出对话框用Skin
 NAME_SKIN_NAME = ""   # 角色名字窗口用Skin
 #↓最多显示的行数,如果超过,就智能化地分成多次显示。
 Line_Max = 12
 
 # 字体大小
 MES_FONT_SIZE = 22    # 呼出对话框
 NAME_FONT_SIZE = 18   # 角色名字窗口
 #   这里是FUKI多选框的参数设置!
 # 字体颜色(设定为 Color.new(0, 0, 0, 0) 表示使用普通文字色)
 FUKI_COLOR = Color.new(2, 2, 2, 255)  # 呼出对话框
 NAME_COLOR = Color.new(255, 255, 255, 255)  # 角色名字窗口
 
 # 窗口透明度,如修改窗口透明度请同时修改尾部箭头图形内部的透明度
 FUKI_OPACITY = 200    # 呼出对话框
 MES_OPACITY = 200     # 默认信息窗口
 NAME_OPACITY = 200    # 角色名字窗口
 
 # 角色名字窗口的相对位置
 NAME_SHIFT_X = 0      # 横坐标
 NAME_SHIFT_Y = 16     # 纵坐标
 
 end
 复制代码
 替换原来的Window_Message
 注意,是替换!不是插入
 #==============================================================================
 # ■ Window_Message
 #------------------------------------------------------------------------------
 #  显示文章信息的窗口。
 #==============================================================================
 
 class Window_Message < Window_Base
 #--------------------------------------------------------------------------
 # ● 初始化
 #--------------------------------------------------------------------------
 def initialize( linenumber = 4 )
 @linenumber = linenumber
 #↓初始化数值好像和self.后面数值不一样
 super(0, 0, window_width , window_height)
 self.z = 200
 self.openness = 0
 #↓初始化为兼容半身像
 create_all_windows
 create_back_bitmap
 create_back_sprite
 clear_instance_variables
 end  #-------
 # ● 取得窗口的宽度
 #--------------------------------------------------------------------------
 def window_width
 Graphics.width
 end
 =begin  #--------------------------------------------------------------------------
 ● 取得窗口的高度上限,我干脆直接弄到一起吧。
 =end  #--------------------------------------------------------------------------
 def window_height
 #坑爹的初始化值啊!限制头像!
 fitting_height(@linenumber)
 # 真不知道这是方法还是变量了。
 #↑应该是限制最多显示的行数,如果超了,就自动换行。
 end
 
 
 #--------------------------------------------------------------------------
 # ● 清除实例变量
 #--------------------------------------------------------------------------
 def clear_instance_variables
 @fiber = nil                # 纤程
 @background = 0             # 背景类型
 @position = 2               # 显示位置
 clear_flags
 end
 #--------------------------------------------------------------------------
 # ● 清除的标帜
 #--------------------------------------------------------------------------
 def clear_flags
 @show_fast = false          # 快进的标帜
 @line_show_fast = false     # 行单位快进的标帜
 @pause_skip = false         # [不进行输入等待]的标帜
 end
 
 #--------------------------------------------------------------------------
 # ● 释放
 #--------------------------------------------------------------------------
 def dispose
 super
 dispose_all_windows
 dispose_back_bitmap
 dispose_back_sprite
 end
 #--------------------------------------------------------------------------
 # ● 帧更新
 #--------------------------------------------------------------------------
 def update
 super
 update_all_windows
 update_back_sprite
 update_fiber
 end
 #--------------------------------------------------------------------------
 # ● 纤程的更新
 #--------------------------------------------------------------------------
 def update_fiber
 if @fiber
 @fiber.resume
 elsif $game_message.busy? && !$game_message.scroll_mode
 @fiber = Fiber.new { fiber_main }
 @fiber.resume
 else
 $game_message.visible = false
 end
 end
 #--------------------------------------------------------------------------
 # ● 生成所有窗口
 #--------------------------------------------------------------------------
 def create_all_windows
 @gold_window = Window_Gold.new
 @gold_window.x = Graphics.width - @gold_window.width
 @gold_window.y = 0
 @gold_window.openness = 0
 @choice_window = Window_ChoiceList.new(self)
 @number_window = Window_NumberInput.new(self)
 @item_window = Window_KeyItem.new(self)
 end
 #--------------------------------------------------------------------------
 # ● 生成背景位图
 #--------------------------------------------------------------------------
 def create_back_bitmap
 @back_bitmap = Bitmap.new(width, height)
 rect1 = Rect.new(0, 0, width, 12)
 rect2 = Rect.new(0, 12, width, height - 24)
 rect3 = Rect.new(0, height - 12, width, 12)
 @back_bitmap.gradient_fill_rect(rect1, back_color2, back_color1, true)
 @back_bitmap.fill_rect(rect2, back_color1)
 @back_bitmap.gradient_fill_rect(rect3, back_color1, back_color2, true)
 end
 #--------------------------------------------------------------------------
 # ● 取得背景色 1
 #--------------------------------------------------------------------------
 def back_color1
 Color.new(0, 0, 0, 160)
 end
 #--------------------------------------------------------------------------
 # ● 取得背景色 2
 #--------------------------------------------------------------------------
 def back_color2
 Color.new(0, 0, 0, 0)
 end
 #--------------------------------------------------------------------------
 # ● 生成背景活动块
 #--------------------------------------------------------------------------
 def create_back_sprite
 @back_sprite = Sprite.new
 @back_sprite.bitmap = @back_bitmap
 @back_sprite.visible = false
 @back_sprite.z = z - 1
 end
 #--------------------------------------------------------------------------
 # ● 释放所有窗口
 #--------------------------------------------------------------------------
 def dispose_all_windows
 @gold_window.dispose
 @choice_window.dispose
 @number_window.dispose
 @item_window.dispose
 end
 #--------------------------------------------------------------------------
 # ● 释放背景位图
 #--------------------------------------------------------------------------
 def dispose_back_bitmap
 @back_bitmap.dispose
 end
 #--------------------------------------------------------------------------
 # ● 释放背景活动块
 #--------------------------------------------------------------------------
 def dispose_back_sprite
 @back_sprite.dispose
 end
 #--------------------------------------------------------------------------
 # ● 更新所有窗口
 #--------------------------------------------------------------------------
 def update_all_windows
 @gold_window.update
 @choice_window.update
 @number_window.update
 @item_window.update
 end
 #--------------------------------------------------------------------------
 # ● 更新背景活动块
 #--------------------------------------------------------------------------
 def update_back_sprite
 @back_sprite.visible = (@background == 1)
 @back_sprite.y = y
 @back_sprite.opacity = openness
 @back_sprite.update
 end
 =begin --------------------------------------------------------------------------
 ★ 处理进程的主逻辑
 由于某人翻译措辞不当导致本人误会
 
 =end #--------------------------------------------------------------------------
 def fiber_main
 self.height = window_height
 
 
 $game_message.visible = true
 update_background
 loop do
 # 这样让每次对话框内出现字符时都更新一次各种精灵和窗口的位置。
 update_placement
 # ↑那个说明已经获取了文章位置了,给它先转移过来。
 # 默认在text_continue?判定是否还有字符+是否位置一样。
 
 get_tale_pos
 set_namewindow
 # 如果位置一样并且还有字符的话,就会回到loop的这个位置,因此不会更新。
 process_all_text if $game_message.has_text?
 process_input
 $game_message.clear
 @gold_window.close
 # ↓顺便把释放也放到这里,每次循环释放一次。
 fuki_dispose
 Fiber.yield
 break unless text_continue?
 end
 close_and_wait
 $game_message.visible = false
 @fiber = nil
 end
 
 #--------------------------------------------------------------------------
 # ● 更新窗口背景
 #------------------------------------
 def update_background
 @background = $game_message.background
 self.opacity = @background == 0 ? 255 : 0
 end
 =begin --------------------------------------------
 ★ 更新窗口的位置
 这里特别要说明一下:
 在XP以及旧版本的VX中,文章位置是用常数设定好的,
 =end  #————————————————————————————————————————————————————————————————
 def update_placement
 @position = $game_message.position
 # ↓ 在这里,成为变量决定了。
 self.y = @position * (Graphics.height - height) / 2
 @gold_window.y = y > 0 ? 0 : Graphics.height - @gold_window.height
 end
 =begin        ╔════════════════╗
 ║★ 友情说明 ★║
 ╚════════════════╝
 下面那些内容是从XP的FUKI对话框移植过来的。
 ————————————————————————————————————————————————————————————————————————
 ☆ 取得角色位置
 由XP的FUKI对话框仿制过来
 =end #--------------------------------------------------------------------
 def get_tale_pos
 #↓获取角色,坐标
 if $mes_id == nil
 return
 elsif $mes_id >= 0
 x = $game_map.events[$mes_id].screen_x
 y = $game_map.events[$mes_id].screen_y
 elsif $mes_id == -1
 x = $game_player.screen_x
 y = $game_player.screen_y
 else
 party_followers = 0 - $mes_id - 2
 x = $game_player.followers[party_followers].screen_x
 y = $game_player.followers[party_followers].screen_y
 end
 #↓给说话的人弄个方块
 @tale_cursor = Sprite.new
 @tale_cursor.bitmap = Cache.system("cursor")
 #处理坐标,请注意,图标文件以改变,故在此重新修正数值。
 @tale_cursor.x = x - 16
 @tale_cursor.y = y - 32
 @tale_cursor.z = self.z + 1
 #↓然后弄个对话框箭头
 @tale_fuki = Sprite.new
 #↓使用局部变量请注意上面进程调用方法的先后顺序
 if @position == 0
 @tale_fuki.bitmap = Cache.system("上角标")
 @tale_fuki.x = x
 @tale_fuki.y = y - 55
 if @tale_fuki.y > self.y + height
 self.y += ( @tale_fuki.y - height )
 else
 @tale_fuki.dispose
 end
 elsif @position == 2
 @tale_fuki.bitmap = Cache.system("下角标")
 @tale_fuki.x = x
 @tale_fuki.y = y
 if self.y > @tale_fuki.y + @tale_fuki.bitmap.height
 self.y = @tale_fuki.y + @tale_fuki.bitmap.height
 else
 @tale_fuki.dispose
 end
 else
 @tale_fuki.dispose
 end
 end
 =begin ——————————————————————————————————————————————
 ★ 生成角色名字窗口
 这里我基本上把XP的弄过来的,除了windowskin,这个函数,别的都是原样照搬
 没办法啊,刚开始,别对我有太高的期望
 =end #————————————————————————————————————————————————
 def set_namewindow
 
 #↓因VX窗口设定变了,所以就这么弄吧
 windowskin = Cache.system("Window")
 # ↓获取高度
 # ●
 #--------------------------------------------------------------------------
 if $mes_name == nil or $mes_name == "" or $mes_name == false or $game_message.background != 0
 return
 
 
 #↓如果想使用半身像的话,注意文件不太支持中文名。
 elsif $has_head == true and ( $game_message.face_name.empty? or @linenumber < 4 )
 bmp = Cache.head($mes_name)
 @pic_width = bmp.width
 @pic_height = bmp.height
 
 name_x = self.x + FUKI::NAME_SHIFT_X
 name_y = self.y - @pic_height - 22 + FUKI::NAME_SHIFT_Y
 
 # 生成角色头像窗口
 @name_win = Window_Base.new(name_x, name_y, @pic_width + 5, @pic_height + 5)
 @name_win.windowskin = windowskin
 @name_win.back_opacity = FUKI::NAME_OPACITY
 @name_win.z = self.z + 2
 
 @name_contents = Sprite.new
 @name_contents.bitmap = bmp
 @name_contents.x = name_x + 2
 @name_contents.y = name_y + 2
 @name_contents.z = @name_win.z + 2
 else
 # 设定变量
 mes_name = $mes_name #
 
 #↓生成名字的宽度,这里好像对字符的大小重新定义了
 name_width = mes_name.size * FUKI::NAME_FONT_SIZE
 name_height = FUKI::NAME_FONT_SIZE
 
 @name_x = self.x + FUKI::NAME_SHIFT_X
 @name_y = self.y - name_height - 22 + FUKI::NAME_SHIFT_Y
 @name_y = 0 if @name_y < 0
 # 生成角色名字窗口(只有边框)
 @name_win = Window_Base.new(@name_x, @name_y, name_width + 16, name_height + 16)
 @name_win.windowskin = windowskin
 @name_win.back_opacity = FUKI::NAME_OPACITY
 @name_win.z = self.z + 2
 =begin ↑设定窗口边框结束了
 ↓设定名字窗口内容开始
 =end  # 为了使空白比Windows类限定的更小使用双重结构
 @name_contents = Sprite.new
 @name_contents.x = @name_x + 12
 @name_contents.y = @name_y + 8
 @name_contents.bitmap = Bitmap.new(name_width, name_height)
 @name_contents.z = self.z + 2
 # 设定文字色
 nil_color = Color.new(0,0,0,0)
 if FUKI::NAME_COLOR != nil_color
 @name_contents.bitmap.font.color = FUKI::NAME_COLOR
 else
 @name_contents.bitmap.font.color = normal_color
 end
 @name_contents.bitmap.font.size = FUKI::NAME_FONT_SIZE
 # 调整窗口尺寸
 rect = @name_contents.bitmap.text_size(mes_name)
 @name_win.width = rect.width + 32
 # 描画名字
 @name_contents.bitmap.draw_text(rect, mes_name)
 # 模仿猫君的杰作colortext
 @name_contents.bitmap.clear
 colortext = mes_name.clone
 # 描画名字
 # 重置x坐标
 x = 0
 # 为了方便、将 "\\\\" 变换为 "\000"
 colortext.gsub!(/\\\\/) { "\000" }
 # "\\C" 变为 需要的功能
 colortext.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
 # c 获取 1 个字 (如果不能取得文字就循环)
 while ((c = colortext.slice!(/./m)) != nil)
 # \\ 的情况下
 if c == "\000"
 # 还原为本来的文字
 c = "\\"
 end
 # \C[n] 的情况下
 if c == "\001"
 # 兼容1.03
 c = ""
 # 更改文字色
 colortext.sub!(/\[([0-9]+)\]/, "")
 color = $1.to_i
 if color >= 0 and color <= 7
 @name_contents.bitmap.font.color = text_color(color)
 end
 # 下面的文字
 next
 end
 # 调整窗口尺寸
 # 描绘文字
 @name_contents.bitmap.draw_text(x,2 + name_height / 2 - FUKI::NAME_FONT_SIZE , 40, 32, c )
 # 推进x坐标
 x += @name_contents.bitmap.text_size(c).width
 end
 end
 
 
 end
 
 =begin -----------------------------------
 ☆ 这里就是释放窗口了
 引用癫狂侠客那句话就是早借早还……
 就是这位置实在是不好找啊
 =end #---------------------------------------
 def fuki_dispose
 unless @tale_cursor == nil
 @tale_cursor.dispose
 end
 unless @tale_fuki == nil
 @tale_fuki.dispose
 end
 unless @name_win == nil
 @name_win.dispose
 end
 unless @name_contents == nil
 @name_contents.dispose
 end
 unless @face_fuki_vx == nil
 @face_fuki_vx.dispose
 end
 end
 =begin        ╔════════════════╗
 ║★ 友情说明 ★║
 ╚════════════════╝
 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 一下内容是从旧VX的一些增强对话框移植过来的
 -------------------------------------------------------------------
 ○ 生成半身像,绕过VX头像
 VX ACE默认的这个头像显示真的好坑爹!
 =end  #----------------------------------------------
 
 
 
 =begin ----------------------------
 
 =end #--------------------------------------------------------------------------
 
 # ○ 设定半身像位置
 #--------------------------------------------------------------------------
 
 # ○ 获取半身像高度
 #     face_name  : 半身像图像文件名
 #--------------------------------------------------------------------------
 
 
 
 
 =begin     ┏━━━━━━━━━━━━━━━━━━━━┓
 ┃ 好了,下面继续VX ACE的默认内容 ┃
 ┗━━━━━━━━━━━━━━━━━━━━┛
 ————————————————————————————————————————————————————————————————————
 
 # ● 处理所有内容
 =end #--------------------------------------------------------------------------
 def process_all_text
 open_and_wait
 text = convert_escape_characters($game_message.all_text)
 pos = {}
 new_page(text, pos)
 process_character(text.slice!(0, 1), text, pos) until text.empty?
 end
 #--------------------------------------------------------------------------
 # ● 输入处理
 #--------------------------------------------------------------------------
 def process_input
 if $game_message.choice?
 input_choice
 elsif $game_message.num_input?
 input_number
 elsif $game_message.item_choice?
 input_item
 else
 input_pause unless @pause_skip
 end
 end
 #--------------------------------------------------------------------------
 # ● 打开窗口并等待窗口开启完成
 #--------------------------------------------------------------------------
 def open_and_wait
 open
 Fiber.yield until open?
 end
 #--------------------------------------------------------------------------
 # ● 关闭窗口并等待窗口关闭完成
 #--------------------------------------------------------------------------
 def close_and_wait
 close
 Fiber.yield until all_close?
 end
 #--------------------------------------------------------------------------
 # ● 判定是否所有窗口已全部关闭
 #--------------------------------------------------------------------------
 def all_close?
 close? && @choice_window.close? &&
 @number_window.close? && @item_window.close?
 end
 #--------------------------------------------------------------------------
 # ● 判定文章是否继续显示
 #--------------------------------------------------------------------------
 def text_continue?
 $game_message.has_text? && !settings_changed?
 end
 #--------------------------------------------------------------------------
 # ● 判定背景和位置是否被变更
 #--------------------------------------------------------------------------
 def settings_changed?
 @background != $game_message.background ||
 @position != $game_message.position
 end
 #--------------------------------------------------------------------------
 # ● 等待
 #--------------------------------------------------------------------------
 def wait(duration)
 duration.times { Fiber.yield }
 end
 #--------------------------------------------------------------------------
 # ● 监听[确定]键的按下,更新快进的标帜
 #--------------------------------------------------------------------------
 def update_show_fast
 @show_fast = true if Input.trigger?(:C)
 end
 #--------------------------------------------------------------------------
 # ● 输出一个字符后的等待
 #--------------------------------------------------------------------------
 def wait_for_one_character
 update_show_fast
 Fiber.yield unless @show_fast || @line_show_fast
 end
 =begin --------------------------------------------------------------------------
 ★ 翻页处理,真的是一大让我头疼得要命的难题啊
 =end  #--------------------------------------------------------------------------
 def new_page(text, pos)
 contents.clear
 #↓这个处理头像是有点难度,得改一改了
 if @linenumber >= 4
 draw_face($game_message.face_name, $game_message.face_index, 0, 0)
 end
 reset_font_settings
 pos[:x] = new_line_x
 pos[:y] = 0 #- $face_height + self.height
 pos[:new_x] = new_line_x
 #↓原来是行间距差不多啊?
 pos[:height] = calc_line_height(text)
 clear_flags
 end
 #--------------------------------------------------------------------------
 # ● 取得换行位置,因为坑爹的头像识别,这里又改回去了
 #--------------------------------------------------------------------------
 def new_line_x
 if $game_message.face_name.empty? or @linenumber < 4
 return 0
 else
 return  112
 end
 end
 #--------------------------------------------------------------------------
 # ● 普通文字的处理
 #--------------------------------------------------------------------------
 def process_normal_character(c, pos)
 super
 wait_for_one_character
 end
 #--------------------------------------------------------------------------
 # ● 换行文字的处理
 #--------------------------------------------------------------------------
 def process_new_line(text, pos)
 @line_show_fast = false
 super
 if need_new_page?(text, pos)
 input_pause
 new_page(text, pos)
 end
 end
 #--------------------------------------------------------------------------
 # ● 判定是否需要翻页
 #--------------------------------------------------------------------------
 def need_new_page?(text, pos)
 #做一下局部修改,以便适应变量的变化
 a = @linenumber * line_height
 pos[:y] + pos[:height] > a && !text.empty?
 end
 #--------------------------------------------------------------------------
 # ● 翻页文字的处理
 #--------------------------------------------------------------------------
 def process_new_page(text, pos)
 text.slice!(/^\n/)
 input_pause
 new_page(text, pos)
 end
 #--------------------------------------------------------------------------
 # ● 处理控制符指定的图标描画
 #--------------------------------------------------------------------------
 def process_draw_icon(icon_index, pos)
 super
 wait_for_one_character
 end
 =begin --------------------------------------------------------------------------
 ★ 控制符的处理
 code : 控制符的实际形式(比如「\C[1]」是「C」)
 text : 描画处理中的字符串缓存(字符串可能会被修改)
 pos  : 描画位置 {:x, :y, :new_x, :height}
 这里特别说明一下,case c when有很多内容是隐藏在内部类中的,少部分在父类
 Window_Base中,所以不要随便定义以防止冲突
 =end #--------------------------------------------------------------------------
 def process_escape_character(code, text, pos)
 case code.upcase
 when '$'
 @gold_window.open
 when '.'
 wait(15)
 when '|'
 wait(60)
 when '!'
 input_pause
 when '>'
 @line_show_fast = true
 when '<'
 @line_show_fast = false
 when '^'
 @pause_skip = true
 else
 super
 end
 end
 #--------------------------------------------------------------------------
 # ● 处理输入等待
 #--------------------------------------------------------------------------
 def input_pause
 self.pause = true
 wait(10)
 Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C)
 Input.update
 self.pause = false
 end
 #--------------------------------------------------------------------------
 # ● 处理选项的输入
 #--------------------------------------------------------------------------
 def input_choice
 @choice_window.start
 Fiber.yield while @choice_window.active
 end
 #--------------------------------------------------------------------------
 # ● 处理数值的输入
 #--------------------------------------------------------------------------
 def input_number
 @number_window.start
 Fiber.yield while @number_window.active
 end
 #--------------------------------------------------------------------------
 # ● 处理物品的选择
 #--------------------------------------------------------------------------
 def input_item
 @item_window.start
 Fiber.yield while @item_window.active
 end
 end
 复制代码
 @怕鼠的猫 还有一个插入脚本
 class Scene_Map < Scene_Base
 =begin  --------------------------------------
 + 换行变化
 调用方法:事件中的脚本输入    SceneManager::scene.changelines(2)
 就变成两行对话框了。以后持续有效
 =end #------------------------------------
 def changelines(n)
 @message_window.dispose
 @message_window = Window_Message.new(n)
 end
 end
 复制代码
 一定要在Graphics文件夹下创建一个Heads文件夹,把XP使用的头像或者半身像拿过来,然后请看截图效果
 
 
 因为我是新手,所以笨!
 | 
 |