赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本教程讲解的是负重系统的制作方法
首先,我们要先在 Game_Actor 里面设置好负重的计算公式
先订为 (HP最大值+MP最大值) X 等级 / 敏捷
所以先在脚本中定义:
- class Game_Actor < Game_Battler
- # 计算队员负重
- def load
- return (maxhp + maxmp) * @level / agi
- end
- end
复制代码
在这里我们定义了一个方法来计算公式。
皆下来计算整个队伍的总负重,因为是整个队伍
所以是在 Game_Party 里面定义。
- class Game_Party < Game_Unit
- # 获取队伍最大负重
- def total_load
- party_load = 0
- for i in 0...members.size
- actor = members[i]
- party_load += actor.load
- end
- return party_load
- end
- end
复制代码
先把区域变数 party_load 初始化为 0
然后用循环获取每个队员的负重值,然后计算总和
最后返回 party_load。
有了最大值,当然也要有当前值。
在 Game_Party 里面再定义一个属性
- attr_reader :current_load
复制代码
为什么用 reader 呢?
这是为了防止当前负重被修改,所以用 reader 限制只能在 Game_Party 里面修改。
等一下在来讲修改的方法,先来初始化这个属性。
先加入下面的脚本:
- alias load_initialize initialize
- def initialize
- load_initialize
- @current_load = 0
- end
复制代码
用 alias 是为了保留 initialize 原来的功能,不会被我们所影响。
然后我们再来写修改的方法。
- alias load_gain_item gain_item
- def gain_item(item, n, include_equip = false)
- if ((item.load * n) + @current_load) > total_load
- return
- else
- @current_load += item.load * n
- end
- load_gain_item(item, n, include_equip)
- end
复制代码
这里其实就是在增加物品前,先执行一个判断
if ((item.load * n) + @current_load) > total_load
就是先获取现在这个物品的重量,乘以增加的数量,
然后再与队伍的最大负重值比较
若是大于队伍最大负重值,则结束此方法 (return)
否则将把物品重量加入当前负重值,然后执行增加物品的指令
当然,我们也可以在无法获得物品时,提示一下玩家。
在 return 前面加上
- $game_message.texts.push("负重不足,请先清空身上的物品")
- $game_message.visible = true
复制代码
这样无法获得物品时,就会跳出“负重不足,请先清空身上的物品”的讯息。
不过,要怎么获得物品的重量呢?
当然要先定义啦!
- class RPG::BaseItem
- # 获取物品重量
- def load
- return if self.is_a?(RPG::Skill)
- self.note.split(/[\r\n]+/).each { |line|
- if line =~ /\[(?:load|负重|负重) (\w+)\]/
- return $1.nil? ? 0 : $1.to_i
- end}
- return 0
- end
- end
复制代码
/\[(?:load|负重|负重) (\w+)\]/
就是说:在物品的备注中填写
[负重 N]的话,该物品的重量就是N
这里是用了正则表达式,这里就不多做解释了,大家可以用同样这个写法去从
备注里面获取想要的资讯,把 (?:load|负重|负重) 的内容换掉就行了。
PS:那个 | 代表“或”
至於这句:return if self.is_a?(RPG::Skill)
是为了排除技能用的
最后就是在物品画面当中显示负重的数值了。
- class Scene_Item < Scene_Base
- alias load_start start
- alias load_terminate terminate
- alias load_update update
- def start
- # 生成负重显示窗口
- @load_window = Window_Base.new(392, 0, 152, 56)
- load_start
- end
- def terminate
- # 释放负重显示窗口
- @load_window.dispose
- load_terminate
- end
- def update
- # 刷新负重显示窗口
- @load_window.update
- load_update
- end
- end
复制代码
先定义好窗口的生成、释放和更新(参考我的 Scene教程)
然后就是显示了,显示是不是要定义一个新的Window类呢?
答案是:不需要
别忘了,我们生成窗口的时候,就是生成了一个Window_Base的对象
而一个Window_Base的对象,就可以调用一个Window_Base的方法。
所以我们可以直接用
- text = "#{$game_party.current_load}/#{$game_party.total_load}"
- @load_window.contents.draw_text(0, 0, 120, 24, text)
复制代码
来绘制文字。
这里用了内嵌表达式来将当前负重和最大负重值嵌入 text 字符串内
不过问题是:这句要放在哪里呢?
放在update里面,因为我们要确定每次当前负重值变更时,就要刷新。
不过若是每桢都刷新的话,就会大大拖慢 fps,所以我们还要再加一个判断
- if @temp_load != $game_party.current_load
复制代码
这个 @temp_load 是一个我们用来判断刷新的暂存负重值。
当队伍负重变更时,就刷新才刷新。
不过刷新后,要再将 @temp_load 重新赋值,所以整段成为:
- if @temp_load != $game_party.current_load
- @load_window.contents.clear
- text = "#{$game_party.current_load}/#{$game_party.total_load}"
- @load_window.contents.draw_text(0, 0, 120, 24, text)
- @temp_load = $game_party.current_load
- end
复制代码
好了,把几个物品设置好重量,然后进游戏测试吧! |
|