曾几何时开始迷恋无垠的天际,幻想着插上翅膀去飞翔。《天翼之链》、《奇迹》、《梦幻诛仙》向无数玩家展示了飞行的世界。翅膀,常常是一种身份的象征,但如能再赋予它自由的含义,好比《永恒之塔》中如履空气般畅快淋漓,游戏魅力自然无可阻挡。
如何让游戏中的角色自由飞翔?角色飞行时有何特殊之处这是游戏在设计需求时最需要考虑的问题。在如《星钻物语》、《天翼之链》等Q版网络游戏中,翅膀仅仅作为一种美丽的装饰品,强者的象征,附加属性除此之外毫无他用;又如《奇迹》、《封神榜》等游戏,当角色装备翅膀后移动模式会变为“超低空”飞行模式,但仅仅表现为移动时外表样式的改变,当遇到任何地面障碍时仍是无法飞越的;而在2D的《梦幻诛仙》中,飞行模式却体现得到华丽而不失真实。当主角在天空时,地面的所有对象物体均会被缩小为原始的60%左右比例,并且在天空层与地面层之间覆盖着一层透明的云雾缭绕效果,仿若真正置身于天际:
这种2.8D的视觉效果在Silverlight中可以通过两种途径来实现:HLSL渲染和按需缩放。如果未来的Silverlight版本能完全激发GPU的渲染功能,那么利用HLSL直接对精灵托盘(Carrier)和地图托盘进行相应比例的缩小渲染后,再对主角等飞空的对象进行放大复原二次渲染即可,其中在天空层与地面层之间放置一张透明度的云雾PNG图片,一切其实可以这么简单滴;但在目前Silverlight还无法很好调用GPU的前提下,我们可以通过循环遍历所有在游戏窗口中显示的对象,如果不是在飞行状态的,则尺寸缩小为原始的60%,反之则不变,具体逻辑还算简单,只是需要特别注意一下地图的处理,例如地图使用的是Tile块或整图就无大碍,如果是切片按需加载的则相对麻烦些,需要多写算法。额外的,精灵在飞行过程中将无视一切障碍,并且移动速度会相比在地面上快一些,同时还需要考虑降落时所处的坐标是否为障碍物,否则不允许着陆等逻辑。
《梦幻诛仙》算是目前层次效果最好的2D网游之一,由于本教程示例游戏结构架设之初并未考虑陆-空分层,因此本节暂时以实现主角传统低空飞行模式为主,即从外观上体现,并同时能实现障碍物的飞跃。
这里我准备的素材来源于《封神榜2》的翌使,精灵要飞行,当然需要添加一个IsFlying属性来描述是否正处于飞行状态,如果是,则遇到障碍物碰撞检测均忽略掉,例如:
private bool WillCollide(QXSprite sprite, Point p) {
if (sprite.IsFlying) { return false; }
……
}
然后将翅膀道具添加进游戏,在本教程示例游戏中,为简单起见,我将翅膀归到衣服类;并添加了一个新的武器:弓。在天上飞的,用弓才酷嘛,弓的武器属性均记录在Config.xml配置文件中,其中有两个参数非常关键:AttackRange和LongDistanceAttack分别代表攻击距离和是否远程物理攻击。另外,由于主角的素材来源于两个不同游戏,因此大家在运行演示程序时遇到错位情况请不要见怪啦,理解原理为主:
装备弓后:
嘿嘿,插上翅膀的主角此时可以进入所有示为陆地障碍物的区域了。由于弓有400的攻击射程,接下来我们不妨引上一群怪,并飞到障碍物上,一箭一箭的射得怪物们毫无脾气,陆-空不同嘛,这就是飞行的特权:
很酷吧,一丁点代码的修改就实现了这么有趣的功能。当然,在实际制作中,大家应该专门设置一个翅膀装备格,并根据需要处理好陆-空之间的障碍物逻辑与战斗逻辑,如《永恒之塔》的空战形式等。如果想制作类似《梦幻诛仙》的陆-空分层视觉效果,那么在一开始为游戏设计架构时就应该做好铺垫,否则后期修改会复杂许多。
主角装备上弓后已经具备了远距离攻击能力,细心的朋友一定有发现似乎还缺少了些什么。是的,射击后怪也伤血了,但始终都没见有箭飞出?嘿嘿,这就是下一节要讲的远距离攻击及单体魔法攻击效果了,敬请关注。
出处:http://alamiye010.cnblogs.com/
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。