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

Project1

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

[RMVX发布] [备忘录]RGSS2有关战斗中选择目标索引的一个坑

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
660 小时
注册时间
2011-6-25
帖子
37
跳转到指定楼层
1
发表于 2013-4-8 02:53:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
没啥实际内容,就留个档免得以后忘了又做重复功。
大家都知道RM的战斗选择目标是通过target_id索引来实现的,引擎根据Window_TargetEnemy窗口中获取的enemy对象的index属性记录当前行动选择的目标,并且封装到Game_BattleAction对象中等待调用。
本来这个机制应该是非常清晰的,但是今天在制作某系统的时候却出现了诡异的情况:通过某些函数在战斗过程中动态添加了一些敌人(可以理解为敌人的召唤同伴技能)后,在战斗行动选择目标时明明选择了a目标(角色目标选择的箭头和窗口获取到的enemy对象的index也是这样说的),但是实际行动时却攻击了另一个目标,并且这另一个目标并不固定!这是怎么一回事呢?
这就要从Game_BattleAction对象的make_obj_targets(创建行动目标)函数说起了,这个函数调用了Game_Unit对象的smooth_target方法,而坑就出在这个方法里面。
让我们看看这个方法的默认实现:
def smooth_target(index)   
   member = members[index]   
   return member if member != nil and member.exist?   
   return random_target  
end
可以明确地看到其获取单位目标的方式为直接按照index索引从队伍单位列表中取得对应索引的对象(如果对象为空或不存在(死亡或逃跑)则随机选择一个目标)。这个机制本身是没有问题的,但是问题就出在rm的一个约定上:在数据库中的所有数据索引都是从1开始的!
于是在动态添加敌人的时候,我按照这个约定,把新添加的敌人的索引(Game_Enemy对象的index属性)设置成了(添加新敌人前敌人队伍内单位数量 + 1)的数值,而实际上按照以上函数的实现,新添加敌人的正确索引应该等于添加新敌人前敌人队伍内单位数量。这样就导致了当系统按照我给定的索引进行寻找时,要么会寻找到我预想中的对象的后一个对象,要么会因为找不到对应索引对象而随机选择一个对象。这就造成了本文第一段内容所产生的结果。
当然,如果坑仅仅只有这么一点深的话,排除这个bug其实是相当容易的,那么为什么我排除这个bug竟然用了20分钟之久呢?
这就要说到另一个坑了:在Window_TargetEnemy中确定的敌人index和Game_Unit对象中单位列表的索引并不一一对应!在Window_TargetEnemy中,系统是按照敌人的index属性来给玩家选择的目标id赋值的,而只要敌人的创建代码愿意,它可以把敌人的index属性设置成任意值,而Window_TargetEnemy照样会正常运作!这就导致开发者在一开始很难想到问题出在目标选择的索引上。(我甚至一开始认为是没有随机重命名敌人的名称(即把多个同种类敌人命名为老鼠一,老鼠二等)导致目标选择混乱。)
嗯,今天的胡言乱语就到此为止,希望能给遇到同样问题的开发者一点帮助吧。




头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2013-4-23
帖子
8
2
发表于 2013-4-23 19:49:16 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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