Project1

标题: 【教程】如何制作储物箱 [打印本页]

作者: guoxiaomi    时间: 2021-7-27 20:48
标题: 【教程】如何制作储物箱
本帖最后由 guoxiaomi 于 2021-7-28 11:09 编辑

相关问题:
https://rpg.blue/thread-486363-1-1.html

示意图:


解决这个问题,通常的做法是创建一个Scene类,然后用事件call这个类,就跟使用商店一样。上面的示意图也就是我们所想要的效果:整个场景分为4部分,当左下或者右下窗口激活时,按下空格来交换队伍里的物品和储物箱里的物品。
接下来我会仔细的讲解该如何写这个脚本。对于RGSS的初学者来说,可以当作写Scene的教程。这个教程会逐步完善场景类所需的各种内容,并且每完成一小部分就会展示一下效果。

【第一节:场景类的基本结构】
首先创建一个模块,以避免跟其他的脚本同名,后续的所有类的定义都是在这个模块里进行。这里使用提问者的名字Taeckle作为模块名。
接下来创建场景的类Scene_Storage。这个场景的类需要包括:

1. main方法,在范例里,main方法被拆分成了3部分:create_windowsscene_loopdispose_windows
create_windows 用来创建4个窗口,使用几个比较基础的窗口类作为place holder,这里只是用来检查窗口位置是否正确,此方法会在后面的步骤里被新的定义覆盖:
RUBY 代码复制
  1. # ----------------------------------------- #
  2. # Help Window (640 x 64)                    #
  3. # ----------------------------------------- #
  4. # Menu Window (640 x 64)                    #
  5. # --------------------+-------------------- #
  6. # Item Window Party   | Item Window Storage #
  7. #    (320 x 352)      |    (320 x 352)      #
  8. # --------------------+-------------------- #
  9. def create_windows
  10.   # Help Window
  11.   @help_window = Window_Help.new
  12.   # Horizontal Command Window
  13.   @menu_window = Window_Selectable.new(0, 64, 640, 64)
  14.   # Item Window left: Party items
  15.   @item_window_party = Window_Selectable.new(0, 128, 320, 480 - 64 * 2)
  16.   # Item Window right: Storage items
  17.   @item_window_storage = Window_Selectable.new(320, 128, 320, 480 - 64 * 2)
  18. end


scene_loop 直接照抄RGSS的内容。dispose_windows使用RGSS3的风格,将属于Scene的所有Window类的实例对象关闭。

由于scene_loop里呼叫了update方法,所以还需要创建一个空的update方法。

2. 数据的处理,这个场景涉及到RGSS以外的数据。所以需要定义数据的类型Data,以及场景所需的实例变量@data
考虑到具体要解决的问题是储物箱,所以该场景要占用一个全局变量来存储数据,把这个变量的ID传给场景的initialize方法。顺便传递了储存箱最大能装的数量作为第2个参数。
RUBY 代码复制
  1. def initialize(data_vid, item_max_size = 99)
  2.   @scene_class = $scene.class
  3.   @item_max_size = [item_max_size, 99].min
  4.   if !$game_variables[data_vid].is_a?(Data)
  5.     $game_variables[data_vid] = Data.new
  6.   end
  7.   @data = $game_variables[data_vid]
  8. end

在initialize方法里,会检测传入的全局变量是否为Data类型,如果不是就初始化一下,然后绑定此全局变量。

储物箱应该要提供存入和取出两个方法。定义storefetch两个空方法,其参数是要存储的东西和数量(默认为1)

最终脚本如下:
RUBY 代码复制下载
  1. # encoding: utf-8
  2. module Taeckle
  3.   @version = "0.1"
  4.  
  5.   class Data
  6.   end
  7.  
  8.   class Scene_Storage
  9.     attr_reader :data
  10.  
  11.     def initialize(data_vid, item_max_size = 99)
  12.       @scene_class = $scene.class
  13.       @item_max_size = [item_max_size, 99].min
  14.       if !$game_variables[data_vid].is_a?(Data)
  15.         $game_variables[data_vid] = Data.new
  16.       end
  17.       @data = $game_variables[data_vid]
  18.     end
  19.  
  20.     def main
  21.       create_windows
  22.       scene_loop
  23.       dispose_windows
  24.     end
  25.  
  26.     # layout
  27.     # ----------------------------------------- #
  28.     # Help Window (640 x 64)                    #
  29.     # ----------------------------------------- #
  30.     # Menu Window (640 x 64)                    #
  31.     # --------------------+-------------------- #
  32.     # Item Window Party   | Item Window Storage #
  33.     #    (320 x 352)      |    (320 x 352)      #
  34.     # --------------------+-------------------- #
  35.     def create_windows
  36.       # Help Window
  37.       @help_window = Window_Help.new
  38.       # Horizontal Command Window
  39.       @menu_window = Window_Selectable.new(0, 64, 640, 64)
  40.       # Item Window left: Party items
  41.       @item_window_party = Window_Selectable.new(0, 128, 320, 480 - 64 * 2)
  42.       # Item Window right: Storage items
  43.       @item_window_storage = Window_Selectable.new(320, 128, 320, 480 - 64 * 2)
  44.     end
  45.  
  46.     def update
  47.     end
  48.  
  49.     def scene_loop
  50.       Graphics.transition
  51.       # 主循环
  52.       loop do
  53.         # 刷新游戏画面
  54.         Graphics.update
  55.         # 刷新输入信息
  56.         Input.update
  57.         # 刷新画面
  58.         update
  59.         # 如果画面切换就中断循环
  60.         if $scene != self
  61.           break
  62.         end
  63.       end
  64.       # 准备过渡
  65.       Graphics.freeze
  66.     end
  67.  
  68.     def dispose_windows
  69.       self.instance_variables.each do |name|
  70.         obj = self.instance_variable_get(name)
  71.         obj.dispose if obj.is_a?(Window)
  72.       end
  73.     end
  74.  
  75.     def store(item, number = 1)
  76.     end
  77.  
  78.     def fetch(item, number = 1)
  79.     end
  80.   end
  81. end


【第二节:测试工程】
创建一个空白的工程,并且将写好的scene_storage_base.rb插入到脚本编辑器的main前。根据具体的需求,创建如下自动事件:

按F12执行,进入新游戏后,自动执行本事件,就会进入到Scene_Storage里了。这个时候场景里还是一片空白:


【第三节:数据结构】
接下来我们需要完善Data类,以及storefetch两个方法。ruby允许随时打开一个类添加新的内容,也允许覆盖原来的同名方法。

1. Data类是存储在箱子里的物品、武器等。所以Data类可以直接套用Game_Party的部分内容:
RUBY 代码复制
  1. class Data
  2.   attr_reader :item
  3.   attr_reader :weapons
  4.   attr_reader :armors
  5.  
  6.   def initialize
  7.     @items = {}
  8.     @weapons = {}
  9.     @armors = {}
  10.   end
  11.  
  12.   # ...
  13. end
复制粘贴Game_Party的item_number, weapon_number, armor_number, gain_item, gain_weapon, gain_armor这6个方法即可。
由于拥有完全相同的6个方法和对应的数据结构,Game_Party和Data的实例在某些地方可以互相替换。详见后面的@bind_data部分。

2. store方法,需要根据传入的变量的不同类型(item/weapon/armor),来选择调用指定的方法。此外,当箱子或者队伍的背包已经满了的时候,就不能继续放入物品,定义一个函数来判断这种情况:
RUBY 代码复制
  1. def can_store?(num_party, num_storage, number)
  2.   num_party - number >= 0 && num_party - number <= 99 && num_storage + number >= 0 && num_storage + number <= @item_max_size
  3. end
考虑到存储物品可能会失败,store方法的返回值是true或者false,以表示这次存储是成功还是失败。

