赞 | 0 |
VIP | 17 |
好人卡 | 0 |
积分 | 1 |
经验 | 1022914 |
最后登录 | 2017-2-4 |
在线时间 | 10 小时 |
Lv1.梦旅人 月下可怜人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 10 小时
- 注册时间
- 2005-11-23
- 帖子
- 4085
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
此是为毛毛叔制作的物品容量的功能,结构简单,但涉及修改范围较广,提问区多次,具备一定代表性,固有此修改流程的教程。
一、创建物品容量的变量,修改范围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::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]/个� ... 品总量设限.rar
截图:
[本贴由 叶舞枫 于 2007-4-22 22:33:34 进行了编辑] |
|