赞 | 1 |
VIP | 116 |
好人卡 | 40 |
积分 | 4 |
经验 | 19804 |
最后登录 | 2017-12-13 |
在线时间 | 4175 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 432
- 在线时间
- 4175 小时
- 注册时间
- 2010-6-26
- 帖子
- 6474
|
我自己写的一个草稿,从XP的FUKI移植过来的。
本帖最后由 eve592370698 于 2012-2-13 22:11 编辑
首先是创立Heads文件夹识别:- 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使用的头像或者半身像拿过来,然后请看截图效果
|
评分
-
参与人数 2 | 星屑 +450 |
梦石 +2 |
收起
理由
|
冰舞蝶恋
| + 250 |
|
太神奇! |
「旅」
| + 200 |
+ 2 |
认可答案,恭喜你获得由66RPG提供的精美好. |
查看全部评分
|