fetch方法就是store方法,只不过第二个参数是负的。
最终脚本如下:
RUBY 代码复制下载
  1. # encoding: utf-8
  2. module Taeckle
  3.   @version = "0.2"
  4.  
  5.   class Data
  6.     attr_reader :item
  7.     attr_reader :weapons
  8.     attr_reader :armors
  9.  
  10.     def initialize
  11.       @items = {}
  12.       @weapons = {}
  13.       @armors = {}
  14.     end
  15.  
  16.     #--------------------------------------------------------------------------
  17.     # ● 获取物品的所持数
  18.     #     item_id : 物品 ID
  19.     #--------------------------------------------------------------------------
  20.     def item_number(item_id)
  21.       # 如果 hash 个数数值不存在就返回 0
  22.       return @items.include?(item_id) ? @items[item_id] : 0
  23.     end
  24.  
  25.     #--------------------------------------------------------------------------
  26.     # ● 获取武器所持数
  27.     #     weapon_id : 武器 ID
  28.     #--------------------------------------------------------------------------
  29.     def weapon_number(weapon_id)
  30.       # 如果 hash 个数数值不存在就返回 0
  31.       return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  32.     end
  33.  
  34.     #--------------------------------------------------------------------------
  35.     # ● 获取防具所持数
  36.     #     armor_id : 防具 ID
  37.     #--------------------------------------------------------------------------
  38.     def armor_number(armor_id)
  39.       # 如果 hash 个数数值不存在就返回 0
  40.       return @armors.include?(armor_id) ? @armors[armor_id] : 0
  41.     end
  42.  
  43.     #--------------------------------------------------------------------------
  44.     # ● 增加物品 (减少)
  45.     #     item_id : 物品 ID
  46.     #     n       : 个数
  47.     #--------------------------------------------------------------------------
  48.     def gain_item(item_id, n)
  49.       # 更新 hash 的个数数据
  50.       if item_id > 0
  51.         @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
  52.       end
  53.     end
  54.  
  55.     #--------------------------------------------------------------------------
  56.     # ● 增加武器 (减少)
  57.     #     weapon_id : 武器 ID
  58.     #     n         : 个数
  59.     #--------------------------------------------------------------------------
  60.     def gain_weapon(weapon_id, n)
  61.       # 更新 hash 的个数数据
  62.       if weapon_id > 0
  63.         @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
  64.       end
  65.     end
  66.  
  67.     #--------------------------------------------------------------------------
  68.     # ● 增加防具 (减少)
  69.     #     armor_id : 防具 ID
  70.     #     n        : 个数
  71.     #--------------------------------------------------------------------------
  72.     def gain_armor(armor_id, n)
  73.       # 更新 hash 的个数数据
  74.       if armor_id > 0
  75.         @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
  76.       end
  77.     end
  78.   end
  79.  
  80.   class Scene_Storage
  81.     def store(item, number = 1)
  82.       # RPG::Item
  83.       if item.is_a?(RPG::Item)
  84.         num_party = $game_party.item_number(item.id)
  85.         num_storage = @data.item_number(item.id)
  86.         if can_store?(num_party, num_storage, number)
  87.           $game_party.lose_item(item.id, number)
  88.           @data.gain_item(item.id, number)
  89.           return true
  90.         end
  91.       end
  92.       # RPG::Weapon
  93.       if item.is_a?(RPG::Weapon)
  94.         num_party = $game_party.weapon_number(item.id)
  95.         num_storage = @data.weapon_number(item.id)
  96.         if can_store?(num_party, num_storage, number)
  97.           $game_party.lose_weapon(item.id, number)
  98.           @data.gain_weapon(item.id, number)
  99.           return true
  100.         end
  101.       end
  102.       # RPG::Armor
  103.       if item.is_a?(RPG::Armor)
  104.         num_party = $game_party.armor_number(item.id)
  105.         num_storage = @data.armor_number(item.id)
  106.         if can_store?(num_party, num_storage, number)
  107.           $game_party.lose_armor(item.id, number)
  108.           @data.gain_armor(item.id, number)
  109.           return true
  110.         end
  111.       end
  112.       return false
  113.     end
  114.  
  115.     def fetch(item, number = 1)
  116.       store(item, -number)
  117.     end
  118.  
  119.     def can_store?(num_party, num_storage, number)
  120.       num_party - number >= 0 && num_party - number <= 99 && num_storage + number >= 0 && num_storage + number <= @item_max_size
  121.     end
  122.   end
  123. end
将这个脚本加入到编辑器里,再次测试,应该得到跟第二节一样的效果。因为我们还没有写具体的窗口绘制。

【第四节:场景的update】
接下来我们要实现留空的update方法。在这个具体的任务里,有3个窗口,我们绘制一张简图来描述场景里各个窗口之间的切换:

这部分比较考验对RGSS的熟悉程度,总之按照RGSS的写法:
首先更新@help_window,然后依次判断是否有窗口处于active的状态,如果是就执行这个窗口的更新,主要是处理各个按键触发时要执行的内容。记得加上SE,以及各窗口refresh的时机和修改index = -1以隐藏光标。这些细节可以仔细阅读RGSS默认的各个Scene的update的实现。
注意在选择“退出”的写法,@scene_class记录了上一个场景的类(在initialize方法里),退出时利用这个值恢复了上一个场景。不定义这个变量,在此处直接写$scene = Scene_Map.new也是一样的。

然后我们需要定义各个窗口类,并设置好窗口创建时的初始状态。
1. Window_Help,直接就是RGSS默认的Window_Help:
RUBY 代码复制
  1. class Window_Help < ::Window_Help
  2. end

2. Window_Menu,有可以移动的光标,所以继承自Window_Selectable。这里要参考RGSS默认的Window_ShopCommand的写法。由于绑定了@help_window,所以需要定义update_help方法:
RUBY 代码复制
  1. def update_help
  2.   case @index
  3.   when 0 then text = "存入物品"
  4.   when 1 then text = "取出物品"
  5.   when 2 then text = "离开场景"
  6.   end
  7.   @help_window.set_text(text, 1)
  8. end

3. Window_Item,左下和右下两个窗口,都是展示携带的物品,所以可以用同一种窗口类来实现。这两个窗口除了位置不同外,唯一的区别就是展示的数据不同,所以定义@bind_data这个实例变量表示要展示的数据来源。对于左下窗口,@bind_data = $game_party;对于右下窗口@bind_data = $scene.data。同样有可以移动的光标,所以也继承自Window_Selectable。

定义三个空方法待后续完善:item,refresh和update_help。item需要返回此窗口当前被选中的item,供场景类的store和fetch调用。
RUBY 代码复制
  1. class Window_Item < ::Window_Selectable
  2.   attr_accessor :bind_data
  3.  
  4.   def item
  5.   end
  6.  
  7.   def refresh
  8.   end
  9.  
  10.   def update_help
  11.   end
  12. end


定义好了所有的窗口后,覆写create_windows方法,将这些窗口添加到类里,并且设置正确的位置和初始条件。尤其要注意bind_data的设置。最终脚本如下:
RUBY 代码复制下载
  1. # encoding: utf-8
  2.  
  3. module Taeckle
  4.   @version = "0.3"
  5.  
  6.   class Scene_Storage
  7.     def update
  8.       @help_window.update
  9.       # update active window
  10.       if @menu_window.active
  11.         @menu_window.update
  12.         if Input.trigger?(Input::C)
  13.           $game_system.se_play($data_system.decision_se)
  14.           case @menu_window.index
  15.           when 0
  16.             @item_window_party.active = true
  17.             @menu_window.active = false
  18.             if @item_window_party.index == -1
  19.               @item_window_party.index = 0
  20.             end
  21.           when 1
  22.             @item_window_storage.active = true
  23.             @menu_window.active = false
  24.             if @item_window_storage.index == -1
  25.               @item_window_storage.index = 0
  26.             end
  27.           when 2
  28.             $scene = @scene_class.new
  29.             return
  30.           end
  31.           @item_window_party.refresh
  32.           @item_window_storage.refresh
  33.         end
  34.         return
  35.       end
  36.  
  37.       if @item_window_party.active
  38.         @item_window_party.update
  39.         if Input.trigger?(Input::B)
  40.           $game_system.se_play($data_system.cancel_se)
  41.           @item_window_party.active = false
  42.           @menu_window.active = true
  43.           @item_window_party.index = -1
  44.           @item_window_storage.index = -1
  45.           @item_window_party.refresh
  46.           @item_window_storage.refresh
  47.         end
  48.         if Input.trigger?(Input::C)
  49.           ret = store(@item_window_party.item)
  50.           if ret
  51.             $game_system.se_play($data_system.decision_se)
  52.             @item_window_party.refresh
  53.             @item_window_storage.refresh
  54.           else
  55.             $game_system.se_play($data_system.buzzer_se)
  56.           end
  57.         end
  58.         return
  59.       end
  60.  
  61.       if @item_window_storage.active
  62.         @item_window_storage.update
  63.         if Input.trigger?(Input::B)
  64.           $game_system.se_play($data_system.cancel_se)
  65.           @item_window_storage.active = false
  66.           @menu_window.active = true
  67.           @item_window_party.index = -1
  68.           @item_window_storage.index = -1
  69.           @item_window_party.refresh
  70.           @item_window_storage.refresh
  71.         end
  72.         if Input.trigger?(Input::C)
  73.           ret = fetch(@item_window_storage.item)
  74.           if ret
  75.             $game_system.se_play($data_system.decision_se)
  76.             @item_window_party.refresh
  77.             @item_window_storage.refresh
  78.           else
  79.             $game_system.se_play($data_system.buzzer_se)
  80.           end
  81.         end
  82.         return
  83.       end
  84.     end
  85.  
  86.     def create_windows
  87.       # Help Window
  88.       @help_window = Window_Help.new
  89.       # Horizontal Command Window
  90.       @menu_window = Window_Menu.new
  91.       @menu_window.active = true
  92.       # Item Window left: Party items
  93.       @item_window_party = Window_Item.new(0, 128, 320, 352)
  94.       @item_window_party.bind_data = $game_party
  95.       @item_window_party.active = false
  96.       @item_window_party.index = -1
  97.       @item_window_party.refresh
  98.       # Item Window right: Storage items
  99.       @item_window_storage = Window_Item.new(320, 128, 320, 352)
  100.       @item_window_storage.bind_data = @data
  101.       @item_window_storage.active = false
  102.       @item_window_storage.index = -1
  103.       @item_window_storage.refresh
  104.       # binding help windows
  105.       @menu_window.help_window = @help_window
  106.       @item_window_party.help_window = @help_window
  107.       @item_window_storage.help_window = @help_window
  108.     end
  109.   end
  110.  
  111.   class Window_Help < ::Window_Help
  112.   end
  113.  
  114.   class Window_Menu < ::Window_Selectable
  115.     def initialize
  116.       super(0, 64, 640, 64)
  117.       @item_max = 3
  118.       @column_max = 3
  119.       @index = 0
  120.       @commands = ["存入", "取出", "离开"]
  121.       self.contents = Bitmap.new(width - 32, height - 32)
  122.       refresh
  123.     end
  124.  
  125.     #--------------------------------------------------------------------------
  126.     # ● 刷新
  127.     #--------------------------------------------------------------------------
  128.     def refresh
  129.       self.contents.clear
  130.       for i in 0...@item_max
  131.         draw_item(i)
  132.       end
  133.     end
  134.  
  135.     #--------------------------------------------------------------------------
  136.     # ● 描绘项目
  137.     #     index : 项目编号
  138.     #--------------------------------------------------------------------------
  139.     def draw_item(index)
  140.       self.contents.draw_text(index * 212 - 12, 0, 212, 32, @commands[index], 1)
  141.     end
  142.  
  143.     def update_help
  144.       case @index
  145.       when 0 then text = "存入物品"
  146.       when 1 then text = "取出物品"
  147.       when 2 then text = "离开场景"
  148.       end
  149.       @help_window.set_text(text, 1)
  150.     end
  151.   end
  152.  
  153.   class Window_Item < ::Window_Selectable
  154.     attr_accessor :bind_data
  155.  
  156.     def item
  157.     end
  158.  
  159.     def refresh
  160.     end
  161.  
  162.     def update_help
  163.     end
  164.   end
  165. end
