#================================================================
# 可以随时调用的 是/否 选择窗口 by 洛克人SZ
# 用法: v 1.3
# if yes_no("提示信息")
# 选择 是 的情况下
# else
# 选择 否 的情况下
# end
#
# 也可以用在事件中的条件分歧里。
#================================================================
def yes_no(info = "请选择:")
dummy_bitmap = Bitmap.new(608, 32)
dummy_bitmap.font.size = 22
strwidth = dummy_bitmap.text_size(info).width
dummy_bitmap.dispose
dummy_bitmap = nil
strwidth = 88 if strwidth < 88
strwidth = strwidth / 2 + strwidth + 32
strwidth = 640 if strwidth > 640
yes_no_window = Window_YesNoCommand.new(info, strwidth)
yes_no_window.visible = true
yes_no_window.active = true
loop do
Graphics.update
Input.update
yes_no_window.update
if yes_no_window.active != true
break
end
end
fhxx = yes_no_window.fhxx
yes_no_window.dispose
yes_no_window = nil
return fhxx
end
#==============================================================================
# ■ Window_HorizSelectable
#------------------------------------------------------------------------------
# 拥有光标的移动以及滚动功能的窗口类。 (水平命令窗口专用)
#==============================================================================
class Window_HorizSelectable < Window_Base
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :index # 光标位置
attr_reader :help_window # 帮助窗口
attr_reader :help_windowa # 帮助窗口a
#--------------------------------------------------------------------------
# ● 初始化对像
# x : 窗口的 X 坐标
# y : 窗口的 Y 坐标
# width : 窗口的宽
# height : 窗口的高
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super(x, y, width, height)
@index = -1
end
#--------------------------------------------------------------------------
# ● 设置光标的位置
# index : 新的光标位置
#--------------------------------------------------------------------------
def index=(index)
@index = index
# 刷新帮助文本 (update_help 定义了继承目标)
if self.active and @help_window != nil
update_help
end
if self.active and @help_windowa != nil
update_helpa
end
# 刷新光标矩形
update_cursor_rect
end
#--------------------------------------------------------------------------
# ● 帮助窗口的设置
# help_window : 新的帮助窗口
#--------------------------------------------------------------------------
def help_window=(help_window)
@help_window = help_window
# 刷新帮助文本 (update_help 定义了继承目标)
if self.active and @help_window != nil
update_help
end
end
def help_windowa=(help_windowa)
@help_windowa = help_windowa
# 刷新帮助文本 (update_help 定义了继承目标)
if self.active and @help_windowa != nil
update_helpa
end
end
#--------------------------------------------------------------------------
# ● 更新光标矩形
#--------------------------------------------------------------------------
def update_cursor_rect
# 光标位置不满 0 的情况下
if @index < 0
self.cursor_rect.empty
return
end
# 计算光标的宽度
cursor_width = self.width / @item_max - 32
# 计算光标坐标
x = @index % @item_max * (cursor_width + 32)
y = @index / @item_max * 32 - self.oy
# 更新光标矩形
self.cursor_rect.set(x, y, cursor_width, 32)
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
super
# 可以移动光标的情况下
if self.active and @item_max > 0 and @index >= 0
# 方向键右被按下的情况下
if Input.repeat?(Input::RIGHT)
# 列数为 2 以上并且、光标位置在最后一个项目上的情况下
if @item_max >= 2 and @index == @item_max - 1 and
Input.trigger?(Input::RIGHT)
# 光标返回第一个项目
$game_system.se_play($data_system.cursor_se)
@index = 0
# 列数为 2 以上并且、光标位置在(项目数 - 1)之前的情况下
elsif @item_max >= 2 and @index < @item_max - 1
# 光标向右移动
$game_system.se_play($data_system.cursor_se)
@index += 1
end
end
# 方向键左被按下的情况下
if Input.repeat?(Input::LEFT)
# 列数为 2 以上并且、光标位置在 0 的情况下
if @item_max >= 2 and @index == 0 and
Input.trigger?(Input::LEFT)
# 光标移动到最后一个项目
$game_system.se_play($data_system.cursor_se)
@index = @item_max - 1
# 列数为 2 以上并且、光标位置在 0 之后的情况下
elsif @item_max >= 2 and @index > 0
# 光标向左移动
$game_system.se_play($data_system.cursor_se)
@index -= 1
end
end
end
# 刷新帮助文本 (update_help 定义了继承目标)
if self.active and @help_window != nil
update_help
end
# 刷新帮助文本 (update_help 定义了继承目标)
if self.active and @help_windowa != nil
update_helpa
end
# 刷新光标矩形
update_cursor_rect
end
end
#==============================================================================
# ■ Window_YesNoCommand
#------------------------------------------------------------------------------
# 选择是或否的命令选择行窗口。
#==============================================================================
class Window_YesNoCommand < Window_HorizSelectable
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :fhxx
#--------------------------------------------------------------------------
# ● 初始化对像
# info : 窗口的提示信息
# width : 窗口的宽度
# height : 窗口的高度
#--------------------------------------------------------------------------
def initialize(info = "欢迎", width = 480, height = 96)
x = 320 - width / 2
y = 240 - height / 2
super(x, y, width, height)
self.visible = false
self.active = false
self.opacity = 200
self.contents = Bitmap.new(width - 32, height - 32)
@commands = ["是", "否"]
@item_max = @commands.size
@woff = (self.width - 32) / 4 - 19
@fhxx = false
refresh(info)
self.index = 0
self.z = 10000
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh(info)
self.contents.clear
self.contents.font.size = 22
self.contents.font.color = system_color
self.contents.draw_text(0, 0, self.width - 32, 32, info, 1)
for i in 0...@item_max
draw_item(i, normal_color)
end
end
#--------------------------------------------------------------------------
# ● 描绘项目
# index : 项目编号
#--------------------------------------------------------------------------
def draw_item(index, color)
self.contents.font.color = color
x = self.width / @item_max * index + @woff
off = self.width / @item_max - 32
self.contents.draw_text(x, 32, 32, 32, @commands[index])
end
#--------------------------------------------------------------------------
# ● 项目无效化
# index : 项目编号
#--------------------------------------------------------------------------
def disable_item(index)
draw_item(index, disabled_color)
end
#--------------------------------------------------------------------------
# ● 更新光标矩形
#--------------------------------------------------------------------------
def update_cursor_rect
# 光标位置不满 0 的情况下
if @index < 0
self.cursor_rect.empty
return
end
# 计算光标的宽度
cursor_width = self.width / @item_max - 32
# 计算光标坐标
x = @index % @item_max * (cursor_width + 32)
y = 32
# 更新光标矩形
self.cursor_rect.set(x, y, cursor_width, 32)
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
super
# 按下取消键的情况下
if Input.trigger?(Input::B)
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
@fhxx = false
self.visible = false
self.active = false
return
end
# 按下确定键的情况下
if Input.trigger?(Input::C)
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 命令窗口的光标位置分支
case self.index
when 0 # 是
@fhxx = true
self.visible = false
self.active = false
when 1 # 否
@fhxx = false
self.visible = false
self.active = false
end
return
end
end
end