用js重建星际争霸


Posted in Javascript onDecember 22, 2006

演示地址

    http://www.script8.com/works/sc/index.htm

 

背景介绍

对很多人来说,javaScript是一种颇为神秘的语言,这种语言由浏览器解析,可以实现很复杂的功能,但在实际中又使用甚少。在以相对定位为基础的网站体系中,js并不是必不可少的,最早的浏览器并不支持js,只需使用纯静态的html,也能建立功能完备的网站。对于页面开发人员来说,使用js的时候估计也就是用于数据合法性检查而已。近年来,随着ajax概念崛起,js的使用有所增加,不过除了web邮箱等少数工具型的网站之外,其作用仍然是辅助性的。

实际上,js作为最流行的脚本语言,功能是非常强大的,笔者就曾经利用js来模拟星际争霸。大家都知道,星际争霸是即时战略游戏史上的里程碑,在玩家心目中的地位是不言而喻的,泡在各种各样的网吧里玩星际曾经是笔者生活的一部分。仅凭一腔热血,我就着手用js来开发星际,这是一次坚难的历程,充满了挫折,也享受到了乐趣,最后能够完成,却是开始时我也没有奢望到的。

js星际源码最早发布于无忧脚本的论坛里,得到了很多网友的好评,让我感动之余,也唯有更加努力。通过这次开发,我的js开发技术有了很多提高,还认识了许多喜欢js开发的朋友,幸哉!js星际现在的存放地址是http://www.script8.com/works/sc/index.htm,有兴趣的朋友欢迎参与讨论。

解决方案

寻径算法是游戏的基础,也是运算量最大的部分。我没有使用A*算法,因为对脚本来说开销太大了,而是自主开发一种新算法,称之为交点法,特点是线性寻径,运算量比较小,缺点是不能保证结果为最短路径。交点法的基本思路简述如下:

1.从起点到终点画直线,与障碍物相交时,总会出现对应的穿入点和穿出点。

2.从穿入点的两个方向同时绕行障碍物,选择先到达穿出点的路线作为前进路线,这样就得到了一条比较原始的路线。

3.对路线进行优化,判断两点是否形成通路,删除冗余点,得到最终的路径。

寻径时大量使用了判断是否障碍点的运算,一般的做法是遍历数组,分别比较才能得到结果。我把障碍点序列变成一个长字符串,通过字符串包含关系就可以判断出当前点是否障碍点,这样就减少了很多运算量。

js星际所实现的,相当于是星际争霸的开场部分,即采矿、制造建筑物和生产士兵,战斗部分略有涉及。在编码之前,就需要有许多准备工作,光是图片的制作就非常烦锁,需要万分的耐心才行。另外,我还用hta技术开发了一个地图编辑器,用于生成地图数据。

游戏里的控制面板比较精简,缩略地图和选择信息集成到右上角的一个小面板里,其他部分都属于游戏场景。每个移动单位有8个方向,以枪兵为例,需要用24张图片来表现站立和走动各种姿态。这些图片都集成在一张大图里,根据走动或站立情况,显示其中的对应部分,比如在走动时,判断出走动方向,一边移动枪兵位置,一边三张图片轮显,表现出走动的情形。

游戏初始化时,载入地图数据,根据不同的建筑物属性,一方面生成场景,另一方面生成障碍物列表,用于寻路之用。默认情况下,地图上有几个矿工,圈选后,点击目标可以自主行走,根据游戏要求,如果点击到的是矿石,就会在矿区和总部间来回走动,每次往返都会增加矿藏量。

至于哪一种建筑物能生产什么兵,每个兵需要多少资源,建筑物的生产顺序是什么,这些相对来说都比较容易,无非是做更多的图片处理和更多的逻辑判断而已,限于篇幅就不详细介绍了。

经验分享

不用太担心功能的实现,因为js已经非常完善了,可以随心所欲地进行各种运算,使用绝对定位的机制,可以轻松创建界面,再利用时钟模拟多线程,实时移动图片,就可以表现动画了,问题主要体现在速度和性能上。因为js作为一种脚本语言,其计算性能无疑是先天不足的,同时浏览器也不支持directX和openGL等硬加速,动画能力无法另人满意。只有通过减轻运算量,合理分配动画资源,才能保证游戏的平滑运行。js星际的开发,正是处处遵循了这个原则,能简则简,能省则省,非常节约地使用各种资源,才最终得以实现。

千万不要在游戏中使用滤镜技术,特别是动态滤镜,滤镜渲染时会占用大量的cpu,在cpu占用达到80%以上时,游戏就会感觉比较卡。这一点和flash做的同类程序有明显区别,即使cpu占用率接近100%,flash程序仍然能保持相当的平滑。

凭心而论,客户端的游戏开发,应该还是以flash为主。与之相比,js的好处是可与网站无缝连接,也不需要安装插件。当然了,只要是好玩实用的游戏,即使是用js开发的,也未尝不可。

Javascript 相关文章推荐
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
Nov 22 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
JavaScript运行时库属性一览表
Mar 14 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 Javascript
JavaScript中Function函数与Object对象的关系
Dec 17 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
Sep 20 Javascript
详解JavaScript中return的用法
May 08 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
js版本A*寻路算法
Dec 22 #Javascript
优化JavaScript脚本的性能的几个注意事项
Dec 22 #Javascript
网页设计常用的一些技巧
Dec 22 #Javascript
用JavaScript脚本实现Web页面信息交互
Dec 21 #Javascript
在 IE 中调用 javascript 打开 Excel 表
Dec 21 #Javascript
用js+xml自动生成表格的东西
Dec 21 #Javascript
FCK调用方法..
Dec 21 #Javascript
You might like
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
Keras自定义IOU方式
2020/06/10 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
德国电子商城:ComputerUniverse
2017/04/21 全球购物
教师岗位聘任书范文
2014/03/29 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
办理收楼委托书范本
2014/10/09 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
高中数学教学反思范文
2016/02/18 职场文书