将这个脚本加入到F11脚本编辑器,执行可以看到如下效果:

可以看到场景里各项window的切换已经做好了,只是现在还没有做好队伍携带的物品的显示。有对齐强迫症的,可以仔细修改Window_Menu的draw_item方法里面的212和-12这两个参数。

【第五节:显示物品的窗口】
刚才给Window_Item留下了3个空的方法:item,refresh和update_help。这里item和update_help照抄RGSS默认的Window_Item。refresh和被refresh调用的draw_item也是基本照抄,但是需要做几点修改:
1. 将所有的$game_party替换成@bind_data
2. 默认的Window_Item是两列,而这个脚本里是一列,修改draw_item里的x和y的设置
3. 默认draw_item会让无法使用的物品显示灰色,改成当前窗口未激活则所有物品显示灰色
4. (可选)额外的需求要求物品按照其desc属性来排序,在refresh方法里添加按照desc排序的内容:
RUBY 代码复制
  1. # Sort by description
  2. if @data.first.respond_to?(:desc)
  3.   @data.sort! { |a, b| a.desc <=> b.desc }
  4. end


最终脚本如下:
RUBY 代码复制下载
  1. # encoding: utf-8
  2. module Taeckle
  3.   @version = "0.4"
  4.  
  5.   class Window_Item
  6.     #--------------------------------------------------------------------------
  7.     # ● 获取物品
  8.     #--------------------------------------------------------------------------
  9.     def item
  10.       return @data[self.index]
  11.     end
  12.  
  13.     #--------------------------------------------------------------------------
  14.     # ● 刷新
  15.     #--------------------------------------------------------------------------
  16.     def refresh
  17.       if self.contents != nil
  18.         self.contents.dispose
  19.         self.contents = nil
  20.       end
  21.       @data = []
  22.       # 添加物品
  23.       for i in 1...$data_items.size
  24.         if @bind_data.item_number(i) > 0
  25.           @data.push($data_items[i])
  26.         end
  27.       end
  28.       # 在战斗中以外添加武器、防具
  29.       unless $game_temp.in_battle
  30.         for i in 1...$data_weapons.size
  31.           if @bind_data.weapon_number(i) > 0
  32.             @data.push($data_weapons[i])
  33.           end
  34.         end
  35.         for i in 1...$data_armors.size
  36.           if @bind_data.armor_number(i) > 0
  37.             @data.push($data_armors[i])
  38.           end
  39.         end
  40.       end
  41.       # Sort by description
  42.       if @data.first.respond_to?(:desc)
  43.         @data.sort! { |a, b| a.desc <=> b.desc }
  44.       end
  45.       # 如果项目数不是 0 就生成位图、重新描绘全部项目
  46.       @item_max = @data.size
  47.       if @item_max > 0
  48.         self.contents = Bitmap.new(width - 32, row_max * 32)
  49.         for i in 0...@item_max
  50.           draw_item(i)
  51.         end
  52.       end
  53.     end
  54.  
  55.     #--------------------------------------------------------------------------
  56.     # ● 描绘项目
  57.     #     index : 项目编号
  58.     #--------------------------------------------------------------------------
  59.     def draw_item(index)
  60.       item = @data[index]
  61.       case item
  62.       when RPG::Item
  63.         number = @bind_data.item_number(item.id)
  64.       when RPG::Weapon
  65.         number = @bind_data.weapon_number(item.id)
  66.       when RPG::Armor
  67.         number = @bind_data.armor_number(item.id)
  68.       end
  69.       if self.active
  70.         self.contents.font.color = normal_color
  71.       else
  72.         self.contents.font.color = disabled_color
  73.       end
  74.       x = 4
  75.       y = index * 32
  76.       rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  77.       self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  78.       bitmap = RPG::Cache.icon(item.icon_name)
  79.       opacity = self.contents.font.color == normal_color ? 255 : 128
  80.       self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  81.       self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  82.       self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  83.       self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  84.     end
  85.  
  86.     #--------------------------------------------------------------------------
  87.     # ● 刷新帮助文本
  88.     #--------------------------------------------------------------------------
  89.     def update_help
  90.       @help_window.set_text(self.item == nil ? "" : self.item.description)
  91.     end
  92.   end
  93. end

将这段脚本添加到F11脚本编辑器里,效果如图:

范例如下:
20210727-storage.zip (208.06 KB, 下载次数: 80)

使用的小技巧:
1. 由于数据存储在全局变量里,会跟随存档一起存下来。
2. 场景绑定不同的变量就会对应不同的储物箱。
3. 如果预先设置好变量的内容,就可以做到储物箱在第一次打开时就有东西了。
  1. $game_variables[2] = Taeckle::Data.new
  2. $game_variables[2].gain_item(1, 1)
复制代码

4. 设置可以存储的物品上限为0,并且在箱子里的每件物品数量恰好为1,此时箱子里的物品只能取出不能放回。
5. 可以在条件分歧里使用脚本里检查箱子里的内容:
  1. $game_variables[2].item_number(1) > 0
复制代码

Screenshot 2021-07-27 182754.png (76.86 KB, 下载次数: 43)

Screenshot 2021-07-27 182754.png

作者: guoxiaomi    时间: 2021-7-27 20:55
@taeckle 你可以照着这个来学习
作者: xp兔子徒弟    时间: 2021-7-27 22:03
好顶赞醋虾
作者: PurpleKABI    时间: 2021-7-28 00:59
有大佬快拜!!感謝教學~
作者: RyanBern    时间: 2021-7-28 09:05
太强了,已经加入图书馆豪华套餐。
作者: dh149597870    时间: 2021-7-28 09:28
哦,懂了(小白一个,完全没有看懂)。
作者: taeckle    时间: 2021-7-30 15:51
我要好好学习下!
作者: taeckle    时间: 2021-7-31 01:08
大神我还有一个问题,

你上传脚本里的vscode, main.rb, rpg_desc.rb, scene_storage_base.rb,scene_storage_core.rb, scene_storage_data.rb, scene_storage_item.rb 要怎么打开啊?能直接复制粘贴到RPG Maker XP自带的脚本里吗?
作者: taeckle    时间: 2021-8-5 01:51
本帖最后由 taeckle 于 2021-8-5 01:54 编辑
guoxiaomi 发表于 2021-7-27 20:55
@taeckle 你可以照着这个来学习


还有大神请问下我要是想在上面这个脚本的基础上增加个放置在picture文件下的一个背景图片(比如背景图片就叫做"储物箱.png"),是不是直接就在def main里面添加上:

@menu_com.bitmap = RPG::Cache.picture("储物箱.png") 这句就行啦?

此外还需要多写一个释放这个背景图片的dispose吗?




作者: taeckle    时间: 2021-8-9 00:25
本帖最后由 taeckle 于 2021-8-9 00:37 编辑

大神可以把这个脚本所有的相关代码整合到一个版本号里吗? 多谢了

比如你的最终版本(version 0.4)缺少了Scene_Storage类还有Data类,看得有点晕


还有你的0.3版本定义Window_Item的时候都是:

class Window_Item < ::Window_Selectable
    attr_accessor :bind_data

为何到了0.4版本也没继承了,直接一个  class Window_Item。。

看到这里咱又直接晕菜....



作者: taeckle    时间: 2021-8-12 18:43
本帖最后由 taeckle 于 2021-8-12 18:44 编辑

