幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1814|回复: 4

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

[复制链接]

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2007-4-14 22:12:16 | 显示全部楼层 |阅读模式
此是为毛毛叔制作的物品容量的功能,结构简单,但涉及修改范围较广,提问区多次,具备一定代表性,固有此修改流程的教程。
一、创建物品容量的变量,修改范围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:)
       # 音效
       $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,完工了。

范例下载,注意查毒
点我下载

截图:

本帖子中包含更多资源

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

x
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复

使用道具 举报

134

主题

2120

帖子

214748万

积分

⑥精研

ご覧の通り 、僕は妄

积分
2147483647
QQ
发表于 2007-4-14 22:36:46 | 显示全部楼层
美兽大人的东西,顶一下
(不顶对不起人民对不起党)
回复 支持 反对

使用道具 举报

38

主题

3468

帖子

1

积分

超级版主

传说中的Bunny火神~!

Rank: 8Rank: 8

积分
1
发表于 2007-4-14 23:26:40 | 显示全部楼层
-v-虽然这个我也会改,不过既然有详细的教程,还是要支持的。
我突然发现,我是一个很幸运的好人。老婆真好~ 点我进入JQ(激情)教程范例收集!
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-4-15 06:41:33 | 显示全部楼层
支持支持 [s:1]
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

6

主题

66

帖子

1万

积分

⑧专业

积分
16520
发表于 2007-4-15 23:23:07 | 显示全部楼层
没有冲突吧?
http://qgpcybs.uu1001.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-24 00:08 , Processed in 0.012079 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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