在编写一个AI之前,我需要做一件事。
之前因为动画素材的限制,去除了很多原本策划好的构建出游戏可玩性的设定。但是我可不希望自己的第一个作品,仅仅是个可操控小人走路的傻逼演示,就算画面再无节操,它还是得有一套合理的竞技机制。
所以现在我要恢复一些设定,让其能被称为游戏。
1,假如按速度为步长的倍数这一设定来调整人物位置,动画必将出现瞬移现象。
所以只能取消这一设定,使步长随耐力变化,而人物每一帧固定走一步。之前说过,即便步长在很大范围内脱离实际的变化时,动画效果看起来也并非不可接受,8是最合适的,6-10都看不出明显变化,3-20也都可接受。
权衡的结果是设定在3-13间变化,即step_length = (endurance/100 + 3)。
2,现在出腿速度被限定死了,没有任何改动的余地。
(2013.8.12注:将按键检测、动画帧的变化计算、动画帧的显示充分分离,这里应该还是有办法让出腿速度有所变化的)
说到这里我想在脑子里理一理游戏的核心机制是否能有效达成竞技性这个问题。
游戏开始,双方接近,乙方看到甲方出腿,可以后退躲过。所以甲方必须足够接近防止敌人躲闪,而在接近的过程中,乙方可能原地以逸待劳出腿攻击。在乙方出腿时甲亦可后退。
仔细思考一下,到底有没有可能实现躲闪?
目前游戏设定是33ms一个最小循环,每三个循环做一次按键判断、数据计算及动画现实,也就是说帧与帧的时间间隔为100ms。
那么从出现第一个出腿动作到完全出腿,有300ms的时间供玩家做出反应。
我去网上对“人的反应时间”这个有意思的课题做了些调查。当然这里是指“看见,然后做出动作”的反应时间,而非被针扎缩手那种神经性条件反射。一般的结论是150ms-400ms间。
这对我这款游戏来说意味着什么呢?意味着部分天生迟钝型玩家,像我这种apm永远48的猪蹄流,可能眼看着对方踢自己而不作任何反应。而反应时间稍快的,低于200ms那种人,可以有100ms的时间用来后退,即最多能退一步,当然前提是假如他认为有必要的话,即他对距离的把握是认为对方将踢中自己而退出一步就不会被踢中了。
于是最终这个游戏演变为双方对能保证击中对方距离的掌握——保证对方无法躲闪。也就是掐准一个腿长再减去一步的距离。
太远了踢不着空费力气,太近了可能被对方先发制人,这便是这个游戏的核心本质。
有一种特殊情况需要讨论下,因为出腿的速度并不会衰减,假设一方站在原地按着出腿键不放,会不会无敌呢?
结论是不会,因为完全出腿后并非直接再次出腿,而是有一个回收过程,同样耗时400ms,所以对方完全可以抓住你收腿的功夫,上前一步出击。
这么看来目前游戏的设定暂无大的漏洞。
我甚至想到试探性抬腿减耐力值较少而完全出腿会扣更多耐力值这种设定,来模拟真实的擂台赛,让玩法里出现试探性的动作,即吓对方一下,用较少的耐力损失让敌人后退而损失更多耐力值。
不过暂时还是不要搞这么复杂,因为现在的设定已经具备可玩性了。
3,前进步数的积累设定本来想用作加速出腿的,现在看来只能用作提高伤害或是击退距离了。
目前的设定是积累值在停止脚步时不会被清零,只有出腿、后退、或者身体顶撞到对方后才清零。
这样,假如你一开始出于劣势,但后面每次都坚决的前进到合适距离并果断出腿,而对方来不及闪避的话,就有可能达成翻盘。
4,另外我想从练技术的角度出发,研究下随机数问题,看能不能以合适的方式在伤害值中加入随机因子,如果可能的话把前进步数积累值关联进去。
随机数的产生一般先用srand配合time函数生成种子然后rand()产生,如srand((unsigned)time(NULL)); a = rand();要设定范围就对a取模。
随着步长的变化,前进步数有可能在零至几百范围内变化,当然实际情况我估计前进几百步踢中对方的事是很难发生的,所以为了便于处理,索性将这个积累值最大限定为10。
然后我产生一个10以内的随机数,同前进步数积累值相加得到sum,然后将sum/10 + 1,最终值将在1-3间变化,即有可能造成1-3倍伤害。具体的概率暂不细算,预计只要双方规则一样就不会太影响平衡性。
最后贴篇有意思的文章,关于某款动作网游中如何判断对方玩家使用了宏来“作弊”。
http://jx3.bbs.xoyo.com/viewthread.php?tid=31759067