大神还想请问下initialize里的参数data_vid到底有啥用啊?我只是想设置箱子存储物品数量上限为$game_variable[1]*3, 那个上限99完全不需要啊,这是你上面写的initialize:

    def initialize(data_vid, item_max_size = 99)
      @scene_class = $scene.class
      @item_max_size = [item_max_size, 99].min
      if !$game_variables[data_vid].is_a?(Data)
        $game_variables[data_vid] = Data.new
      end
      @data = $game_variables[data_vid]
    end


作者: soulsaga    时间: 2021-8-12 18:56
本帖最后由 soulsaga 于 2021-8-12 19:01 编辑
taeckle 发表于 2021-8-12 18:43
大神还想请问下initialize里的参数data_vid到底有啥用啊?我只是想设置箱子存储物品数量上限为$game_variab ...


呼叫场景时第一个參数示例的$game_variable[1]*3的就是传进data_vid的变量..
也就是说变量ID为$game_variable[1]的值X3的?
当是这样吧..

item_max_size = 99
这个是传參数时如果没有写第2个參数默认值则为99
所以只要你在第2个參数写上$game_variable[1]*3 道具上限就是变量1的值X3了
作者: taeckle    时间: 2021-8-12 19:05
soulsaga 发表于 2021-8-12 18:56
呼叫场景时第一个參数示例的$game_variable[1]*3的就是传进data_vid的变量..
也就是说变量ID为$game_vari ...

好的,多谢大佬指点!
还想请问下呼叫场景第二行中的$scene=Taeckle::Scene_Storage.new(2, size)中的数字2又指的是什么呢?
作者: taeckle    时间: 2021-8-16 18:32
@guoxiaomi

大神我还有个地方不太明白,请问下你上面的脚本里是怎么计算存储箱子内已经存储的物品武器防具(item, weapon, armor)的数量之和的呢?

在version_0.2里那个num_storage指代的好像仅仅是在存储箱里的物品武器防具中一类的数量之和吧。咱想达到的效果是所有物品武器防具的数量之和+打算存入的东西数量<=$game_variables[1]*3
作者: taeckle    时间: 2021-8-22 12:18
本帖最后由 taeckle 于 2021-8-22 12:19 编辑

@guoxiaomi

大神请问下你脚本version 0.1 里第12行的"$scene.class"还有第14行if !$game_variables[data_vid].is_a?(Data)中的"Data"是指的是什么东西啊,
都起到了什么作用啊?
作者: taeckle    时间: 2021-8-23 03:53
本帖最后由 taeckle 于 2021-8-23 03:54 编辑

大神这个脚本里你写那个"attr_accessor :bind_data"主要起到什么作用的呢?仅仅只是用来保证实例变量@bind_data即可读取也可写入的嘛?
作者: taeckle    时间: 2021-8-23 15:48
本帖最后由 taeckle 于 2021-8-23 15:50 编辑

@guoxiaomi

好的,大神我还有个问题:

在你的这个脚本中第2号公共变量($game_variables[2])是设置为存储箱子内部信息的, 我在你上面的脚本(version 0.1)里第16行(end)后面加了一句"print #{$game_variables[2]}",我主要是想看看这个$game_variable[2]里面到底长什么样,里面到底是个2维数组还是2维哈希表,可print之后测试的时候显示的是一串乱码,

请问下怎样才能把这个已经含有箱子存放信息的$game_variable[2]的具体内容p出来(或者显示出来)呢?
作者: soulsaga    时间: 2021-8-23 17:48
本帖最后由 soulsaga 于 2021-8-23 18:08 编辑
taeckle 发表于 2021-8-23 15:48
@guoxiaomi

好的,大神我还有个问题:


RUBY 代码复制
  1. p $game_variables[2].inspect

@taeckle
可以看到该对像全部已有方法的值
OBJ不是数组也不是哈希表..

这个好像不是你想要的..搞错了..
作者: 任小雪    时间: 2021-8-23 18:19
这个帖子很好,不懂代码的我选择直接尝试将商店俺寻思成储物箱
作者: 任小雪    时间: 2021-8-23 21:35
问题是,我是mv,不懂代码呢,唉
作者: taeckle    时间: 2021-8-24 01:53
本帖最后由 taeckle 于 2021-8-24 01:54 编辑
taeckle 发表于 2021-8-23 15:48
@guoxiaomi

好的,大神我还有个问题:


大神这是你要的p出$game_variables[2]后的截图:




变量2.PNG (84.05 KB, 下载次数: 30)

变量2.PNG

作者: taeckle    时间: 2021-8-24 05:15
本帖最后由 taeckle 于 2021-8-25 05:34 编辑

报告大神,您在本帖第14楼布置的家庭作业(新增箱子内部所有物品武器防具数量之和不超过2X$game_variables[1])做完了,请过目:

