设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 9224|回复: 22
打印 上一主题 下一主题

[已经解决] 请教制作个可储存道具的箱子,储存的道具可带到下个周目

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
跳转到指定楼层
1
发表于 2021-5-14 06:30:12 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
目前完全没有思路,还请大神指点一二,多谢了!

Lv4.逐梦者

梦石
3
星屑
7145
在线时间
590 小时
注册时间
2019-9-15
帖子
113

R考场第七期金奖

来自 9楼
发表于 2021-5-18 21:21:14 | 只看该作者
本帖最后由 Cupidk爱呗茶 于 2021-8-13 23:50 编辑

花了一下午写的 虽说可能比不上论坛上其他大神的作品 而且代码方面会有点乱 不过我尽力了..
基本上算是实现了LZ所说的所有要求了 顺便..范例就收20星屑吧.. 希望不会无人问津  (
工程演示

范例
NG变量+多周目箱子.rar (450.03 KB, 下载次数: 17, 售价: 20 星屑)
脚本 ↓
箱子系统和跨存档变量均为原创
RUBY 代码复制
  1. # 简易跨存档变量 by cupidk rays 制作
  2. # 脚本特性: 生成的数据即便不进行存档也依旧不会消失 (制作多周目游戏)
  3. # 变量获取方法 CUPIDK::NGVAR.get_var(id)
  4. # 数据获取方法 CUPIDK::NGVAR.get_data
  5. module CUPIDK end
  6. module CUPIDK::NGVAR
  7.    # 被跨存档变量占用的变量位置
  8.  
  9.    VAR_RANGE = 1..100
  10.  
  11.   # 这里设置一些初始的数值 ↓
  12.    # 数字类变量初始化请写在这里
  13.    SETINIT_VAR = [0]
  14.  
  15.    NGTIMES_VARID = 1   # 存储周目数的跨存档变量ID
  16.  
  17.    NGCASE_SIZE = 3 # 这里设置每次周目额外获得的仓库容量上限
  18.  
  19.    SETINIT_VAR[NGTIMES_VARID] = 1  # 周目数初始化
  20.  
  21.  
  22.    # 各种数据类请保存在这里(如数组,哈希表等)
  23.    SETINIT_DATA = {
  24.    "NG_items" => {} , # 跨存档物品
  25.    }
  26.  
  27.   def self.init_Ngdata(name)
  28.     save_data(SETINIT_DATA, name)
  29.   end  
  30.   def self.data_set(name)
  31.     init_Ngdata(name) unless FileTest.exist?(name)
  32.     @Game_DataNg = load_data(name)
  33.   end  
  34.   def self.get_data
  35.     @Game_DataNg
  36.   end
  37.  
  38.   def self.init_Ngvar(name)
  39.     save_data(SETINIT_VAR, name)
  40.   end  
  41.   def self.var_set(name)
  42.     init_Ngvar(name) unless FileTest.exist?(name)
  43.     @Game_VarNg = load_data(name)
  44.   end  
  45.   def self.var_refresh(var_id, value, name = "Data/NGvar.rxdata")
  46.     @Game_VarNg[var_id] = value
  47.     save_data(@Game_VarNg, name)
  48.   end  
  49.   def self.get_var(var_id)
  50.     @Game_VarNg[var_id] || 0
  51.   end
  52. end
  53. class Scene_Title
  54.   include CUPIDK
  55.   alias :old_start_21518 :main
  56.   def main
  57.      NGVAR.data_set("Data/NGdata.rxdata")
  58.      NGVAR.var_set("Data/NGvar.rxdata")
  59.      old_start_21518
  60.    end   
  61. end
  62. class Game_Variables
  63.   include CUPIDK
  64.   alias_method "old_var_give_21518", "[]="
  65.   def []=(var_id, value)
  66.     return NGVAR.var_refresh(var_id, value) if NGVAR::VAR_RANGE === var_id
  67.     old_var_give_21518(var_id, value)
  68.   end
  69.   alias_method "old_var_21518", "[]"
  70.   def [](var_id)
  71.     return NGVAR.get_var(var_id) if NGVAR::VAR_RANGE === var_id
  72.     old_var_21518(var_id)
  73.   end
  74. end


RUBY 代码复制
  1. # 多周目物品箱   by cupidk rays
  2. # 需配合本工程内的跨存档变量
  3. # 使用方法 调用脚本$scene = Scene_NGCase.new
  4. class Game_Party; attr_accessor :items ; end  
  5. class Window_NgItem < Window_Item
  6.   def refresh
  7.     if self.contents != nil
  8.       self.contents.dispose
  9.       self.contents = nil
  10.     end
  11.     @data = []
  12.     (1...$data_items.size).each do |i|
  13.       if Ngitem_number(i) > 0
  14.         @data.push($data_items[i])
  15.       end
  16.     end
  17.     @item_max = @data.size
  18.     if @item_max > 0
  19.       self.contents = Bitmap.new(width - 32, row_max * 32)
  20.       (0...@item_max).each do |i|
  21.         draw_item(i)
  22.       end
  23.     end
  24.   end  
  25.   def Ngitem_number(id)
  26.     data = CUPIDK::NGVAR.get_data["NG_items"]
  27.     n = data.include?(id) ? data[id] : 0
  28.   end  
  29.   def draw_item(index)
  30.     item = @data[index]
  31.     number = Ngitem_number(item.id)
  32.     x = 4 + index % 2 * (288 + 32)
  33.     y = index / 2 * 32
  34.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  35.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  36.     bitmap = RPG::Cache.icon(item.icon_name)
  37.     opacity = self.contents.font.color == normal_color ? 255 : 128
  38.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  39.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  40.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  41.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  42.   end
  43. end  
  44. class Window_HaveItem < Window_Item
  45.    def draw_item(index)
  46.     item = @data[index]
  47.     case item
  48.     when RPG::Item
  49.       number = $game_party.item_number(item.id)
  50.     when RPG::Weapon
  51.       number = $game_party.weapon_number(item.id)
  52.     when RPG::Armor
  53.       number = $game_party.armor_number(item.id)
  54.     end
  55.     x = 4 + index % 2 * (288 + 32)
  56.     y = index / 2 * 32
  57.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  58.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  59.     bitmap = RPG::Cache.icon(item.icon_name)
  60.     opacity = self.contents.font.color == normal_color ? 255 : 128
  61.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  62.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  63.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  64.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  65.   end
  66. end  
  67. class Scene_NGCase
  68.   include CUPIDK
  69.   def main
  70.     # 生成帮助窗口、物品窗口
  71.     @help_window = Window_Help.new
  72.     @item_window = Window_HaveItem.new
  73.     @item_window.y += 285
  74.     @item_window.height = 130
  75.     @item_window.help_window = @help_window
  76.     @Ngitem_window = Window_NgItem.new
  77.     @Ngitem_window.help_window = @help_window
  78.     @Ngitem_window.height = 284
  79.     if $game_party.items.empty? || !$game_party.items.any? {|k,v| v >= 1 }
  80.       @item_window.active = false
  81.     else  
  82.       @Ngitem_window.active = false
  83.     end
  84.     # 执行过度
  85.     Graphics.transition
  86.     # 主循环
  87.     loop do
  88.       Graphics.update
  89.       Input.update
  90.       update
  91.       if $scene != self
  92.         break
  93.       end
  94.     end
  95.     Graphics.freeze
  96.     # 释放窗口
  97.     @help_window.dispose
  98.     @item_window.dispose
  99.     @Ngitem_window.dispose
  100.   end
  101.   # 画面更新
  102.   def update
  103.     @help_window.update
  104.     @item_window.update
  105.     @Ngitem_window.update
  106.     if @item_window.active
  107.       update_item
  108.       return
  109.     end
  110.     if @Ngitem_window.active
  111.       update_Ngitem
  112.       return
  113.     end
  114.   end  
  115.  
  116.   def Ngitems
  117.     NGVAR.get_data["NG_items"]
  118.   end  
  119.   # 跨存档储存窗口
  120.   def update_Ngitem
  121.     if Input.trigger?(Input::B)
  122.       $game_system.se_play($data_system.cancel_se)
  123.       $scene = Scene_Map.new
  124.       return
  125.     end
  126.     if Input.trigger?(Input::C)
  127.        @Ngitem = @Ngitem_window.item
  128.        num = 1
  129.        if NGVAR.get_data["NG_items"].include?(@Ngitem.id) && NGVAR.get_data["NG_items"][@Ngitem.id] >= num
  130.          NGVAR.get_data["NG_items"][@Ngitem.id] -= num
  131.          if $game_party.items.include?(@Ngitem.id)
  132.            $game_party.gain_item(@Ngitem.id, num)
  133.          else
  134.            $game_party.items[@Ngitem.id] = num
  135.          end  
  136.          $game_system.se_play($data_system.decision_se)
  137.          name = "Data/NGdata.rxdata"
  138.          save_data(NGVAR.get_data, name)
  139.          @item_window.refresh
  140.          @Ngitem_window.refresh
  141.        else
  142.         $game_system.se_play($data_system.cancel_se)
  143.        end  
  144.     end
  145.   end  
  146.   # 角色物品窗口
  147.   def update_item
  148.     if Input.trigger?(Input::B)
  149.        $game_system.se_play($data_system.cancel_se)
  150.        @Ngitem_window.active = true
  151.        @item_window.active = false
  152.       return
  153.     end
  154.     if Input.trigger?(Input::C)
  155.       @item = @item_window.item
  156.       id = NGVAR::NGTIMES_VARID
  157.       max = $game_variables[id] * NGVAR::NGCASE_SIZE
  158.       ngmax = NGVAR.get_data["NG_items"].select do |k, v|
  159.         v > 0
  160.       end  
  161.       if (NGVAR.get_data["NG_items"][@item.id].nil? || NGVAR.get_data["NG_items"][@item.id] == 0) &&
  162.         max <= ngmax.size
  163.         return $game_system.se_play($data_system.cancel_se)
  164.       end  
  165.       # 演奏确定 SE
  166.       num = 1
  167.       if $game_party.items.include?(@item.id) && $game_party.item_number(@item.id) >= num
  168.           $game_party.gain_item(@item.id, -num)
  169.         if NGVAR.get_data["NG_items"][@item.id]
  170.           NGVAR.get_data["NG_items"][@item.id] += num
  171.         else
  172.           NGVAR.get_data["NG_items"][@item.id] = num
  173.         end
  174.         $game_system.se_play($data_system.decision_se)
  175.         name = "Data/NGdata.rxdata"
  176.         save_data(NGVAR.get_data, name)
  177.         @item_window.refresh
  178.         @Ngitem_window.refresh
  179.       else
  180.         $game_system.se_play($data_system.cancel_se)
  181.       end  
  182.     end
  183.   end
  184. end

评分

参与人数 3+3 收起 理由
RyanBern + 1 认可答案
89444640 + 1 塞糖
taeckle + 1 神的指引!

查看全部评分

********
回复 支持 2 反对 0

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
16
 楼主| 发表于 2021-8-12 18:37:06 | 只看该作者
本帖最后由 taeckle 于 2021-8-12 19:11 编辑
Cupidk爱呗茶 发表于 2021-8-9 16:24
非常抱歉最近有事回复迟了点 可以这样改
替换跨存档箱子中的这个方法
  


大神你这段脚本哪句代码是控制箱子存储数量上限为$game_variable[1]*3的啊?我在你这段脚本里就没看到个数字3。。。

点评

可以仔细观察下模块中定义的常量设置  发表于 2021-8-13 23:49
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
3
星屑
7145
在线时间
590 小时
注册时间
2019-9-15
帖子
113

R考场第七期金奖

15
发表于 2021-8-9 16:24:06 | 只看该作者
本帖最后由 Cupidk爱呗茶 于 2021-8-13 23:49 编辑
taeckle 发表于 2021-7-15 07:46
报告大佬,您发布的存储箱代码测试结果为每周目增加储存的道具种类数量上限增加3,请问下怎么改成单纯道 ...


非常抱歉最近有事回复迟了点 可以这样改
替换跨存档箱子中的这个方法
RUBY 代码复制
  1. # 角色物品窗口
  2.   def update_item
  3.     if Input.trigger?(Input::B)
  4.        $game_system.se_play($data_system.cancel_se)
  5.        @Ngitem_window.active = true
  6.        @item_window.active = false
  7.       return
  8.     end
  9.     if Input.trigger?(Input::C)
  10.         @item = @item_window.item
  11.         id = NGVAR::NGTIMES_VARID
  12.        max = $game_variables[id] * NGVAR::NGCASE_SIZE
  13.        ngmax = NGVAR.get_data["NG_items"].inject(0) do |result, item|
  14.          result + item[1]
  15.        end  
  16.       # 演奏确定 SE
  17.         num = 1
  18.         return $game_system.se_play($data_system.cancel_se) if ngmax + num > max
  19.        if $game_party.items.include?(@item.id) && $game_party.item_number(@item.id) >= num
  20.            $game_party.gain_item(@item.id, -num)
  21.          if NGVAR.get_data["NG_items"][@item.id]
  22.             NGVAR.get_data["NG_items"][@item.id] += num
  23.          else
  24.             NGVAR.get_data["NG_items"][@item.id] = num
  25.          end
  26.         $game_system.se_play($data_system.decision_se)
  27.         name = "Data/NGdata.rxdata"
  28.         save_data(NGVAR.get_data, name)
  29.         @item_window.refresh
  30.         @Ngitem_window.refresh
  31.        else
  32.         $game_system.se_play($data_system.cancel_se)
  33.       end  
  34.     end
  35.   end

点评

有兴趣的话还可以在场景里加入箱子物品上限的数量显示和 吧物品分开显示的效果 即同名道具不扎堆 而是放在另一个格子显示 试着改改吧  发表于 2021-8-9 16:35

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!

查看全部评分

********
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
14
 楼主| 发表于 2021-7-15 07:46:29 | 只看该作者
Cupidk爱呗茶 发表于 2021-6-14 22:13
是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGV ...

报告大佬,您发布的存储箱代码测试结果为每周目增加储存的道具种类数量上限增加3,请问下怎么改成单纯道具数量增加3呢?
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

13
发表于 2021-6-20 09:26:42 | 只看该作者
taeckle 发表于 2021-6-16 05:56
请问大神,那个NGVAR模块是CUPIDK模块的子模块吗?在一个大模块(CUPIDK)里是怎样再定义出一个小模块(NGVA ...

不对,这个CPUICK直接在module里面写就行了,用的时候直接链接就行

评分

参与人数 1+1 收起 理由
taeckle + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
12
 楼主| 发表于 2021-6-16 05:56:57 | 只看该作者
Cupidk爱呗茶 发表于 2021-6-14 22:13
是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGV ...

请问大神,那个NGVAR模块是CUPIDK模块的子模块吗?在一个大模块(CUPIDK)里是怎样再定义出一个小模块(NGVAR)的呢?

点评

moudle CUPIDK def NGVAR end end 大概是这样的吧?  发表于 2021-6-20 09:25
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
3
星屑
7145
在线时间
590 小时
注册时间
2019-9-15
帖子
113

R考场第七期金奖

11
发表于 2021-6-14 22:13:38 | 只看该作者
本帖最后由 Cupidk爱呗茶 于 2021-6-14 22:24 编辑
taeckle 发表于 2021-6-13 21:48
大神请问下这个脚本的第3行里“# 变量获取方法 CUPIDK::NGVAR.get_var(id)”的那个“::”符号是啥意思啊 ...


是一个链接常量的用法 在脚本中的含义大概就是 获取CUPIDK模块中NGVAR模块
我们的跨存档变量就存储在NGVAR模块中

评分

参与人数 1+1 收起 理由
taeckle + 1 多谢大神指点!

查看全部评分

********
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
10
 楼主| 发表于 2021-6-13 21:48:42 | 只看该作者
Cupidk爱呗茶 发表于 2021-5-18 21:21
花了一下午写的 虽说可能比不上论坛上其他大神的作品 而且代码方面会有点乱 不过我尽力了..
基本 ...


大神请问下这个脚本的第3行里“# 变量获取方法 CUPIDK::NGVAR.get_var(id)”的那个“::”符号是啥意思啊?
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36472
在线时间
10806 小时
注册时间
2009-3-15
帖子
4815
8
发表于 2021-5-17 16:25:44 | 只看该作者
是每种道具的存放上限+3..还是道具总数算+3

评分

参与人数 1+1 收起 理由
taeckle + 1 每周目数每增加1,箱子存放道具总数+3.

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 14:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表