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

Project1

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

[教程]物品设置上限修改流程。

 关闭 [复制链接]

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

跳转到指定楼层
1
发表于 2007-4-14 23:29:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
此是为毛毛叔制作的物品容量的功能,结构简单,但涉及修改范围较广,提问区多次,具备一定代表性,固有此修改流程的教程。

一、创建物品容量的变量,修改范围Game_System类:
    因为毛毛叔的要求容量随人物级别变化并在随时强行修改,固该容量应由“基数+变数”两部分组成,“变数”即人物级别,依照要求为队伍一号角色级别。
先在Game_System类设定基数:

[quote]  建立实例变量并赋予读写属性
  attr_accessor :warehouse         # 仓库基数
  在initialize部分初始化,角色默认初始级别为1,仓库容量初始为10,所以基数为9:
  @warehouse = 9         # 仓库基数


  定义返回仓库容量的方法
  def warehouse_number
      # 容量 = 基数 + 角色级别
      return @warehouse + $game_party.actors[0].level
  end

  
  定义强行直接仓库容量的方法,因角色级别为不可随意更改的变量,所以可通过修改基数入手。
  def set_warehouse(n)
      # 基数 = 设定数 – 角色级别(即强制修改为:基数 + 角色级别= 设定数)
      @warehouse = n - $game_party.actors[0].level
  end

[/quote]

二、对获得物品设限,修改范围Game_Party类:
根据容量对获得的物品总数进行限制,具体在Game_Party类内操作。

[quote]  首先定义返回物品总数的方法:
  def warehouse_all_numbers
      s = 0
      @items.each{|i,j| s += j}     #累加道具总数
      @weapons.each{|i,j| s += j}  #累加武器总数
      @armors.each{|i,j| s += j}    #累加防具总数
      return s                  
  end

  定义判断物品是否饱和的方法:
  def warehouse_full?(sum)
      # 返回(物品总数 + 新加入物品数 > 仓库容量)
      return (warehouse_all_numbers + sum) > $game_system.warehouse_number
  end

  定义仓库饱和后,友情提示的显示窗:
  def warehouse_wds(name,sum)
      # name为物品名,sum为丢弃数量
      name == nil ?
      text = "仓库已饱和" : text = "仓库饱和,丢弃多余的#{sum}个#{name}"
      # 根据文字内容设定新窗体大小。
      w = text.size * 7
      x = 320 - w/2
      wds = Window_Base.new(x,120,w + 32,64)
      wds.contents = Bitmap.new(wds.width - 32, wds.height - 32)
      wds.contents.draw_text(0,0,w,32,text,1)
      wds.opacity = 200
      # 音效
      $game_system.se_play($data_system.decision_se)
      # 窗店画面位置修正   
      if $scene.is_a?(Scene_Shop)
         wds.x -= 150      
         wds.y += 100      
      end
      # 装备画面位置修正
      if $scene.is_a?(Scene_Equip)     
         wds.y -= 100      
      end
      # 窗体消失效果。
      40.times{|i| wds.opacity -= 20 if i > 30
                   wds.contents_opacity -= 20 if i > 30      
                   Graphics.update}  
      # 释放掉窗体,切莫使用实例变量。      
      wds.dispose   
  end

  根部修改,为获得方法设限:
  def gain_item(item_id, n)
    # 更新 hash 的个数数据
    if item_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_items[item_id].name,s)
      end  
      @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加武器 (减少)
  #     weapon_id : 武器 ID
  #     n         : 个数
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n)
    # 更新 hash 的个数数据
    if weapon_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_weapons[weapon_id].name,s)        
      end      
      @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加防具 (减少)
  #     armor_id : 防具 ID
  #     n        : 个数
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n)
    # 更新 hash 的个数数据
    if armor_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_armors[armor_id].name,s)
      end      
      @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
    end
  end
[/quote]

三:修改战斗结算画面饱和提示显示窗的出现时机,修改范围Scene_Battle 2类
   
[quote]    建立变量接收获得的宝物(约166行treasures = treasures[0..5]的下面)
    @temp = treasures

   将约181-190行获得宝物的方法剪切掉。   
   for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    将其放在约218行战斗结束“battle_end(0)”的前面,这样做是为将饱和提示窗延迟到宝物获得提示的后面出现。
       # 隐藏宝物提示窗口
       @result_window.visible = false
       # 获得宝物,treasures换成了可直接跨方法使用的实例变量@temp。
       for item in @temp
          case item
             when RPG::Item
                $game_party.gain_item(item.id, 1)
             when RPG::Weapon
                $game_party.gain_weapon(item.id, 1)
             when RPG::Armor
                $game_party.gain_armor(item.id, 1)
          end
       end