RUBY 代码复制
  1. # encoding: utf-8
  2. module Taeckle
  3.   @version = "0.5"  #先更新下版本号_家庭作业
  4.  
  5.   class Data
  6.     attr_reader :items
  7.     attr_reader :weapons
  8.     attr_reader :armors
  9.  
  10.     def initialize
  11.       @items = {}
  12.       @weapons = {}
  13.       @armors = {}
  14.     end
  15.  
  16.     #--------------------------------------------------------------------------
  17.     # ● 获取物品的所持数
  18.     #     item_id : 物品 ID
  19.     #--------------------------------------------------------------------------
  20.     def item_number(item_id)
  21.       # 如果 hash 个数数值不存在就返回 0
  22.       return @items.include?(item_id) ? @items[item_id] : 0
  23.     end
  24.  
  25.     # ● 获取(箱子内或身上)所有物品的数量之和 (Version 0.5的更新_家庭作业)
  26.     def item_number_all
  27.        @item_number_in_all=0
  28.         for i in 0...@items.values.size
  29.           @item_number_in_all +=@items.values[i]
  30.         end  
  31.       return @item_number_in_all
  32.     end   
  33.  
  34.     #--------------------------------------------------------------------------
  35.     # ● 获取武器所持数
  36.     #     weapon_id : 武器 ID
  37.     #--------------------------------------------------------------------------
  38.     def weapon_number(weapon_id)
  39.       # 如果 hash 个数数值不存在就返回 0
  40.       return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  41.     end
  42.  
  43.     # ● 获取(箱子内或身上)所有武器的数量之和 (Version 0.5的更新_家庭作业)
  44.     def weapon_number_all
  45.        @weapon_number_in_all=0
  46.         for i in 0...@weapons.values.size
  47.           @weapon_number_in_all +=@weapons.values[i]
  48.         end  
  49.       return @weapon_number_in_all
  50.     end  
  51.     #--------------------------------------------------------------------------
  52.     # ● 获取防具所持数
  53.     #     armor_id : 防具 ID
  54.     #--------------------------------------------------------------------------
  55.     def armor_number(armor_id)
  56.       # 如果 hash 个数数值不存在就返回 0
  57.       return @armors.include?(armor_id) ? @armors[armor_id] : 0
  58.     end
  59.  
  60.     # ● 获取(箱子内或身上)所有防具的数量之和 (Version 0.5的更新_家庭作业)
  61.     def armor_number_all
  62.        @armor_number_in_all=0
  63.         for i in 0...@armors.values.size
  64.           @armor_number_in_all +=@armors.values[i]
  65.         end  
  66.       return @armor_number_in_all
  67.     end      
  68.     #--------------------------------------------------------------------------
  69.     # ● 增加物品 (减少)
  70.     #     item_id : 物品 ID
  71.     #     n       : 个数
  72.     #--------------------------------------------------------------------------
  73.     def gain_item(item_id, n)
  74.       # 更新 hash 的个数数据
  75.       if item_id > 0
  76.         @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
  77.       end
  78.     end
  79.  
  80.     #--------------------------------------------------------------------------
  81.     # ● 增加武器 (减少)
  82.     #     weapon_id : 武器 ID
  83.     #     n         : 个数
  84.     #--------------------------------------------------------------------------
  85.     def gain_weapon(weapon_id, n)
  86.       # 更新 hash 的个数数据
  87.       if weapon_id > 0
  88.         @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
  89.       end
  90.     end
  91.  
  92.     #--------------------------------------------------------------------------
  93.     # ● 增加防具 (减少)
  94.     #     armor_id : 防具 ID
  95.     #     n        : 个数
  96.     #--------------------------------------------------------------------------
  97.     def gain_armor(armor_id, n)
  98.       # 更新 hash 的个数数据
  99.       if armor_id > 0
  100.         @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
  101.       end
  102.     end   
  103.   end
  104.  
  105.   class Window_Help < ::Window_Help
  106.   end
  107.  
  108.   class Window_Menu < ::Window_Selectable
  109.     def initialize
  110.       super(0, 64, 640, 64)
  111.       @item_max = 3
  112.       @column_max = 3
  113.       @index = 0
  114.       @commands = ["存入", "取出", "离开"]
  115.       self.contents = Bitmap.new(width - 32, height - 32)
  116.       refresh
  117.     end
  118.  
  119.     #--------------------------------------------------------------------------
  120.     # ● 刷新
  121.     #--------------------------------------------------------------------------
  122.     def refresh
  123.       self.contents.clear
  124.       for i in 0...@item_max
  125.         draw_item(i)
  126.       end
  127.     end
  128.  
  129.     #--------------------------------------------------------------------------
  130.     # ● 描绘项目
  131.     #     index : 项目编号
  132.     #--------------------------------------------------------------------------
  133.     def draw_item(index)
  134.       self.contents.draw_text(index * 212 - 12, 0, 212, 32, @commands[index], 1)
  135.     end
  136.  
  137.     def update_help
  138.       case @index
  139.       when 0 then text = "存入物品"
  140.       when 1 then text = "取出物品"
  141.       when 2 then text = "离开场景"
  142.       end
  143.       @help_window.set_text(text, 1)
  144.     end
  145.   end
  146.  
  147.   class Window_Item< ::Window_Selectable
  148.  
  149.   attr_accessor :bind_data   
  150.     #--------------------------------------------------------------------------
  151.     # ● 获取物品
  152.     #--------------------------------------------------------------------------
  153.     def item
  154.       return @data[self.index]
  155.     end
  156.  
  157.     #--------------------------------------------------------------------------
  158.     # ● 刷新
  159.     #--------------------------------------------------------------------------
  160.     def refresh
  161.       if self.contents != nil
  162.         self.contents.dispose
  163.         self.contents = nil
  164.       end
  165.       @data = []
  166.       # 添加物品
  167.       for i in 1...$data_items.size
  168.         if @bind_data.item_number(i) > 0
  169.           @data.push($data_items[i])
  170.         end
  171.       end
  172.       # 在战斗中以外添加武器、防具
  173.       unless $game_temp.in_battle
  174.         for i in 1...$data_weapons.size
  175.           if @bind_data.weapon_number(i) > 0
  176.             @data.push($data_weapons[i])
  177.           end
  178.         end
  179.         for i in 1...$data_armors.size
  180.           if @bind_data.armor_number(i) > 0
  181.             @data.push($data_armors[i])
  182.           end
  183.         end
  184.       end
  185.       # Sort by description
  186.       if @data.first.respond_to?(:desc)
  187.         @data.sort! { |a, b| a.desc <=> b.desc }
  188.       end
  189.       # 如果项目数不是 0 就生成位图、重新描绘全部项目
  190.       @item_max = @data.size
  191.       if @item_max > 0
  192.         self.contents = Bitmap.new(width - 32, row_max * 32)
  193.         for i in 0...@item_max
  194.           draw_item(i)
  195.         end
  196.       end
  197.     end
  198.  
  199.     #--------------------------------------------------------------------------
  200.     # ● 描绘项目
  201.     #     index : 项目编号
  202.     #--------------------------------------------------------------------------
  203.     def draw_item(index)
  204.       item = @data[index]
  205.       case item
  206.       when RPG::Item
  207.         number = @bind_data.item_number(item.id)
  208.       when RPG::Weapon
  209.         number = @bind_data.weapon_number(item.id)
  210.       when RPG::Armor
  211.         number = @bind_data.armor_number(item.id)
  212.       end
  213.       if self.active
  214.         self.contents.font.color = normal_color
  215.       else
  216.         self.contents.font.color = disabled_color
  217.       end
  218.       x = 4
  219.       y = index * 32
  220.       rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  221.       self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  222.       bitmap = RPG::Cache.icon(item.icon_name)
  223.       opacity = self.contents.font.color == normal_color ? 255 : 128
  224.       self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  225.       self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  226.       self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  227.       self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  228.     end
  229.  
  230.     #--------------------------------------------------------------------------
  231.     # ● 刷新帮助文本
  232.     #--------------------------------------------------------------------------
  233.     def update_help
  234.       @help_window.set_text(self.item == nil ? "" : self.item.description)
  235.     end
  236.   end  
  237.  
  238.   class Scene_Storage
  239.     attr_reader :data
  240.  
  241.     def initialize
  242.       @scene_class = $scene.class
  243.       if !$game_system.storage_data.is_a?(Data)
  244.         $game_system.storage_data = Data.new
  245.       end
  246.       @data = $game_system.storage_data
  247.     end
  248.  
  249.     def main
  250.       create_windows
  251.       scene_loop
  252.       dispose_windows
  253.     end
  254.  
  255.     # layout
  256.     # ----------------------------------------- #
  257.     # Help Window (640 x 64)                    #
  258.     # ----------------------------------------- #
  259.     # Menu Window (640 x 64)                    #
  260.     # --------------------+-------------------- #
  261.     # Item Window Party   | Item Window Storage #
  262.     #    (320 x 352)      |    (320 x 352)      #
  263.     # --------------------+-------------------- #
  264.     def create_windows
  265.       # Help Window
  266.       @help_window = Window_Help.new
  267.       # Horizontal Command Window
  268.       @menu_window = Window_Menu.new
  269.       @menu_window.active = true
  270.       # Item Window left: Party items
  271.       @item_window_party = Window_Item.new(0, 128, 320, 352)
  272.       @item_window_party.bind_data = $game_party
  273.       @item_window_party.active = false
  274.       @item_window_party.index = -1
  275.       @item_window_party.refresh
  276.       # Item Window right: Storage items
  277.       @item_window_storage = Window_Item.new(320, 128, 320, 352)
  278.       @item_window_storage.bind_data = @data
  279.       @item_window_storage.active = false
  280.       @item_window_storage.index = -1
  281.       @item_window_storage.refresh
  282.       # binding help windows
  283.       @menu_window.help_window = @help_window
  284.       @item_window_party.help_window = @help_window
  285.       @item_window_storage.help_window = @help_window
  286.     end
  287.  
  288.     def update
  289.       @help_window.update
  290.       # update active window
  291.       if @menu_window.active
  292.         @menu_window.update
  293.         if Input.trigger?(Input::C)
  294.           $game_system.se_play($data_system.decision_se)
  295.           case @menu_window.index
  296.           when 0
  297.             @item_window_party.active = true
  298.             @menu_window.active = false
  299.             if @item_window_party.index == -1
  300.               @item_window_party.index = 0
  301.             end
  302.           when 1
  303.             @item_window_storage.active = true
  304.             @menu_window.active = false
  305.             if @item_window_storage.index == -1
  306.               @item_window_storage.index = 0
  307.             end
  308.           when 2
  309.             $scene = @scene_class.new
  310.             return
  311.           end
  312.           @item_window_party.refresh
  313.           @item_window_storage.refresh
  314.         end
  315.         return
  316.       end
  317.  
  318.       if @item_window_party.active
  319.         @item_window_party.update
  320.         if Input.trigger?(Input::B)
  321.           $game_system.se_play($data_system.cancel_se)
  322.           @item_window_party.active = false
  323.           @menu_window.active = true
  324.           @item_window_party.index = -1
  325.           @item_window_storage.index = -1
  326.           @item_window_party.refresh
  327.           @item_window_storage.refresh
  328.         end
  329.         if Input.trigger?(Input::C)
  330.           ret = store(@item_window_party.item)
  331.           if ret
  332.             $game_system.se_play($data_system.decision_se)
  333.             @item_window_party.refresh
  334.             @item_window_storage.refresh
  335.           else
  336.             $game_system.se_play($data_system.buzzer_se)
  337.           end
  338.         end
  339.         return
  340.       end
  341.  
  342.       if @item_window_storage.active
  343.         @item_window_storage.update
  344.         if Input.trigger?(Input::B)
  345.           $game_system.se_play($data_system.cancel_se)
  346.           @item_window_storage.active = false
  347.           @menu_window.active = true
  348.           @item_window_party.index = -1
  349.           @item_window_storage.index = -1
  350.           @item_window_party.refresh
  351.           @item_window_storage.refresh
  352.         end
  353.         if Input.trigger?(Input::C)
  354.           ret = fetch(@item_window_storage.item)
  355.           if ret
  356.             $game_system.se_play($data_system.decision_se)
  357.             @item_window_party.refresh
  358.             @item_window_storage.refresh
  359.           else
  360.             $game_system.se_play($data_system.buzzer_se)
  361.           end
  362.         end
  363.         return
  364.       end
  365.     end
  366.  
  367.     def scene_loop
  368.       Graphics.transition
  369.       # 主循环
  370.       loop do
  371.         # 刷新游戏画面
  372.         Graphics.update
  373.         # 刷新输入信息
  374.         Input.update
  375.         # 刷新画面
  376.         update
  377.         # 如果画面切换就中断循环
  378.         if $scene != self
  379.           break
  380.         end
  381.       end
  382.       # 准备过渡
  383.       Graphics.freeze
  384.     end
  385.  
  386.     def dispose_windows
  387.       self.instance_variables.each do |name|
  388.         obj = self.instance_variable_get(name)
  389.         obj.dispose if obj.is_a?(Window)
  390.       end
  391.     end
  392.  
  393.     def store(item, number = 1)
  394.       # RPG::Item
  395.         num_storage_item = @data.item_number_all #version 0.5的更新_家庭作业
  396.         num_storage_weapon = @data.weapon_number_all #version 0.5的更新_家庭作业
  397.         num_storage_armor = @data.armor_number_all #version 0.5的更新_家庭作业   
  398.       if item.is_a?(RPG::Item)
  399.         num_party = $game_party.item_number(item.id)
  400.         num_storage = @data.item_number(item.id)        
  401.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number) #version 0.5的更新_家庭作业
  402.           $game_party.lose_item(item.id, number)
  403.           @data.gain_item(item.id, number)
  404.           return true
  405.         else
  406.           box_limit= 2*$game_variables[1]
  407.           print "箱子内已经有#{box_limit}个东西了,已经存满了"
  408.         end
  409.       end
  410.       # RPG::Weapon
  411.       if item.is_a?(RPG::Weapon)
  412.         num_party = $game_party.weapon_number(item.id)
  413.         num_storage = @data.weapon_number(item.id)      
  414.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number) #version 0.5的更新_家庭作业
  415.           $game_party.lose_weapon(item.id, number)
  416.           @data.gain_weapon(item.id, number)
  417.           return true
  418.         else
  419.           box_limit= 2*$game_variables[1]
  420.           print "箱子内已经有#{box_limit}个东西了,已经存满了"           
  421.         end
  422.       end
  423.       # RPG::Armor
  424.       if item.is_a?(RPG::Armor)
  425.         num_party = $game_party.armor_number(item.id)
  426.         num_storage = @data.armor_number(item.id)     
  427.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number) #version 0.5的更新_家庭作业
  428.           $game_party.lose_armor(item.id, number)
  429.           @data.gain_armor(item.id, number)
  430.           return true
  431.         else
  432.           box_limit= 2*$game_variables[1]
  433.           print "箱子内已经有#{box_limit}个东西了,已经存满了"           
  434.         end
  435.       end
  436.       return false
  437.     end
  438.  
  439.     def fetch(item, number = 1)
  440.       if item.is_a?(RPG::Item)
  441.         num_party = $game_party.item_number(item.id)
  442.         num_storage = @data.item_number(item.id)        
  443.         $game_party.gain_item(item.id, number)
  444.         @data.gain_item(item.id, -number)
  445.         return true
  446.       end
  447.       # RPG::Weapon
  448.       if item.is_a?(RPG::Weapon)
  449.         num_party = $game_party.weapon_number(item.id)
  450.         num_storage = @data.weapon_number(item.id)      
  451.         $game_party.gain_weapon(item.id, number)
  452.         @data.gain_weapon(item.id, -number)
  453.         return true
  454.       end
  455.       # RPG::Armor
  456.       if item.is_a?(RPG::Armor)
  457.         num_party = $game_party.armor_number(item.id)
  458.         num_storage = @data.armor_number(item.id)     
  459.         $game_party.gain_armor(item.id, number)
  460.         @data.gain_armor(item.id, -number)
  461.         return true
  462.       end
  463.       return false
  464.     end
  465.  
  466.     def can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number=1) #version 0.5的更新_家庭作业
  467.       num_storage_item+num_storage_weapon+num_storage_armor+number <= 2*$game_variables[1] #箱子大小上限设置
  468.   end
  469.  
  470. end


