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

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

物品设置上限修改流程 (RGSS脚本教学)

2007-4-22 00:00| 发布者: 柳柳| 查看: 4144| 评论: 0|原作者: 美兽

摘要:   作者 美兽 版本 没有 相关网址 点此进入讨论贴 范例工程 见下文     教学内容         此是为毛毛叔制作的物品容量的功能,结构简单,但
 

作者

美兽

版本

没有

相关网址

点此进入讨论贴

范例工程

见下文

 
 

 教学内容

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

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

建立实例变量并赋予读写属性
 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

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

 首先定义返回物品总数的方法:
 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

三:修改战斗结算画面饱和提示显示窗的出现时机,修改范围Scene_Battle 2类

  建立变量接收获得的宝物(约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

四、对装备窗口做特殊处理,修改范围Scene_Equip类:

    约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
五:为物品窗口添加丢弃功能,修改范围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]/个人文件夹/美兽(555)/物品总量设限/物品总量设限.rar
   

教程的通用说明

本站发布的教程,大多经过一些测试,应该都能够实现相应功能。但不保证所有的教程都是最优化的制作方法。

相关问题,点击发布贴进行讨论。谢谢您的鼓励与支持。


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

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

GMT+8, 2024-4-24 23:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部