[/quote]

四、对装备窗口做特殊处理,修改范围Scene_Equip类:
     
[quote]     约106与112 的两处,      
     @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
     可看到为获取装备变化数值,这里有伤风化又脱又穿,因仅是临时变化,实际装备总量并没有改变,但若总量恰好等于仓库最大容量,脱下时会因超容而舍弃,造成物品丢失,有两种修改方式,一是先将equip方法改成先穿后脱,第二种则是我使用暂时扩容的方式:
      # 暂时扩大仓库1个容量
      $game_system.warehouse += 1           
      @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
      # 获取变更装备后的能力值
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      # 返回到装备
      @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
      # 恢复仓库容量           
      $game_system.warehouse -= 1

      对更换装备做特殊情况处理(约211行):      
      # 获取角色欲更换身体部位的物品ID。
      temp_id = @actor.weapon_id if @right_window.index == 0
      temp_id = @actor.armor1_id if @right_window.index == 1
      temp_id = @actor.armor2_id if @right_window.index == 2
      temp_id = @actor.armor3_id if @right_window.index == 3
      temp_id = @actor.armor4_id if @right_window.index == 4
      # 若物品栏为空,身体部分不为空(即脱下)时,仓库饱和
      if item == nil and temp_id > 0 and $game_party.warehouse_full?(1) == true
         # 则仅做饱和提示,不更换装备
         $game_party.warehouse_wds(nil,0)
      else
         # 否则临时扩容进行装备更换
         $game_system.warehouse += 1         
         # 变更装备
         @actor.equip(@right_window.index, item == nil ? 0 : item.id)
         $game_system.warehouse -= 1         
      end

[/quote]

五:为物品窗口添加丢弃功能,修改范围Scene_Item类:
   
    约74行新添加:
    # 当按下“L”(默认为Q)键时
    if Input.trigger?(Input::L)
       # 音效
       $game_system.se_play($data_system.decision_se)  
       # 获得当前物品数据
       @item = @item_window.item
       # 根据物品所属种类,选择不同的舍弃方法。
       case @item
          when RPG::Item
             $game_party.lose_item(@item.id, 1)
          when RPG::Weapon
             $game_party.lose_weapon(@item.id, 1)
          when RPG::Armor
             $game_party.lose_armor(@item.id, 1)
       end
       # 重新描绘当前物品的数量
       @item_window.draw_item(@item_window.index)
       # 若当前不能使,即为0时,重新描绘整个物品窗口,
       # 之所以不直接使用@item_window.refresh,是为降低资源消耗
       unless $game_party.item_can_use?(@item.id)
          @item_window.refresh
       end      
       return
    end

六:为主菜单添加仓库容量信息,修改范围Window_Steps:
   
    寸土寸金,就从相对次要的步数窗口剥削些领土吧:
    约22-24行,
    self.contents.draw_text(4, -5, 120, 32, "步数")
    self.contents.draw_text(4, 32, 120, 32, "仓库")
    self.contents.font.color = normal_color
    self.contents.draw_text(4, -5, 120, 32, $game_party.steps.to_s, 2)
    self.contents.draw_text(4, 32, 120, 32,$game_system.warehouse_number.to_s, 2)


    之所以写出修改流程,是方便她人整合脚本,毕竟该功能虽冲突风险较大,但实现起来却非常简单。

    OK,完工了。

范例下载,注意查毒
ftp://[email protected]/个� ... 品总量设限.rar

截图:






              [本贴由 叶舞枫 于 2007-4-22 22:33:34 进行了编辑]
纵然千里外,我等雁归来。

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

2
 楼主| 发表于 2007-4-14 23:29:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
此是为毛毛叔制作的物品容量的功能,结构简单,但涉及修改范围较广,提问区多次,具备一定代表性,固有此修改流程的教程。

一、创建物品容量的变量,修改范围Game_System类:
    因为毛毛叔的要求容量随人物级别变化并在随时强行修改,固该容量应由“基数+变数”两部分组成,“变数”即人物级别,依照要求为队伍一号角色级别。
先在Game_System类设定基数:

[quote]  建立实例变量并赋予读写属性
  attr_accessor :warehouse         # 仓库基数
  在initialize部分初始化,角色默认初始级别为1,仓库容量初始为10,所以基数为9:
  @warehouse = 9         # 仓库基数


  定义返回仓库容量的方法
  def warehouse_number
      # 容量 = 基数 + 角色级别
      return @warehouse + $game_party.actors[0].level
  end

  
  定义强行直接仓库容量的方法,因角色级别为不可随意更改的变量,所以可通过修改基数入手。
  def set_warehouse(n)
      # 基数 = 设定数 – 角色级别(即强制修改为:基数 + 角色级别= 设定数)
      @warehouse = n - $game_party.actors[0].level
  end