接下来还有地图上存储箱事件的脚本需改成$scene = Taeckle::Scene_Storage.new (以前是: size = [$game_variables[1] * 3, 99].min $scene = Taeckle::Scene_Storage.new(2, size))

最后在Game_System 内的"定义实例变量下面"加一句"attr_accessor :storage_data #箱子存储",然后在def initialize内加一行"@storage_data = []" , 写完收工!
作者: guoxiaomi    时间: 2021-8-24 19:08
本帖最后由 guoxiaomi 于 2021-8-24 21:43 编辑

整体上没有大问题,已经是很大的进步了。
一个算法上的小问题:
一定要这样统计总数吗?我之前的建议是,Data类维护一个整数@num,初始为0,每次成功放入、取出物品时,增加或者减少这个数。这样就不需要每次循环加一遍了。

那最好这样写:
  1. def item_number_all
  2.   sum = 0
  3.   @items.values.each do |number|
  4.     sum += number
  5.   end
  6.   sum
  7. end
复制代码
RGSS的ruby版本太低没有Array#sum方法,但是似乎有Array#inject,如果有的话可以这样写:
  1. def item_number_all
  2.   @items.values.inject(0, :+)
  3. end
复制代码

作者: taeckle    时间: 2021-8-25 06:55
本帖最后由 taeckle 于 2021-8-25 06:59 编辑

大神我还有个问题:

我把你的这个存储箱脚本里的第一行"module Taeckle" 以及脚本里的最后一行"end"都删掉了,
然后再把地图上存储箱事件的脚本需改成$scene = Scene_Storage.new后为啥就出错了

这是截图:





这里非得用个module...end才行吗?
作者: taeckle    时间: 2021-8-27 02:50
本帖最后由 taeckle 于 2021-8-27 02:56 编辑

大神我突然又有个地方想不明白了:
在你的这个存储箱脚本version_0.3里的第50行"if store(@item_window_party.item)"为啥可以调用下面做的def store里面的内容呢?if不是仅用来判断真假的嘛?怎么这里也可以用来表示执行了呢?
作者: taeckle    时间: 2021-8-27 02:55
还有大神我在本帖第22楼发的version_0.5里的第407, 420, 433行的print怎么才能换成一个好看一点的提示框啊?稍微好看点就行了,
作者: taeckle    时间: 2021-9-3 05:14
本帖最后由 taeckle 于 2021-9-3 15:36 编辑

大神我还想设置第22号防具禁止存入这个存储箱子里(当玩家试图存放第22号道具时会有提示信息"此物品无法存储"出现,再按下enter键这个提示信息会消失),

请问为了实现这个目的又该怎么搞呢?
作者: taeckle    时间: 2021-9-9 05:55
本帖最后由 taeckle 于 2021-9-10 06:34 编辑

