本帖最后由 RyanBern 于 2014-9-20 11:43 编辑
简单做了一个,没有进行测试。在地图场景模式下,使用事件脚本:可以调出防具选择对话框,选择完毕后,被选择的防具会自动进入背包。(也可以按ESC取消选择)
按照要求,窗口显示的内容被限制在1~3号变量所代表的防具。
class Game_System alias rb_initialize initialize def initialize @armor_storage = {} rb_initialize end def armor_storage(armor_id) @armor_storage = {} if @armor_storage.nil? return @armor_storage[armor_id].nil? ? 2 : @armor_storage[armor_id] end def storage_export(id, number) @armor_storage[id] = [armor_storage(id) - number, 0].max end end class Window_ArmorSelect < Window_Selectable def initialize super(0, 0, 256, 32) self.x = 320 - width / 2 self.y = 240 - height / 2 self.visible = false self.active = false self.index = 0 refresh end def refresh @data = [] (1..3).each do |i| id = $game_variables[i] armor = $data_armors[id] @data.push($data_armors[id]) unless armor.nil? || $game_system.armor_storage(id) == 0 end self.height = (1 + @data.size) * 32 if self.contents != nil self.contents.dispose self.contents = nil end @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, @item_max * 32) (0...@item_max).each do |i| draw_item(i) end end end def draw_item(index) item = @data[index] if item == nil return end x = 4 y = 32 * index color = $game_system.armor_storage(item.id) > 0 ? normal_color : disabled_color self.contents.font.color = color opacity = $game_system.armor_storage(item.id) > 0 ? 255 : 128 bitmap = RPG::Cache.icon(item.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) self.contents.draw_text(x + 28, y, 160, 32, item.name) text = ": " + $game_system.armor_storage(item.id).to_s self.contents.draw_text(0, y, width - 32, 32, text, 2) end def armor @data[self.index] end def show refresh self.visible = true self.active = true end end class Scene_Map alias rb_main main def main @armor_window = Window_ArmorSelect.new rb_main @armor_window.dispose end alias rb_update update def update if @armor_window.active update_armor return end rb_update end def update_armor @armor_window.update if Input.trigger?(Input::C) armor_id = @armor_window.armor.id if $game_system.armor_storage(armor_id) == 0 $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @armor_window.active = false @armor_window.visible = false $game_party.gain_armor(armor_id, 1) $game_system.storage_export(armor_id, 1) return end if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @armor_window.visible = false @armor_window.active = false return end end def show_armor_select @armor_window.show end end
class Game_System
alias rb_initialize initialize
def initialize
@armor_storage = {}
rb_initialize
end
def armor_storage(armor_id)
@armor_storage = {} if @armor_storage.nil?
return @armor_storage[armor_id].nil? ? 2 : @armor_storage[armor_id]
end
def storage_export(id, number)
@armor_storage[id] = [armor_storage(id) - number, 0].max
end
end
class Window_ArmorSelect < Window_Selectable
def initialize
super(0, 0, 256, 32)
self.x = 320 - width / 2
self.y = 240 - height / 2
self.visible = false
self.active = false
self.index = 0
refresh
end
def refresh
@data = []
(1..3).each do |i|
id = $game_variables[i]
armor = $data_armors[id]
@data.push($data_armors[id]) unless armor.nil? || $game_system.armor_storage(id) == 0
end
self.height = (1 + @data.size) * 32
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, @item_max * 32)
(0...@item_max).each do |i|
draw_item(i)
end
end
end
def draw_item(index)
item = @data[index]
if item == nil
return
end
x = 4
y = 32 * index
color = $game_system.armor_storage(item.id) > 0 ? normal_color : disabled_color
self.contents.font.color = color
opacity = $game_system.armor_storage(item.id) > 0 ? 255 : 128
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 160, 32, item.name)
text = ": " + $game_system.armor_storage(item.id).to_s
self.contents.draw_text(0, y, width - 32, 32, text, 2)
end
def armor
@data[self.index]
end
def show
refresh
self.visible = true
self.active = true
end
end
class Scene_Map
alias rb_main main
def main
@armor_window = Window_ArmorSelect.new
rb_main
@armor_window.dispose
end
alias rb_update update
def update
if @armor_window.active
update_armor
return
end
rb_update
end
def update_armor
@armor_window.update
if Input.trigger?(Input::C)
armor_id = @armor_window.armor.id
if $game_system.armor_storage(armor_id) == 0
$game_system.se_play($data_system.buzzer_se)
return
end
$game_system.se_play($data_system.decision_se)
@armor_window.active = false
@armor_window.visible = false
$game_party.gain_armor(armor_id, 1)
$game_system.storage_export(armor_id, 1)
return
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
@armor_window.visible = false
@armor_window.active = false
return
end
end
def show_armor_select
@armor_window.show
end
end
|