Project1
标题:
这个怎么用?
[打印本页]
作者:
喜羊羊小凯
时间:
2013-7-28 22:17
标题:
这个怎么用?
首先是创立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使用的头像或者半身像拿过来,然后请看截图效果
因为我是新手,所以笨!
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1