[/quote]

二、对获得物品设限,修改范围Game_Party类:
根据容量对获得的物品总数进行限制,具体在Game_Party类内操作。

[quote]  首先定义返回物品总数的方法:
  def warehouse_all_numbers
      s = 0
      @items.each{|i,j| s += j}     #累加道具总数
      @weapons.each{|i,j| s += j}  #累加武器总数
      @armors.each{|i,j| s += j}    #累加防具总数
      return s                  
  end

  定义判断物品是否饱和的方法:
  def warehouse_full?(sum)
      # 返回(物品总数 + 新加入物品数 > 仓库容量)
      return (warehouse_all_numbers + sum) > $game_system.warehouse_number
  end

  定义仓库饱和后,友情提示的显示窗:
  def warehouse_wds(name,sum)
      # name为物品名,sum为丢弃数量
      name == nil ?
      text = "仓库已饱和" : text = "仓库饱和,丢弃多余的#{sum}个#{name}"
      # 根据文字内容设定新窗体大小。
      w = text.size * 7
      x = 320 - w/2
      wds = Window_Base.new(x,120,w + 32,64)
      wds.contents = Bitmap.new(wds.width - 32, wds.height - 32)
      wds.contents.draw_text(0,0,w,32,text,1)
      wds.opacity = 200
      # 音效
      $game_system.se_play($data_system.decision_se)
      # 窗店画面位置修正   
      if $scene.is_a?(Scene_Shop)
         wds.x -= 150      
         wds.y += 100      
      end
      # 装备画面位置修正
      if $scene.is_a?(Scene_Equip)     
         wds.y -= 100      
      end
      # 窗体消失效果。
      40.times{|i| wds.opacity -= 20 if i > 30
                   wds.contents_opacity -= 20 if i > 30      
                   Graphics.update}  
      # 释放掉窗体,切莫使用实例变量。      
      wds.dispose   
  end

  根部修改,为获得方法设限:
  def gain_item(item_id, n)
    # 更新 hash 的个数数据
    if item_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_items[item_id].name,s)
      end  
      @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加武器 (减少)
  #     weapon_id : 武器 ID
  #     n         : 个数
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n)
    # 更新 hash 的个数数据
    if weapon_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_weapons[weapon_id].name,s)        
      end      
      @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加防具 (减少)
  #     armor_id : 防具 ID
  #     n        : 个数
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n)
    # 更新 hash 的个数数据
    if armor_id > 0
      # 若仓库已饱和
      if warehouse_full?(n)
         # 分别计算获得与舍弃的物品数量
         a = n
         n = $game_system.warehouse_number - warehouse_all_numbers
         s = a – n
         # 友情提示显示窗
         warehouse_wds($data_armors[armor_id].name,s)
      end      
      @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min
    end
  end
[/quote]

三:修改战斗结算画面饱和提示显示窗的出现时机,修改范围Scene_Battle 2类
   
[quote]    建立变量接收获得的宝物(约166行treasures = treasures[0..5]的下面)
    @temp = treasures

   将约181-190行获得宝物的方法剪切掉。   
   for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    将其放在约218行战斗结束“battle_end(0)”的前面,这样做是为将饱和提示窗延迟到宝物获得提示的后面出现。
       # 隐藏宝物提示窗口
       @result_window.visible = false
       # 获得宝物,treasures换成了可直接跨方法使用的实例变量@temp。
       for item in @temp
          case item
             when RPG::Item
                $game_party.gain_item(item.id, 1)
             when RPG::Weapon
                $game_party.gain_weapon(item.id, 1)
             when RPG::Armor
                $game_party.gain_armor(item.id, 1)
          end
       end
[/quote]

四、对装备窗口做特殊处理,修改范围Scene_Equip类:
     
[quote]     约106与112 的两处,      
     @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
     可看到为获取装备变化数值,这里有伤风化又脱又穿,因仅是临时变化,实际装备总量并没有改变,但若总量恰好等于仓库最大容量,脱下时会因超容而舍弃,造成物品丢失,有两种修改方式,一是先将equip方法改成先穿后脱,第二种则是我使用暂时扩容的方式:
      # 暂时扩大仓库1个容量
      $game_system.warehouse += 1           
      @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
      # 获取变更装备后的能力值
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      # 返回到装备
      @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
      # 恢复仓库容量           
      $game_system.warehouse -= 1

      对更换装备做特殊情况处理(约211行):      
      # 获取角色欲更换身体部位的物品ID。
      temp_id = @actor.weapon_id if @right_window.index == 0
      temp_id = @actor.armor1_id if @right_window.index == 1
      temp_id = @actor.armor2_id if @right_window.index == 2
      temp_id = @actor.armor3_id if @right_window.index == 3
      temp_id = @actor.armor4_id if @right_window.index == 4
      # 若物品栏为空,身体部分不为空(即脱下)时,仓库饱和
      if item == nil and temp_id > 0 and $game_party.warehouse_full?(1) == true
         # 则仅做饱和提示,不更换装备
         $game_party.warehouse_wds(nil,0)
      else
         # 否则临时扩容进行装备更换
         $game_system.warehouse += 1         
         # 变更装备
         @actor.equip(@right_window.index, item == nil ? 0 : item.id)
         $game_system.warehouse -= 1         
      end

