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

Project1

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

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

[复制链接]

Lv4.逐梦者

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

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

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

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

Lv4.逐梦者

梦石
3
星屑
7095
在线时间
589 小时
注册时间
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, 下载次数: 11, 售价: 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.逐梦者

梦石
2
星屑
13088
在线时间
2273 小时
注册时间
2011-6-4
帖子
613
2
发表于 2021-5-14 09:57:30 | 只看该作者

厚颜无耻地推荐一下这个脚本 至于物品仓库脚本看看有没有现有的脚本可以用。

评分

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

查看全部评分

BUG反馈请加QQ 529283039
水友群 917854767

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
3
 楼主| 发表于 2021-5-15 05:27:52 | 只看该作者
本帖最后由 taeckle 于 2021-5-16 07:06 编辑
真·可乐 发表于 2021-5-14 09:57
厚颜无耻地推荐一下这个脚本 至于物品仓库脚本看看有没有现有的脚本可以用。 ...


大神可以讲讲做这个脚本的思路吗?

比如我想达成每增加1个周目箱子可多储存3个道具,都要有哪些考虑呢?

点评

注意..不要一帖多问.  发表于 2021-5-16 21:45
看完后思路更乱了。。。  发表于 2021-5-16 07:09
去看看有无可用的物品仓库脚本,把仓库的信息储存部分改造一下。  发表于 2021-5-15 21:03
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4299
在线时间
407 小时
注册时间
2016-5-11
帖子
140
4
发表于 2021-5-15 10:34:09 | 只看该作者
图书馆有一个制作二周目文件的脚本,使用那个脚本,把要存的东西做一个哈希表存进去就好了

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9128
在线时间
463 小时
注册时间
2015-5-8
帖子
865
5
 楼主| 发表于 2021-5-16 20:20:50 | 只看该作者
765111039 发表于 2021-5-15 10:34
图书馆有一个制作二周目文件的脚本,使用那个脚本,把要存的东西做一个哈希表存进去就好了 ...

好像这个只能设定要储存的道具,那要怎么设置储存箱储存道具的数量限制呢?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4299
在线时间
407 小时
注册时间
2016-5-11
帖子
140
6
发表于 2021-5-17 14:13:10 | 只看该作者
taeckle 发表于 2021-5-16 20:20
好像这个只能设定要储存的道具,那要怎么设置储存箱储存道具的数量限制呢? ...

既然可以存那肯定可以读取啊,读取数据然后分歧判断就行了比如这样,你存进去a={w=>[],a=>[],wn=>[],an=>[]},这里面w作为武器,那么wn就可以作为对应的数量,a是防具,an是对应的数量,你只要限制wn和an就可以了,或者读取发放奖励的时候限定数量
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7946
在线时间
1182 小时
注册时间
2007-7-29
帖子
2055
7
发表于 2021-5-17 14:51:33 | 只看该作者
储存箱子不难,但前提是楼主你如何实现你的周目?根据你实现周目的方式再来谈如何实现箱子会更实际一点,大家更容易给出建议。在不知道你如何实现周目还愿意给建议的楼上几乎都是好人。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

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


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

点评

这是调用module里面的变量的间隔符号,正确的用法是“模块名::变量名”  发表于 2021-6-20 09:24
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-25 15:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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