大神这是我在本帖第22楼Version_0.5的基础上做的更新,主要是想在存储时让一些物品无法存储以及提示信息, 你帮我看看还有啥问题没,多谢了 :

  1. # encoding: utf-8
  2. module Taeckle
  3.   @version = "0.6" #新增无法存储一些物品以及提示信息

  4.   class Data
  5.     attr_reader :items
  6.     attr_reader :weapons
  7.     attr_reader :armors

  8.     def initialize
  9.       @items = {}
  10.       @weapons = {}
  11.       @armors = {}
  12.     end

  13.     #--------------------------------------------------------------------------
  14.     # ● 获取物品的所持数
  15.     #     item_id : 物品 ID
  16.     #--------------------------------------------------------------------------
  17.     def item_number(item_id)
  18.       # 如果 hash 个数数值不存在就返回 0
  19.       return @items.include?(item_id) ? @items[item_id] : 0
  20.     end

  21.     # ● 获取(箱子内或身上)所有物品的数量之和
  22.     def item_number_all
  23.        @item_number_in_all=0
  24.         for i in [email protected]
  25.           @item_number_in_all [email protected][i]
  26.         end  
  27.       return @item_number_in_all
  28.     end   
  29.    
  30.     #--------------------------------------------------------------------------
  31.     # ● 获取武器所持数
  32.     #     weapon_id : 武器 ID
  33.     #--------------------------------------------------------------------------
  34.     def weapon_number(weapon_id)
  35.       # 如果 hash 个数数值不存在就返回 0
  36.       return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  37.     end
  38.    
  39.     # ● 获取(箱子内或身上)所有武器的数量之和
  40.     def weapon_number_all
  41.        @weapon_number_in_all=0
  42.         for i in [email protected]
  43.           @weapon_number_in_all [email protected][i]
  44.         end  
  45.       return @weapon_number_in_all
  46.     end  
  47.     #--------------------------------------------------------------------------
  48.     # ● 获取防具所持数
  49.     #     armor_id : 防具 ID
  50.     #--------------------------------------------------------------------------
  51.     def armor_number(armor_id)
  52.       # 如果 hash 个数数值不存在就返回 0
  53.       return @armors.include?(armor_id) ? @armors[armor_id] : 0
  54.     end

  55.     # ● 获取(箱子内或身上)所有防具的数量之和
  56.     def armor_number_all
  57.        @armor_number_in_all=0
  58.         for i in [email protected]
  59.           @armor_number_in_all [email protected][i]
  60.         end  
  61.       return @armor_number_in_all
  62.     end      
  63.     #--------------------------------------------------------------------------
  64.     # ● 增加物品 (减少)
  65.     #     item_id : 物品 ID
  66.     #     n       : 个数
  67.     #--------------------------------------------------------------------------
  68.     def gain_item(item_id, n)
  69.       # 更新 hash 的个数数据
  70.       if item_id > 0
  71.         @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
  72.       end
  73.     end

  74.     #--------------------------------------------------------------------------
  75.     # ● 增加武器 (减少)
  76.     #     weapon_id : 武器 ID
  77.     #     n         : 个数
  78.     #--------------------------------------------------------------------------
  79.     def gain_weapon(weapon_id, n)
  80.       # 更新 hash 的个数数据
  81.       if weapon_id > 0
  82.         @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
  83.       end
  84.     end

  85.     #--------------------------------------------------------------------------
  86.     # ● 增加防具 (减少)
  87.     #     armor_id : 防具 ID
  88.     #     n        : 个数
  89.     #--------------------------------------------------------------------------
  90.     def gain_armor(armor_id, n)
  91.       # 更新 hash 的个数数据
  92.       if armor_id > 0
  93.         @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
  94.       end
  95.     end   
  96.   end
  97.   
  98.   class Window_Help < ::Window_Help
  99.   end
  100.   
  101.   class Window_Menu < ::Window_Selectable
  102.     def initialize
  103.       super(0, 64, 640, 64)
  104.       @item_max = 3
  105.       @column_max = 3
  106.       @index = 0
  107.       @commands = ["存入", "取出", "离开"]
  108.       self.contents = Bitmap.new(width - 32, height - 32)
  109.       refresh
  110.     end

  111.     #--------------------------------------------------------------------------
  112.     # ● 刷新
  113.     #--------------------------------------------------------------------------
  114.     def refresh
  115.       self.contents.clear
  116.       for i in 0...@item_max
  117.         draw_item(i)
  118.       end
  119.     end

  120.     #--------------------------------------------------------------------------
  121.     # ● 描绘项目
  122.     #     index : 项目编号
  123.     #--------------------------------------------------------------------------
  124.     def draw_item(index)
  125.       self.contents.draw_text(index * 212 - 12, 0, 212, 32, @commands[index], 1)
  126.     end

  127.     def update_help
  128.       case @index
  129.       when 0 then text = "存入物品"
  130.       when 1 then text = "取出物品"
  131.       when 2 then text = "离开场景"
  132.       end
  133.       @help_window.set_text(text, 1)
  134.     end
  135.   end
  136.   
  137.   class Window_Item< ::Window_Selectable
  138.    
  139.   attr_accessor :bind_data   
  140.     #--------------------------------------------------------------------------
  141.     # ● 获取物品
  142.     #--------------------------------------------------------------------------
  143.     def item
  144.       return @data[self.index]
  145.     end

  146.     #--------------------------------------------------------------------------
  147.     # ● 刷新
  148.     #--------------------------------------------------------------------------
  149.     def refresh
  150.       if self.contents != nil
  151.         self.contents.dispose
  152.         self.contents = nil
  153.       end
  154.       @data = []
  155.       # 添加物品
  156.       for i in 1...$data_items.size
  157.         if @bind_data.item_number(i) > 0
  158.           @data.push($data_items[i])
  159.         end
  160.       end
  161.       # 在战斗中以外添加武器、防具
  162.       unless $game_temp.in_battle
  163.         for i in 1...$data_weapons.size
  164.           if @bind_data.weapon_number(i) > 0
  165.             @data.push($data_weapons[i])
  166.           end
  167.         end
  168.         for i in 1...$data_armors.size
  169.           if @bind_data.armor_number(i) > 0
  170.             @data.push($data_armors[i])
  171.           end
  172.         end
  173.       end
  174.       # Sort by description
  175.       if @data.first.respond_to?(:desc)
  176.         @data.sort! { |a, b| a.desc <=> b.desc }
  177.       end
  178.       # 如果项目数不是 0 就生成位图、重新描绘全部项目
  179.       @item_max = @data.size
  180.       if @item_max > 0
  181.         self.contents = Bitmap.new(width - 32, row_max * 32)
  182.         for i in 0...@item_max
  183.           draw_item(i)
  184.         end
  185.       end
  186.     end

  187.     #--------------------------------------------------------------------------
  188.     # ● 描绘项目
  189.     #     index : 项目编号
  190.     #--------------------------------------------------------------------------
  191.     def draw_item(index)
  192.       item = @data[index]
  193.       case item
  194.       when RPG::Item
  195.         number = @bind_data.item_number(item.id)
  196.       when RPG::Weapon
  197.         number = @bind_data.weapon_number(item.id)
  198.       when RPG::Armor
  199.         number = @bind_data.armor_number(item.id)
  200.       end
  201.       if self.active
  202.         self.contents.font.color = normal_color
  203.       else
  204.         self.contents.font.color = disabled_color
  205.       end
  206.       x = 4
  207.       y = index * 32
  208.       rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  209.       self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  210.       bitmap = RPG::Cache.icon(item.icon_name)
  211.       opacity = self.contents.font.color == normal_color ? 255 : 128
  212.       self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  213.       self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  214.       self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  215.       self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  216.     end

  217.     #--------------------------------------------------------------------------
  218.     # ● 刷新帮助文本
  219.     #--------------------------------------------------------------------------
  220.     def update_help
  221.       @help_window.set_text(self.item == nil ? "" : self.item.description)
  222.     end
  223.   end  

  224. # ■ Storage_Prompt_Window
  225. #------------------------------------------------------------------------------
  226. #  提示仓库已满窗口或禁止存储某个物品。
  227. #==============================================================================
  228. class Storage_Prompt_Window < Window_Base
  229.   #--------------------------------------------------------------------------
  230.   # ● 初始化对像
  231.   #--------------------------------------------------------------------------
  232.   def initialize
  233.     super(140, 60, 370,100)
  234.     self.contents = Bitmap.new(width - 32, height - 32)
  235.   end  

  236.   def draw_text_2
  237.     self.contents.clear
  238.     self.contents.font.size = 25
  239.     self.contents.font.color = Color.new(255, 255, 128, 255)
  240.     self.contents.draw_text(5, 0, self.width - 32, 32, "这个道具无法存储!")
  241.   end   
  242. end   
  243.   
  244.   class Scene_Storage
  245.     attr_reader :data

  246.     def initialize     
  247.       @scene_class = $scene.class
  248.       if !$game_system.storage_data.is_a?(Data)
  249.       $game_system.storage_data = Data.new  #记得在class Game_System里建个@storage_data
  250.       end
  251.       @data = $game_system.storage_data

  252.     end
  253.                  
  254.     def main
  255.       create_windows
  256.       scene_loop
  257.       dispose_windows
  258.     end

  259.     # layout
  260.     # ----------------------------------------- #
  261.     # Help Window (640 x 64)                    #
  262.     # ----------------------------------------- #
  263.     # Menu Window (640 x 64)                    #
  264.     # --------------------+-------------------- #
  265.     # Item Window Party   | Item Window Storage #
  266.     #    (320 x 352)      |    (320 x 352)      #
  267.     # --------------------+-------------------- #
  268.     def create_windows
  269.       # Help Window
  270.       @help_window = Window_Help.new
  271.       # Horizontal Command Window
  272.       @menu_window = Window_Menu.new
  273.       @menu_window.active = true
  274.       # Item Window left: Party items
  275.       @item_window_party = Window_Item.new(0, 128, 320, 352)
  276.       @item_window_party.bind_data = $game_party
  277.       @item_window_party.active = false        
  278.       @item_window_party.index = -1
  279.       @item_window_party.refresh
  280.       # 生成提示仓库已满提示窗口
  281.       @storage_noplace_window = Storage_Prompt_Window.new
  282.       @storage_noplace_window.draw_text_1
  283.       @storage_noplace_window.x = 210
  284.       @storage_noplace_window.y = 180
  285.       @storage_noplace_window.active = false   
  286.       @storage_noplace_window.visible = false     
  287.       @storage_noplace_window.opacity = 255
  288.       # 生成道具禁止存储提示窗口
  289.       @storage_prohibition_window = Storage_Prompt_Window.new
  290.       @storage_prohibition_window.draw_text_2
  291.       @storage_prohibition_window.x = 210
  292.       @storage_prohibition_window.y = 180
  293.       @storage_prohibition_window.active = false   
  294.       @storage_prohibition_window.visible = false     
  295.       @storage_prohibition_window.opacity = 255         
  296.       # Item Window right: Storage items
  297.       @item_window_storage = Window_Item.new(320, 128, 320, 352)
  298.       @item_window_storage.bind_data = @data
  299.       @item_window_storage.active = false
  300.       @item_window_storage.index = -1
  301.       @item_window_storage.refresh
  302.       # binding help windows
  303.       @menu_window.help_window = @help_window
  304.       @item_window_party.help_window = @help_window
  305.       @item_window_storage.help_window = @help_window
  306.     end

  307.     def update
  308.       @help_window.update
  309.       # update active window
  310.       if @menu_window.active
  311.         @menu_window.update
  312.         if Input.trigger?(Input::C)
  313.           $game_system.se_play($data_system.decision_se)
  314.           case @menu_window.index
  315.           when 0
  316.             @item_window_party.active = true
  317.             @menu_window.active = false
  318.             if @item_window_party.index == -1
  319.               @item_window_party.index = 0
  320.             end
  321.           when 1
  322.             @item_window_storage.active = true
  323.             @menu_window.active = false
  324.             if @item_window_storage.index == -1
  325.               @item_window_storage.index = 0
  326.             end
  327.           when 2
  328.             $scene = @scene_class.new
  329.             return
  330.           end
  331.           @item_window_party.refresh
  332.           @item_window_storage.refresh
  333.         end
  334.         return
  335.       end

  336.       if @item_window_party.active
  337.         @item_window_party.update
  338.        if Input.trigger?(Input::B)
  339.           $game_system.se_play($data_system.cancel_se)
  340.           @item_window_party.active = false
  341.           @menu_window.active = true
  342.           @item_window_party.index = -1
  343.           @item_window_storage.index = -1
  344.           @item_window_party.refresh
  345.           @item_window_storage.refresh
  346.        end
  347.         
  348.        if Input.trigger?(Input::C)
  349.         if @item_window_party.item.is_a?(RPG::Item) && [1].include?(@item_window_party.item.id)  #1号物品无法存储
  350.           $game_system.se_play($data_system.buzzer_se)      
  351.           @item_window_party.active = false     
  352.           @storage_prohibition_window.active = true
  353.           @storage_prohibition_window.visible = true
  354.         elsif @item_window_party.item.is_a?(RPG::Weapon) && [1].include?(@item_window_party.item.id) #1号武器无法存储
  355.           $game_system.se_play($data_system.buzzer_se)     
  356.           @item_window_party.active = false     
  357.           @storage_prohibition_window.active = true
  358.           @storage_prohibition_window.visible = true
  359.         elsif @item_window_party.item.is_a?(RPG::Armor) && [1].include?(@item_window_party.item.id) #1号防具无法存储
  360.           $game_system.se_play($data_system.buzzer_se)     
  361.           @item_window_party.active = false     
  362.           @storage_prohibition_window.active = true
  363.           @storage_prohibition_window.visible = true      
  364.         else         
  365.          if store(@item_window_party.item)
  366.           $game_system.se_play($data_system.decision_se)
  367.           @item_window_party.refresh
  368.           @item_window_storage.refresh
  369.          else
  370.           $game_system.se_play($data_system.buzzer_se)
  371.          end        
  372.         end
  373.         return
  374.        end
  375.       end

  376.       if @item_window_storage.active
  377.         @item_window_storage.update
  378.         if Input.trigger?(Input::B)
  379.           $game_system.se_play($data_system.cancel_se)
  380.           @item_window_storage.active = false
  381.           @menu_window.active = true
  382.           @item_window_party.index = -1
  383.           @item_window_storage.index = -1
  384.           @item_window_party.refresh
  385.           @item_window_storage.refresh
  386.         end
  387.         if Input.trigger?(Input::C)
  388.           ret = fetch(@item_window_storage.item)
  389.           if ret
  390.             $game_system.se_play($data_system.decision_se)
  391.             @item_window_party.refresh
  392.             @item_window_storage.refresh
  393.           else
  394.             $game_system.se_play($data_system.buzzer_se)
  395.           end
  396.         end
  397.         return
  398.       end
  399.       
  400.       #更新仓库已满提示窗口
  401.       if @storage_noplace_window.active
  402.        update_noplace_window
  403.        return
  404.       end  
  405.       #更新禁止存储提示窗口
  406.       if @storage_prohibition_window.active
  407.        update_prohibition_window
  408.        return
  409.       end      
  410.       
  411.     end

  412.     def scene_loop
  413.       Graphics.transition
  414.       # 主循环
  415.       loop do
  416.         # 刷新游戏画面
  417.         Graphics.update
  418.         # 刷新输入信息
  419.         Input.update
  420.         # 刷新画面
  421.         update
  422.         # 如果画面切换就中断循环
  423.         if $scene != self
  424.           break
  425.         end
  426.       end
  427.       # 准备过渡
  428.       Graphics.freeze
  429.     end

  430.     def dispose_windows
  431.       self.instance_variables.each do |name|
  432.         obj = self.instance_variable_get(name)
  433.         obj.dispose if obj.is_a?(Window)
  434.       end
  435.     @storage_noplace_window.dispose
  436.     @storage_prohibition_window.dispose         
  437.     end

  438.     def update_noplace_window
  439.      if Input.trigger?(Input::B)
  440.      # 演奏取消 SE
  441.      $game_system.se_play($data_system.cancel_se)
  442.      @storage_noplace_window.active = false
  443.      @storage_noplace_window.visible = false
  444.      @item_window_party.active = true      
  445.      return
  446.      end
  447.      if Input.trigger?(Input::C)
  448.      # 演奏取消 SE
  449.      $game_system.se_play($data_system.cancel_se)      
  450.      @storage_noplace_window.active = false
  451.      @storage_noplace_window.visible = false
  452.      @item_window_party.active = true      
  453.      return         
  454.      end  
  455.     end   

  456.     def update_prohibition_window
  457.      if Input.trigger?(Input::B)
  458.      # 演奏取消 SE
  459.      $game_system.se_play($data_system.cancel_se)
  460.      @storage_prohibition_window.active = false
  461.      @storage_prohibition_window.visible = false
  462.      @item_window_party.active = true      
  463.      return
  464.      end
  465.      if Input.trigger?(Input::C)
  466.      # 演奏取消 SE
  467.      $game_system.se_play($data_system.cancel_se)      
  468.      @storage_prohibition_window.active = false
  469.      @storage_prohibition_window.visible = false
  470.      @item_window_party.active = true      
  471.      return         
  472.      end  
  473.     end     
  474.    
  475.     def store(item, number = 1)
  476.       # RPG::Item
  477.         num_storage_item = @data.item_number_all
  478.         num_storage_weapon = @data.weapon_number_all
  479.         num_storage_armor = @data.armor_number_all           
  480.       if item.is_a?(RPG::Item)
  481.         num_party = $game_party.item_number(item.id)
  482.         num_storage = @data.item_number(item.id)        
  483.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number)      
  484.           $game_party.lose_item(item.id, number)
  485.           @data.gain_item(item.id, number)
  486.           return true
  487.         else
  488.           box_limit= 3*$game_variables[1]
  489.           print "箱子内已经有#{box_limit}个东西了,已经存满了"           
  490.         end
  491.       end
  492.       # RPG::Weapon
  493.       if item.is_a?(RPG::Weapon)
  494.         num_party = $game_party.weapon_number(item.id)
  495.         num_storage = @data.weapon_number(item.id)      
  496.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number)
  497.           $game_party.lose_weapon(item.id, number)
  498.           @data.gain_weapon(item.id, number)
  499.           return true
  500.         else
  501.           box_limit= 3*$game_variables[1]
  502.           print "箱子内已经有#{box_limit}个东西了,已经存满了"           
  503.         end
  504.       end
  505.       # RPG::Armor
  506.       if item.is_a?(RPG::Armor)
  507.         num_party = $game_party.armor_number(item.id)
  508.         num_storage = @data.armor_number(item.id)     
  509.         if can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number)
  510.           $game_party.lose_armor(item.id, number)
  511.           @data.gain_armor(item.id, number)
  512.           return true
  513.         else
  514.           box_limit= 3*$game_variables[1]
  515.           print "箱子内已经有#{box_limit}个东西了,已经存满了"           
  516.         end
  517.       end
  518.       return false
  519.     end

  520.     def fetch(item, number = 1)
  521.       if item.is_a?(RPG::Item)
  522.         num_party = $game_party.item_number(item.id)
  523.         num_storage = @data.item_number(item.id)        
  524.         $game_party.gain_item(item.id, number)
  525.         @data.gain_item(item.id, -number)
  526.         return true
  527.       end
  528.       # RPG::Weapon
  529.       if item.is_a?(RPG::Weapon)
  530.         num_party = $game_party.weapon_number(item.id)
  531.         num_storage = @data.weapon_number(item.id)      
  532.         $game_party.gain_weapon(item.id, number)
  533.         @data.gain_weapon(item.id, -number)
  534.         return true
  535.       end
  536.       # RPG::Armor
  537.       if item.is_a?(RPG::Armor)
  538.         num_party = $game_party.armor_number(item.id)
  539.         num_storage = @data.armor_number(item.id)     
  540.         $game_party.gain_armor(item.id, number)
  541.         @data.gain_armor(item.id, -number)
  542.         return true
  543.       end
  544.       return false
  545.     end
  546.    
  547.     def can_store?(num_storage_item, num_storage_weapon, num_storage_armor,number=1)
  548.       num_storage_item+num_storage_weapon+num_storage_armor+number <= 3*$game_variables[1] #@item_max_size
  549.     end   
  550.   end
  551. end
