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

Project1

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

负重系统是怎么炼成的?

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2008-11-20 16:23:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本教程讲解的是负重系统的制作方法

首先,我们要先在 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
复制代码


好了,把几个物品设置好重量,然后进游戏测试吧!
VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2008-10-19
帖子
219
2
发表于 2008-11-20 17:00:57 | 只看该作者
恩恩…谢谢流星姐姐………
您所请求的网址(URL)无法获取当尝试读取以下网址(URL)时:http://zh99998.vicp.net/bbs/发生了下列的错误:无法将您输入的主机名称:zh99998.vicp.net转换成 IP 地址域名服务器返回以下讯息:Name Error: The domain name does not exist.这表示: The cache was not able to resolve the hostname presented in the URL.  Check if the address is correct.  缓存服务器无法解析您输入网址(URL)中的主机名称, 请检查该名称是否正确。本缓存服务器管理员:[email protected] Wed, 23 Sep 2009 02:56:06 GMT by squid (squid/2.7.STABLE6)
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

lov Peii 4ever

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-10-28
帖子
423
3
发表于 2008-11-20 17:50:17 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

星辰创始

梦石
0
星屑
65
在线时间
155 小时
注册时间
2008-3-8
帖子
611
4
发表于 2008-11-20 19:56:36 | 只看该作者
可是武器,防具添加会出错,而且角色正装备的物品不会纳入负重,能改进吗?
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

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

那是因为这里只包含了物品,而不包含武器和防具
立刻去修改
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

星辰创始

梦石
0
星屑
65
在线时间
155 小时
注册时间
2008-3-8
帖子
611
6
发表于 2008-11-20 22:12:47 | 只看该作者
以下引用snstar2006于2008-11-20 12:35:50的发言:


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

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


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

回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

7
 楼主| 发表于 2008-11-21 10:28:54 | 只看该作者
已经修改了武器和防具的问题

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

请等待我的下一篇教程,自己修改吧{/dy}
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

星辰创始

梦石
0
星屑
65
在线时间
155 小时
注册时间
2008-3-8
帖子
611
8
发表于 2008-11-21 20:13:39 | 只看该作者
以下引用snstar2006于2008-11-21 2:28:54的发言:
请等待我的下一篇教程,自己修改吧


期待尽快发布!!{/wx}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
185
在线时间
0 小时
注册时间
2010-8-10
帖子
3
9
发表于 2010-8-23 16:07:54 | 只看该作者
恩恩…谢谢流星姐姐………:)
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
341
在线时间
453 小时
注册时间
2009-10-2
帖子
125
10
发表于 2010-9-8 21:22:38 | 只看该作者
谢谢流星姐
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-13 13:44

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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