Project1

标题: 负重系统是怎么炼成的? [打印本页]

作者: 雪流星    时间: 2008-11-20 16:23
标题: 负重系统是怎么炼成的?
本教程讲解的是负重系统的制作方法

首先,我们要先在 Game_Actor 里面设置好负重的计算公式
先订为 (HP最大值+MP最大值) X 等级 / 敏捷

所以先在脚本中定义:
  1. class Game_Actor < Game_Battler
  2.   # 计算队员负重
  3.   def load
  4.     return (maxhp + maxmp) * @level / agi
  5.   end
  6. end
复制代码

在这里我们定义了一个方法来计算公式。

皆下来计算整个队伍的总负重,因为是整个队伍
所以是在 Game_Party 里面定义。

  1. class Game_Party < Game_Unit
  2.   # 获取队伍最大负重
  3.   def total_load
  4.     party_load = 0
  5.     for i in 0...members.size
  6.       actor = members[i]
  7.       party_load += actor.load
  8.     end
  9.     return party_load
  10.   end
  11. end
复制代码

先把区域变数 party_load 初始化为 0
然后用循环获取每个队员的负重值,然后计算总和
最后返回 party_load。

有了最大值,当然也要有当前值。
在 Game_Party 里面再定义一个属性

  1.   attr_reader :current_load
复制代码

为什么用 reader 呢?
这是为了防止当前负重被修改,所以用 reader 限制只能在 Game_Party 里面修改。
等一下在来讲修改的方法,先来初始化这个属性。
先加入下面的脚本:

  1. alias load_initialize initialize
  2. def initialize
  3.   load_initialize
  4.   @current_load = 0
  5. end
复制代码

用 alias 是为了保留 initialize 原来的功能,不会被我们所影响。

然后我们再来写修改的方法。

  1. alias load_gain_item gain_item
  2. def gain_item(item, n, include_equip = false)
  3.   if ((item.load * n) + @current_load) > total_load
  4.     return
  5.   else
  6.     @current_load += item.load * n
  7.   end
  8.   load_gain_item(item, n, include_equip)
  9. end
复制代码

这里其实就是在增加物品前,先执行一个判断
if ((item.load * n) + @current_load) > total_load
就是先获取现在这个物品的重量,乘以增加的数量,
然后再与队伍的最大负重值比较
若是大于队伍最大负重值,则结束此方法 (return)
否则将把物品重量加入当前负重值,然后执行增加物品的指令

当然,我们也可以在无法获得物品时,提示一下玩家。
在 return 前面加上

  1. $game_message.texts.push("负重不足,请先清空身上的物品")
  2. $game_message.visible = true
复制代码

这样无法获得物品时,就会跳出“负重不足,请先清空身上的物品”的讯息。

不过,要怎么获得物品的重量呢?
当然要先定义啦!

  1. class RPG::BaseItem
  2.   # 获取物品重量
  3.   def load
  4.     return if self.is_a?(RPG::Skill)
  5.     self.note.split(/[\r\n]+/).each { |line|
  6.       if line =~ /\[(?:load|负重|负重) (\w+)\]/
  7.         return $1.nil? ? 0 : $1.to_i
  8.       end}
  9.     return 0
  10.   end
  11. end
复制代码

/\[(?:load|负重|负重) (\w+)\]/
就是说:在物品的备注中填写
[负重 N]的话,该物品的重量就是N

这里是用了正则表达式,这里就不多做解释了,大家可以用同样这个写法去从
备注里面获取想要的资讯,把 (?:load|负重|负重) 的内容换掉就行了。
PS:那个 | 代表“或”

至於这句:return if self.is_a?(RPG::Skill)
是为了排除技能用的

最后就是在物品画面当中显示负重的数值了。

  1. class Scene_Item < Scene_Base
  2.   alias load_start start
  3.   alias load_terminate terminate
  4.   alias load_update update
  5.   def start
  6.     # 生成负重显示窗口
  7.     @load_window = Window_Base.new(392, 0, 152, 56)
  8.     load_start
  9.   end
  10.   def terminate
  11.     # 释放负重显示窗口
  12.     @load_window.dispose
  13.     load_terminate
  14.   end
  15.   def update
  16.     # 刷新负重显示窗口
  17.     @load_window.update
  18.     load_update
  19.   end
  20. end
复制代码


先定义好窗口的生成、释放和更新(参考我的 Scene教程)
然后就是显示了,显示是不是要定义一个新的Window类呢?

答案是:不需要
别忘了,我们生成窗口的时候,就是生成了一个Window_Base的对象
而一个Window_Base的对象,就可以调用一个Window_Base的方法。
所以我们可以直接用

  1. text = "#{$game_party.current_load}/#{$game_party.total_load}"
  2. @load_window.contents.draw_text(0, 0, 120, 24, text)
复制代码

来绘制文字。
这里用了内嵌表达式来将当前负重和最大负重值嵌入 text 字符串内

不过问题是:这句要放在哪里呢?
放在update里面,因为我们要确定每次当前负重值变更时,就要刷新。
不过若是每桢都刷新的话,就会大大拖慢 fps,所以我们还要再加一个判断

  1. if @temp_load != $game_party.current_load
复制代码

这个 @temp_load 是一个我们用来判断刷新的暂存负重值。
当队伍负重变更时,就刷新才刷新。
不过刷新后,要再将 @temp_load 重新赋值,所以整段成为:

  1. if @temp_load != $game_party.current_load
  2.   @load_window.contents.clear
  3.   text =  "#{$game_party.current_load}/#{$game_party.total_load}"
  4.   @load_window.contents.draw_text(0, 0, 120, 24, text)
  5.   @temp_load = $game_party.current_load
  6. end
复制代码


好了,把几个物品设置好重量,然后进游戏测试吧!
作者: 千落樱·念晓    时间: 2008-11-20 17:00
恩恩…谢谢流星姐姐………
作者: 3nξhα0_lim    时间: 2008-11-20 17:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 星辰天羽    时间: 2008-11-20 19:56
可是武器,防具添加会出错,而且角色正装备的物品不会纳入负重,能改进吗?
作者: 雪流星    时间: 2008-11-20 20:35
以下引用星辰天羽于2008-11-20 11:56:36的发言:
可是武器,防具添加会出错,而且角色正装备的物品不会纳入负重,能改进吗?

那是因为这里只包含了物品,而不包含武器和防具
立刻去修改

作者: 星辰天羽    时间: 2008-11-20 22:12
以下引用snstar2006于2008-11-20 12:35:50的发言:


以下引用星辰天羽于2008-11-20 11:56:36的发言:
可是武器,防具添加会出错,而且角色正装备的物品不会纳入负重,能改进吗?

那是因为这里只包含了物品,而不包含武器和防具
立刻去修改


在物品窗口界面的负重显示的地方能不能加上图标和负重单位?


作者: 雪流星    时间: 2008-11-21 10:28
已经修改了武器和防具的问题

以下引用星辰天羽于2008-11-20 14:12:47的发言:
在物品窗口界面的负重显示的地方能不能加上图标和负重单位?

请等待我的下一篇教程,自己修改吧{/dy}
作者: 星辰天羽    时间: 2008-11-21 20:13
以下引用snstar2006于2008-11-21 2:28:54的发言:
请等待我的下一篇教程,自己修改吧


期待尽快发布!!{/wx}

作者: qq26123    时间: 2010-8-23 16:07
恩恩…谢谢流星姐姐………:)
作者: a827594998    时间: 2010-9-8 21:22
谢谢流星姐




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