复制代码



作者: guoxiaomi    时间: 2021-9-9 11:31
本帖最后由 guoxiaomi 于 2021-9-9 11:54 编辑

你scene_storage为什么会有contents和visible……必须继承了Window类才有contents、visible这些

你其实就是想创建一个sprite显示图片对吧?直接在create_windows方法里:
@sprite = ::Sprite.new
@sprite.bitmap = RPG::Cache.picture("storage")
在dispose_windows方法里:
@sprite.dispose

然后在其他地方主动改变@sprite.visible就行了
作者: 黑夜守望者    时间: 2021-9-19 15:21
太棒了,希望能多有一些这样的脚本教程以供学习参考。
作者: plain666    时间: 2021-9-19 16:52
功能真强大,高手啊。
作者: taeckle    时间: 2021-10-15 04:50
本帖最后由 taeckle 于 2021-10-15 05:03 编辑

报告大神我又来了,

这次请问下如果我想在你这个存储箱脚本的基础上做一个大地图事件,判断当前存储箱子里是否存有第20号武器的话,这个"if"又该在这个大地图事件里怎么写呢?

PS: 在你的这个脚本里你把所有存储箱的存储内容信息都存在了$game_variables[2]里面了,我在想这个if里面肯定会有$game_variables[2], include?(20), RPG::Weapon这些关键词的吧,还请指点一二,多谢了


作者: 真·可乐    时间: 2021-10-15 08:11
taeckle 发表于 2021-10-15 04:50
报告大神我又来了,

这次请问下如果我想在你这个存储箱脚本的基础上做一个大地图事件,判断当前存储箱子里 ...






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1