赞 | 0 |
VIP | -1 |
好人卡 | 0 |
积分 | 1 |
经验 | 125905 |
最后登录 | 2013-11-3 |
在线时间 | 1 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 1 小时
- 注册时间
- 2005-10-22
- 帖子
- 519
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
#本篇文章适合非常闲,有时间看完的闲人阅读 - -||
感谢弗洛多的提醒……总算不用傻乎乎的写一个新方法了……
(不过我怎么总觉得弗洛多是某人的马甲…… - -)
自从面粉偶挖坑做游戏以来,制作了盗贼这个职业之后,给这个职业制作了很多技能,但是用来用去总觉得少了点什么。
一天一泡鸟屎打在脑袋上……偶明白了 = =
TNND,不能偷东西的还算是盗贼么?
于是便有了这篇文章以及下面所要提到的方法。
这里提出的是一个脚本与公共事件结合的办法来制作偷窃技能。当然,单独使用公共事件也是完全可以做出来的,只不过相较偷窃物品设置上,公共事件的设置会比用脚本设置麻烦许多,所以为了偷懒……嗯……
面粉偶水平有限,如果有什么错误的地方还烦请大家提出。
--------------无敌的分割线------------------------
我们(假设是我们…… = =||)所设想的偷窃技能是这个样子的
对敌人施展偷窃技能===>显示动画===>判定是否偷窃成功===>显示是否成功===>如果成功则得到并显示偷窃的物品
那么,既然是制作技能,我们首先就要在数据库中设定一个名称为“偷窃”的技能…… (废话……)
图1
威力、攻击力都设定为0
现在我们做成了皮毛工作,没事的时候可以自恋地打开战斗测试观赏一下我们偷窃的英姿……
但是自恋是无法搞到我们偷窃的咚咚的!我们还需要制作判定偷窃是否成功的算法。
(预备知识)
对于默认的RM战斗系统来说,以我个人意见,一般的技能是按照以下几个大致步骤来进行计算的(主要由Scene_Battle4和Game_Battler3中的方法控制)
1、准备阶段
获取技能===>判定技能是否可用===>(如果可用)刷新状态和帮助窗口并设置动画ID===>设置技能影响范围
2、计算阶段
生成技能使用效果===>消耗SP
3、显示阶段
显示使用者动画===>显示对象动画===>刷新状态窗口===>显示伤害
4、结束阶段
调用技能附带的公共事件===>返回技能调用
需要注意的是
计算阶段中,生成技能使用效果并不是说让我们看到技能动画和伤害,他只是Game_Battler3中一个负责计算的方法,不涉及到显示的问题。
其主要功能就是计算命中并计算damage以及状态的解除。
对于damage这个不定类型变量需要特别注意(也算是Ruby的特色? - -),他并不一定是1999之类的实际伤害或者治疗数字,也有可能是明晃晃的字符型的"MISS"……
只是在这里由生成技能效果计算得出后,在Scene_Battle4中由update_phase4_step5方法的target_damage_pop = true加以调用才弹出来的。如图:
图2
红色部分的大致意思就是
当对象在技能所影响对象中时
如果对象的damage不是空的
弹出damage
结束
结束
那么,基于以上的基础条件……我们不难得出一个偷懒的想法:
我们可以修改Scene_Battle4,判断偷窃是否成功后,让生成技能使用效果这个方法得出的偷窃技能的damage
变为我们需要的“成功”或者“失败”的提示。然后再由Scene_Battle4中调用弹出……
这里介绍一个我个人的修改Scene_Battle4的简单方法,用来判定偷窃是否成功并设置伤害。
(终于来一点实际的了…… - -)
图3
先来看红色的部分,这是计算偷窃是否成功的算法
if @active_battler.current_action.kind == 1 and @skill.name == "偷窃"
$game_switches[540] = false
rate_a = [( @active_battler.dex - target.dex/10 - target.int/30 ),10].max
rate_b = [(rate_a/10),95].min
bingo = (rand(100) < rate_b)
他的大致意思就是
如果当前战斗者的行动类别为技能而且技能名称为“偷窃”
第540号开关初始化为关闭(该开关用来控制公共事件的运算与否,后面会提到,自己用的话可以换成自己需要的开关编号)
计算rate_a,为(当前技能使用者的dex - 目标dex的1/10 - 目标int的1/30)与10相比,取较大的
计算rate_b,为rate_a的1/10与95相比,取较小的
计算是否bingo,概率为 rate_b %
这样子,bingo便是我们得到的是否成功偷窃的判定变量。当其为true时,表示偷窃成功;false的时候,表示偷窃失败。
而且偷窃成功的概率经rate_a、b的运算,与使用者和目标的属性相关联,最高为95%,最低为1%。
这个计算方法可以由大家自行更改……并不是唯一的……
现在我们有了是否偷窃成功的判定,接下来看蓝色部分,damage的重新设置
还记得我们数据库内设置的偷窃技能不?它的威力和攻击力都是0。如果按照默认的系统,由生成技能效果方法传过来的damage会是一个大大的MISS。
而蓝色的部分,正是以前弹出这个damage的部分,我们只需要在这里把damage拦截下来,并加以修改就可以了。
#------------------------------------------------------
if bingo
#成功偷窃,生成偷窃物品
make_steal_result
#成功偷窃,设置伤害文字为Success
target.damage = ""
target.damage = "Success!!"
#播放偷窃成功音效
Audio.se_play("Audio/SE/"+"Clip111",80,125)
$game_variables[207] += 1
$game_switches[540] = true
else
#偷窃失败,设置伤害为Failed
target.damage = ""
target.damage = "Failed!!"
#播放偷窃失败音效
Audio.se_play("Audio/SE/"+"Clip22",80,100)
end
target.damage_pop = true
#-------------------------------------------------------
这一段的大致意思是
如果bingo了(偷窃成功)
调用make_steal_result方法(这是一个Scene_Battle类中的方法,后面会讲到),生成偷窃物品
目标的damage被设定为字符类型
目标的damage设定为“成功!!”
播放偷窃成功时的音效
第207号变量的值+1(这个变量是用来记录成功偷窃次数的,主要是为了以后可以用来做一些邪恶的功能…… - -)
第540号开关打开(还记得这个开关么?刚才在计算是否偷窃成功的时候我们把它关上了。这里把它打开,使用它来通知公共事件,偷窃成功了)
否则的话(偷窃失败的话)
目标的damage被设定为字符类型
目标的damage设定为“失败!!”
播放偷窃失败的音效
结束分歧
弹出damage
这样子,敌人身上原先的MISS,就变成了华丽的“成功”或者“失败”。
可是看看我们的背包……却发现偷东西成功之后,物品并没有增多 - -
这是因为我们还欠缺生成并获得偷窃物品的相关方法。
想一想上面的脚本,是不是有一个make_steal_result?
这个便是我们要写的生成偷窃物品的方法。
为了方便(偷懒),我将make_steal_result设定为Scene_Battle类中的一个方法,这样子调用起来比较方便(因为当前的Scene_Battle4也是一个Scene_Battle类的脚本),也不容易出错。
图4
格式大致如图,我们来看一个简单的例子。
#-----------------------------------------------------------------------
class Scene_Battle
#表示这是一个Scene_Battle类
def make_steal_result
#在这个类中定义一个方法:make_steal_result
item_ser_num = rand(50)
#获取随机数item_ser_num,值为0~49中的一个
item_ser = 0
#初始化item_ser为0,这个变量是用来表示偷到的物品种类,是武器,还是道具或者(可参照公共事件和下面的脚本理解)
item_id = 0
#初始化item_id为0,这个变量用来储存偷到的物品ID
item_num = 0
#初始化item_num为0,这个变量用来储存偷到的该物品数量
case item_ser_num
#对item_ser_num这个随机数进行条件分歧
when 0
#当其值为0的时候
item_ser = 1
#item_ser = 1,表示这是一个武器
item_id = 7
#item_id = ,表示ID为7
item_num = 1
#表示数量为1
when 1
#当其值为1的时候
item_ser = 1
#表示这是一个武器
item_id = (rand(3) + 1)
#ID为1~3中的一个
item_num = 1
#数量为1
when 2
#当其值为2的时候
item_ser = 2
#表示这是一个防具
item_id = (rand(3) + 5)
#ID为5~7中的任意一个
item_num = 1
#数量为1
when 3..9
#当其值为3~9之间的一个数字时
item_ser = 0
#表示这是一个物品
item_id = (rand(3) + 9)
#ID为9~11中的任意一个数
item_num = 1
#数量为1
else #酒类
#如果不是以上提到的任何数字且在49以内
item_ser = 0
#表示这是一个物品
item_id = (rand(4) + 89)
#ID为89~93中任意一个数字
item_num = (rand(2) + 1)
#数量为1~2个
end
#结束对于item_ser_num的条件分歧
case item_ser
#对于item_ser(即物品种类)进行条件分歧
when 0 #物品
$game_variables[204] = 0
#是物品的话,第204号变量 = 0,用来告诉公共事件这是个物品
when 1 #武器
$game_variables[204] = 1
#是武器的话,第204号变量 = 1,用来告诉公共事件这是个武器
when 2 #防具
$game_variables[204] = 2
#是防具的话,第204号变量 = 2,用来告诉公共事件这是个防具
end
#结束对于item_ser的条件分歧
$game_variables[205] = item_id
#用第205号变量存储得到的道具ID
$game_variables[206] = item_num
#用第206号变量存储得到的道具数量
end
end
#结束
#------------------------------------------------------------
这样子,我们便得到了偷窃的物品种类、ID、数量。每个物品被偷到的概率则由item_ser_num的随机范围以及每个道具的对item_ser_num的分歧范围决定。
什么?你问为什么要把道具分类?
那是因为在RGSS中,武器、物品、防具是各自独立的三个类,而且对于事件命令的得到道具指令,他们三个也是分开的。
否则如果不分类,按照此算法,相同的ID完全无法知道到底是武器还是防具还是物品。
另外,这个算法不是唯一的。对于战斗的敌人完全可以有更优秀的算法来决定偷到的东西。
例如将对战场上的敌人所有可能掉落的东西推入一个数组或者哈希表中,从这里取出可能偷到的东西。
但是,偶这个算法也是有自己的特色和优点的= =||
比如最大的特点就是能省就省…… = =|| 使用了系统变量和开关来储存,这样子可以轻松地在事件中加以调用(同时也节省了大量写脚本的时间……偷懒—)
而且,这个算法最大的好处就是只要对技能本身做一些限制,就完全可以利用这个算法做出对地图上NPC进行偷窃的功能来……
设定好可以偷取的物品之后,新建一个公共事件,内容如下
图5
其内容大致意思为
如果第540号开关是打开的(表示偷窃成功)
如果偷到的物品种类是0(表示物品)
调用得到物品(ID,数量)
如果偷到的物品种类是1(表示武器)
调用得到武器(ID,数量)
如果偷到的物品种类是2(表示防具)
调用得到防具(ID,数量)
结束
结束
(还记得205和206这两个变量吧?他们是用来分别储存ID和数量的)
让我们的“偷窃”技能附带这个公共事件。
这样子我们便可以通过调用事件的得到道具,来获得我们偷到的物品。
什么?你问为什么不直接用事件命令?
那是因为事件命令虽然可以用变量指定得到道具的数量,但是却不能指定道具的ID,这不符合我们偷窃技能的要求。
好了,到这里基本已经到了收口阶段了。我们还欠缺的就是点睛的那一笔——需要有人告诉我们到底偷到了什么。
这里采用了66的得失物品提示的算法,在Game_Party中建立了三个单独的方法(分别对应道具的三个种类),用来提示道具的取得,只是将我们之前使用的变量带入进来。
可以将这三个方法的定义插入
#--------------------------------------------------------------------------
# ● 减少防具
# armor_id : 防具 ID
# n : 个数
#--------------------------------------------------------------------------
def lose_armor(armor_id, n)
# 调用 gain_armor 的数值逆转
gain_armor(armor_id, -n)
end
的后面。
脚本如下:
#------------------------------------------------------------------
#偷窃物品的提示
#------------------------------------------------------------------
def get_weapon #偷到武器的提示
carol3_66RPG_item = $data_weapons[$game_variables[205]]
carol3_66RPG = Window_Base.new((640-300)/2,128,300,100)
carol3_66RPG.contents = Bitmap.new(carol3_66RPG.width - 32, carol3_66RPG.height - 32)
if $game_variables[206] >= 0
carol3_66RPG.contents.draw_text(0,0,240,32,"偷到武器:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"Clip18",80,100)
else
carol3_66RPG.contents.draw_text(0,0,240,32,"失去武器:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"005-System05",80,100)
end
carol3_66RPG_bitmap = RPG::Cache.icon(carol3_66RPG_item.icon_name)
carol3_66RPG.contents.blt(0, 32, carol3_66RPG_bitmap, Rect.new(0, 0, 24, 24), 255)
carol3_66RPG.contents.draw_text(0 + 28, 32, 212, 32, carol3_66RPG_item.name, 0)
carol3_66RPG.contents.draw_text(0, 32, 268, 32, "×"+$game_variables[206].abs.to_s, 2)
carol3_66RPG.opacity = 160
for i in 0..30
Graphics.update
end
for i in 0..10
carol3_66RPG.opacity -= 30
carol3_66RPG.contents_opacity -= 30
Graphics.update
end
carol3_66RPG.dispose
end
def get_armor #偷到防具的提示
carol3_66RPG_item = $data_armors[$game_variables[205]]
carol3_66RPG = Window_Base.new((640-300)/2,128,300,100)
carol3_66RPG.contents = Bitmap.new(carol3_66RPG.width - 32, carol3_66RPG.height - 32)
if $game_variables[206] >= 0
carol3_66RPG.contents.draw_text(0,0,240,32,"偷到防具:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"Clip18",80,100)
else
carol3_66RPG.contents.draw_text(0,0,240,32,"失去防具:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"005-System05",80,100)
end
carol3_66RPG_bitmap = RPG::Cache.icon(carol3_66RPG_item.icon_name)
carol3_66RPG.contents.blt(0, 32, carol3_66RPG_bitmap, Rect.new(0, 0, 24, 24), 255)
carol3_66RPG.contents.draw_text(0 + 28, 32, 212, 32, carol3_66RPG_item.name, 0)
carol3_66RPG.contents.draw_text(0, 32, 268, 32, "×"+$game_variables[206].abs.to_s, 2)
carol3_66RPG.opacity = 160
for i in 0..30
Graphics.update
end
for i in 0..10
carol3_66RPG.opacity -= 30
carol3_66RPG.contents_opacity -= 30
Graphics.update
end
carol3_66RPG.dispose
end
def get_item #偷到物品的提示
carol3_66RPG_item = $data_items[$game_variables[205]]
carol3_66RPG = Window_Base.new((640-300)/2,128,300,100)
carol3_66RPG.contents = Bitmap.new(carol3_66RPG.width - 32, carol3_66RPG.height - 32)
if $game_variables[206] >= 0
carol3_66RPG.contents.draw_text(0,0,240,32,"偷到物品:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"Clip18",80,100)
else
carol3_66RPG.contents.draw_text(0,0,240,32,"失去物品:")
#——声效,可以自己改
Audio.se_play("Audio/SE/"+"005-System05",80,100)
end
carol3_66RPG_bitmap = RPG::Cache.icon(carol3_66RPG_item.icon_name)
carol3_66RPG.contents.blt(0, 32, carol3_66RPG_bitmap, Rect.new(0, 0, 24, 24), 255)
carol3_66RPG.contents.draw_text(0 + 28, 32, 212, 32, carol3_66RPG_item.name, 0)
carol3_66RPG.contents.draw_text(0, 32, 268, 32, "×"+$game_variables[206].abs.to_s, 2)
carol3_66RPG.opacity = 160
for i in 0..30
Graphics.update
end
for i in 0..10
carol3_66RPG.opacity -= 30
carol3_66RPG.contents_opacity -= 30
Graphics.update
end
carol3_66RPG.dispose
end
然后将公共事件稍微进行一下修改……
图6
拍拍身上的灰尘,大功告成。这样子,便实现了我们最开始设定的技能设想。效果可以参照偶签名的图片…… - -
#----------------------------------------------------------------------
简单来说,这个技能的设定只是数组与随机数还有条件分歧的大合唱,并没有什么复杂的内容。
只是对于刚刚接触RGSS的人来说,RM的战斗系统可能会稍微有些理不清头绪。
另外对于这个整体的想法,偶不由得联想到了另一个既老套又让我不得不想的系统,物品合成……
兴许我们可以将物品1作为一个大类,让其带有一个数组或哈希表,如果物品2在其中,那么则按照一定规则合成物品……
与这个算法有点类似……
不过,对于能从地图NPC身上偷窃到花内裤这种事情……
我还是最期待的…… ^O^
#---------------------------------------------------------------------
PS:本文是半夜重新写的……可能忘记了原先文章的一部分内容……Orz……(该死的靠不住的电脑……)
如果大家能有耐心读完……我就谢天谢地了…… - -(原先没打算写这么长的说……)
如果这个脚本有什么问题……还是那句话…… 一切从改脚本开始……|||
光速逃走…… - -
[本贴由 叶舞枫 于 2007-4-22 22:05:21 进行了编辑] |
|