Project1

标题: 【要素收集】礼物盒功能 [打印本页]

作者: 小徐    时间: 2014-1-6 09:48
标题: 【要素收集】礼物盒功能
本帖最后由 小徐 于 2014-1-11 11:49 编辑

是LZ一个游戏制作途中用到的小功能。

具体是这样的的,NPC会送给玩家一些纪念性的小礼物,放在道具栏里和其他道具混在一起不方便,就做了个礼物盒的功能。放在玩家的房间里,玩家可以在那里查看收集到的小礼物。

Window_gift里预留了物品ID50~100为礼物
Window_Item里设置物品ID1~49、101以上为普通道具(具体请看注释)
可以按照需要自行更改

主角的道具栏顿时清净了有木有!{:2_268:}


使用方法:

将下面三个脚本依次插入Main上
在事件中调用脚本:$scene=Scene_Gift_Box.new 呼出礼物盒界面即可
默认是物品ID在50~100的物品为礼物,不会出现在玩家的道具列表里,只出现在礼物盒里。


效果预览:

事件:

物品设置:


RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_Item
  3. #------------------------------------------------------------------------------
  4. #  物品画面、战斗画面、显示浏览物品的窗口。
  5. #==============================================================================
  6.  
  7. class Window_Item < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 64, 640, 416)
  13.     @column_max = 2
  14.     refresh
  15.     self.index = 0
  16.     # 战斗中的情况下将窗口移至中央并将其半透明化
  17.     if $game_temp.in_battle
  18.       self.y = 64
  19.       self.height = 256
  20.       self.back_opacity = 160
  21.     end
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 获取物品
  25.   #--------------------------------------------------------------------------
  26.   def item
  27.     return @data[self.index]
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 刷新
  31.   #--------------------------------------------------------------------------
  32.   def refresh
  33.     if self.contents != nil
  34.       self.contents.dispose
  35.       self.contents = nil
  36.     end
  37.     @data = []
  38.     # 添加物品
  39.     for i in 1...49#ID1~49为普通道具
  40.       if $game_party.item_number(i) > 0
  41.         @data.push($data_items[i])
  42.       end
  43.     end
  44.     for i in 101...$data_items.size#ID101以上为普通道具
  45.       if $game_party.item_number(i) > 0
  46.         @data.push($data_items[i])
  47.       end
  48.     end
  49.     # 在战斗中以外添加武器、防具
  50.     unless $game_temp.in_battle
  51.       for i in 1...$data_weapons.size
  52.         if $game_party.weapon_number(i) > 0
  53.           @data.push($data_weapons[i])
  54.         end
  55.       end
  56.       for i in 1...$data_armors.size
  57.         if $game_party.armor_number(i) > 0
  58.           @data.push($data_armors[i])
  59.         end
  60.       end
  61.     end
  62.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  63.     @item_max = @data.size
  64.     if @item_max > 0
  65.       self.contents = Bitmap.new(width - 32, row_max * 32)
  66.       for i in 0...@item_max
  67.         draw_item(i)
  68.       end
  69.     end
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 描绘项目
  73.   #     index : 项目编号
  74.   #--------------------------------------------------------------------------
  75.   def draw_item(index)
  76.     item = @data[index]
  77.     case item
  78.     when RPG::Item
  79.       number = $game_party.item_number(item.id)
  80.     when RPG::Weapon
  81.       number = $game_party.weapon_number(item.id)
  82.     when RPG::Armor
  83.       number = $game_party.armor_number(item.id)
  84.     end
  85.     if item.is_a?(RPG::Item) and
  86.        $game_party.item_can_use?(item.id)
  87.       self.contents.font.color = normal_color
  88.     else
  89.       self.contents.font.color = disabled_color
  90.     end
  91.     x = 4 + index % 2 * (288 + 32)
  92.     y = index / 2 * 32
  93.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  94.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  95.     bitmap = RPG::Cache.icon(item.icon_name)
  96.     opacity = self.contents.font.color == normal_color ? 255 : 128
  97.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  98.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  99.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  100.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 刷新帮助文本
  104.   #--------------------------------------------------------------------------
  105.   def update_help
  106.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  107.   end
  108. end


RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_gift
  3. #------------------------------------------------------------------------------
  4. #  物品画面、战斗画面、显示浏览物品的窗口。
  5. #==============================================================================
  6.  
  7. class Window_gift < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 200, 640, 416)
  13.     @column_max = 2
  14.     refresh
  15.     self.index = 0
  16.       self.y = 64
  17.       self.height = 200
  18.       self.back_opacity = 160
  19.     # 战斗中的情况下将窗口移至中央并将其半透明化
  20.     if $game_temp.in_battle
  21.       self.y = 64
  22.       self.height = 256
  23.       self.back_opacity = 160
  24.     end  
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 获取物品
  28.   #--------------------------------------------------------------------------
  29.   def item
  30.     return @data[self.index]
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 刷新
  34.   #--------------------------------------------------------------------------
  35.   def refresh
  36.     if self.contents != nil
  37.       self.contents.dispose
  38.       self.contents = nil
  39.     end
  40.     @data = []
  41.     for i in 50...100 # 添加礼物——预留物品ID50~ID100的物品为“礼物”,可自行修改
  42.       if $game_party.item_number(i) > 0
  43.         @data.push($data_items[i])
  44.       end
  45.     end
  46.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  47.     @item_max = @data.size
  48.     if @item_max > 0
  49.       self.contents = Bitmap.new(width - 32, row_max * 32)
  50.       for i in 0...@item_max
  51.         draw_item(i)
  52.       end
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 描绘项目
  57.   #     index : 项目编号
  58.   #--------------------------------------------------------------------------
  59.   def draw_item(index)
  60.     item = @data[index]
  61.     case item
  62.     when RPG::Item
  63.       number = $game_party.item_number(item.id)
  64.     when RPG::Weapon
  65.       number = $game_party.weapon_number(item.id)
  66.     when RPG::Armor
  67.       number = $game_party.armor_number(item.id)
  68.     end
  69.     if item.is_a?(RPG::Item) and
  70.        $game_party.item_can_use?(item.id)
  71.       self.contents.font.color = normal_color
  72.       else
  73.       self.contents.font.color = disabled_color
  74.     end
  75.     x = 4 + index % 2 * (288 + 32)
  76.     y = index / 2 * 32
  77.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  78.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  79.     bitmap = RPG::Cache.icon(item.icon_name)
  80.     opacity = self.contents.font.color == normal_color ? 255 : 128
  81.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  82.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  83.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  84.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 刷新帮助文本
  88.   #--------------------------------------------------------------------------
  89.   def update_help
  90.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  91.   end
  92. end


RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Gift_Box
  3. #------------------------------------------------------------------------------
  4. #  处理礼物(不可使用)画面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Gift_Box
  8.   #--------------------------------------------------------------------------
  9.   # ● 主处理
  10.   #--------------------------------------------------------------------------
  11.   def main
  12.     @sprite =Spriteset_Map.new
  13.     # 生成帮助窗口、物品窗口
  14.     @help_window = Window_Help.new
  15.     @item_window = Window_gift.new
  16.     # 关联帮助窗口
  17.     @item_window.help_window = @help_window
  18.     # 生成目标窗口 (设置为不可见・不活动)
  19.     @target_window = Window_Target.new
  20.     @target_window.visible = false
  21.     @target_window.active = false
  22.     # 执行过度
  23.     Graphics.transition
  24.     # 主循环
  25.     loop do
  26.       # 刷新游戏画面
  27.       Graphics.update
  28.       # 刷新输入信息
  29.       Input.update
  30.       # 刷新画面
  31.       update
  32.       # 如果画面切换就中断循环
  33.       if $scene != self
  34.         break
  35.       end
  36.     end
  37.     # 装备过渡
  38.     Graphics.freeze
  39.     # 释放窗口
  40.     @sprite.dispose
  41.     @help_window.dispose
  42.     @item_window.dispose
  43.     @target_window.dispose
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 刷新画面
  47.   #--------------------------------------------------------------------------
  48.   def update
  49.     # 刷新窗口
  50.     @help_window.update
  51.     @item_window.update
  52.     @target_window.update
  53.     # 物品窗口被激活的情况下: 调用 update_item
  54.     if @item_window.active
  55.       update_item
  56.       return
  57.     end
  58.     # 目标窗口被激活的情况下: 调用 update_target
  59.     if @target_window.active
  60.       update_target
  61.       return
  62.     end
  63.  
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 刷新画面 (物品窗口被激活的情况下)
  67.   #--------------------------------------------------------------------------
  68.   def update_item
  69.     # 按下 B 键的情况下
  70.     if Input.trigger?(Input::B)
  71.       # 演奏取消 SE
  72.       $game_system.se_play($data_system.cancel_se)
  73.       # 切换到菜单画面
  74.       $scene = Scene_Map.new
  75.       return
  76.     end
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 刷新画面 (目标窗口被激活的情况下)
  80.   #--------------------------------------------------------------------------
  81.   def update_target
  82.     # 按下 B 键的情况下
  83.     if Input.trigger?(Input::B)
  84.       # 演奏取消 SE
  85.       $game_system.se_play($data_system.cancel_se)
  86.       # 切换到菜单画面
  87.       $scene = Scene_Map.new
  88.       return
  89.     end
  90.   end
  91. end




作者: 紫叶枫魂    时间: 2014-1-7 16:02
收藏,对了,代码怎么用,具体怎么实现你说的功能
作者: a763731590    时间: 2014-1-7 16:57
刚好我想着这个功能!!
话说可以放个预览图什么的w
作者: 美丽晨露    时间: 2014-1-7 17:35
希望能有浏览图
说明用图什么的可以尽量详细些。
作者: 国产吃货    时间: 2014-1-7 20:26
物品分类是不是也很好的解决了这个问题

作者: fack188    时间: 2014-1-7 21:22
弄来看看,呵呵
作者: 小徐    时间: 2014-1-11 11:44
紫叶枫魂 发表于 2014-1-7 16:02
收藏,对了,代码怎么用,具体怎么实现你说的功能

使用方法:
将下面三个脚本依次插入Main上
在事件中调用脚本:$scene=Scene_Gift_Box.new 呼出礼物盒界面即可
作者: 小徐    时间: 2014-1-11 11:49
美丽晨露 发表于 2014-1-7 17:35
希望能有浏览图
说明用图什么的可以尽量详细些。

预览图增加在主楼了!

作者: 小徐    时间: 2014-1-11 11:50
a763731590 发表于 2014-1-7 16:57
刚好我想着这个功能!!
话说可以放个预览图什么的w

预览图放了!来看看吧
作者: chd114    时间: 2014-1-16 01:23
如果要用到技能呢?
作者: fjjghj1    时间: 2014-1-17 14:38
用了物品分类脚本后,在用撸主的脚本,礼品似乎也会同时显示在物品栏里的说。求撸主指教怎么破
@小徐
作者: 闇·貘良    时间: 2014-1-17 18:55
可惜是xp的,我想要va的
作者: 囧灬王阳    时间: 2014-1-17 19:37
弄了半天我才搞清楚。。原来是储物箱嘛。。。礼物箱这个名字很难懂。顺便顶了




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