[/quote]

五:为物品窗口添加丢弃功能,修改范围Scene_Item类:
   
    约74行新添加:
    # 当按下“L”(默认为Q)键时
    if Input.trigger?(Input::L)
       # 音效
       $game_system.se_play($data_system.decision_se)  
       # 获得当前物品数据
       @item = @item_window.item
       # 根据物品所属种类,选择不同的舍弃方法。
       case @item
          when RPG::Item
             $game_party.lose_item(@item.id, 1)
          when RPG::Weapon
             $game_party.lose_weapon(@item.id, 1)
          when RPG::Armor
             $game_party.lose_armor(@item.id, 1)
       end
       # 重新描绘当前物品的数量
       @item_window.draw_item(@item_window.index)
       # 若当前不能使,即为0时,重新描绘整个物品窗口,
       # 之所以不直接使用@item_window.refresh,是为降低资源消耗
       unless $game_party.item_can_use?(@item.id)
          @item_window.refresh
       end      
       return
    end

六:为主菜单添加仓库容量信息,修改范围Window_Steps:
   
    寸土寸金,就从相对次要的步数窗口剥削些领土吧:
    约22-24行,
    self.contents.draw_text(4, -5, 120, 32, "步数")
    self.contents.draw_text(4, 32, 120, 32, "仓库")
    self.contents.font.color = normal_color
    self.contents.draw_text(4, -5, 120, 32, $game_party.steps.to_s, 2)
    self.contents.draw_text(4, 32, 120, 32,$game_system.warehouse_number.to_s, 2)


    之所以写出修改流程,是方便她人整合脚本,毕竟该功能虽冲突风险较大,但实现起来却非常简单。

    OK,完工了。

范例下载,注意查毒
ftp://[email protected]/个� ... 品总量设限.rar

截图:






              [本贴由 叶舞枫 于 2007-4-22 22:33:34 进行了编辑]
纵然千里外,我等雁归来。

Lv1.梦旅人

本尊<

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-11-21
帖子
799

贵宾

3
发表于 2007-4-15 03:15:52 | 只看该作者
强,万分感谢{/se}{/se}
黑羽毛
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
4
发表于 2007-4-15 05:23:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

本尊<

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-11-21
帖子
799

贵宾

5
发表于 2007-4-15 16:13:49 | 只看该作者
用了一下,发现扔掉多余物品能不能弹出个选择,扔掉和取消选项,要不然扔得时候一点选择的余地都没有啊....需要的东西有可能被扔了,加个选择,如果饱和了就拿不到,等有空间了再拿....可行么?
黑羽毛
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

6
 楼主| 发表于 2007-4-15 16:16:50 | 只看该作者
以下引用莫浪语于2007-4-15 8:13:49的发言:

用了一下,发现扔掉多余物品能不能弹出个选择,扔掉和取消选项,要不然扔得时候一点选择的余地都没有啊....需要的东西有可能被扔了,加个选择,如果饱和了就拿不到,等有空间了再拿....可行么?


其实教程中已经给出判断是否饱和的方法了
$game_party.warehouse_full?(n)

完全可以依靠事件来控制,至于不直接写出来,
因为若是战斗中得到物品,不扔放到哪里???

纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

本尊<

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-11-21
帖子
799

贵宾

7
发表于 2007-4-15 16:23:04 | 只看该作者
我的是arpg,战斗完全事件
黑羽毛
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

8
 楼主| 发表于 2007-4-15 16:24:28 | 只看该作者
以下引用莫浪语于2007-4-15 8:23:04的发言:

我的是arpg,战斗完全事件


事件的条件分歧中可以加入该判断,完全可当作分歧变量使用。

条件分歧:$game_party.warehouse_full?(n)
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

本尊<

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-11-21
帖子
799

贵宾

9
发表于 2007-4-15 16:32:03 | 只看该作者
谢谢啊,热心的美兽
黑羽毛
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-7-21
帖子
714
10
发表于 2007-4-15 17:58:27 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 21:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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