C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十七)战斗前夜之构建动态障碍物系统
2010-09-30 20:47:32 来源:WEB开发网最后总结一下:以1秒为频率刷新动态障碍物在高精度需求的游戏中是不够的,往往需要设置为<=500毫秒;并且也不能太小了,过小不仅会造成过度的性能消耗;同时由于异步的原因也极其容易导致错误的障碍物识别,直接的结果就是穿越。我个人建议是在WPF中间隔设置为500毫秒,在Silverlight中间隔设置为1秒。大家在玩2D-MMORPG游戏时是否有过这样的经历:在城里人多的地方,如果游戏网速突然慢了一下或者游戏突然卡了那么一下,一不小心你的角色精灵就与其他某位玩家的角色精灵重叠在一块了,并且此游戏正常情况下是不允许重叠的(回合制游戏允许重叠,而ARPG类的是绝对不允许的)。根据本节讲解的原理我们可以很快的找出原因:在还未来得及更新出最新的动态障碍物数组前,两位角色已经跑到了当前被定义为非障碍物的坐标上。但是大家不要为此过份担心了,或者说此情况属于完全可以接受的范围中。因为由于障碍物数组的固定值部分(即固定的障碍物) FixedObstruction在游戏地图加载的时候就已经加载并固定了,意味着只要地图不更换它是不变的。所以不管处于异步处理的任何阶段,固定的障碍物如房屋啦、墙壁啦、树木啦等等之类的东西将永远无法穿越,这或许才是我们最终希望达到的目的。
这里还需要说明一下,本节构建的动态障碍物只是相对于主角的,也就是只能为主角所用。在后期加入怪物AI后,可以有两种常见的解决方案:第一种为所有怪物均使用FixedObstruction固定障碍物,这样怪物之间会发生重叠。第二种为给精灵增加一个Obstruction属性来保存相对于它们自身时时的障碍物信息,这种方式实现的结果是完美的,但过程是极其损耗空间与时间的。至于还有第三种更完美的方案吗?这是当然的,大家不妨想想,只有当精灵在移动的时候才会用得上障碍物对吧?那么我们是否只需要在每次发起移动前对全局的VaryObstruction进行拷贝,然后稍微处理一下此副本使之成为此次移动所要面对的障碍物,或许这才是最完美的解决之道。
那么来张测试图吧,此地图上随机布局了20个怪物,大家可以尝试在里面穿梭体验饶过怪物的爽快(由于怪物的图片是提取出来的,只做了稍微的加工调整,脚底并未完美的定位到中心,因此障碍物有时显得并不精确,这不是系统问题,而是图片结构引起的 ^_^):
相对于主角的完美障碍物系统总算构建完成。暴风骤雨来临的前夜,让激情燃烧我们的斗志吧,伟大的勇士!下期敬请期待。
出处:http://alamiye010.cnblogs.com/
Tags:开发 WPF Silverlight
编辑录入:爽爽 [复制链接] [打 印]- ››开发Android 日历教程
- ››开发学院总结 Win 8实用技巧大全
- ››开发学院原创教程:把win8的IE10放桌面上方法(非...
- ››silverlight全屏显示图片
- ››Silverlight MVVM 模式(一) 切近实战
- ››开发者眼中的Windows Phone和Android
- ››开发学院教你用SQL 语句最快速清空MySQL 数据表的...
- ››WPF学习笔记12. Binding (5)
- ››WPF学习笔记11. Binding (4)
- ››WPF学习笔记10. Binding (3)
- ››WPF学习笔记9. Binding (2)
- ››WPF学习笔记8. Binding
更多精彩
赞助商链接