坦克大战-BOSS归来 上麻球了

用我蹩脚的英文写了点说明,为了将游戏推向全球。。。

Like your old friend, you must very familiar with BattleCity. This version is improved and add many special features such as enemies can eat bonus, boss tank(invisibility or home attacker or player attacker…) You’ll get more fun in the game, don’t hesitate, come to fight!

点击进入

发表在 游戏 | 4 条评论

核心玩法开发告一段落

历时两个月,终于将游戏的核心玩法基本功能开发完成了。差不多C++写了一个月,FLASH也写了一个月。参考成熟的服务器框架对传输数据流进行了重构,新增了游戏大厅与开房间等一些基本功能。优化了一些判定算法,实现了客户端与服务端的同步。先透露一点核心玩法的功能:

1.单机模式

实现怀旧版坦克大战的所有基本功能,特别加入:

a. 智能坦克(专打老家,专打玩家,隐身)

b. 敌人可以吃BONUS

c. 地图编辑器,可玩自己编辑的关卡,可上传关卡。


2.联机模式

大地图上坦克一同进行PK,左键开炮,右键行走,一个房间最多支持6个玩家

a. 自由模式,各自为战

b. PK模式,加入”老家”概念,可以2V2V2,坦克生命数用完或者老家被击破都算输

c. 坦克生命数为0后进入幽灵模式,行走速度减半,可以吃BONUS复活.

d. 拥有地图编辑器

明天去ChinaJoy了,后天我会将游戏放到外网服务器进行测试。下周开始加公共系统。

一直觉得自己比时代慢半拍,很多人都开始用微博了,我却对这个不感兴趣。。

最近在研究手机游戏开发,主要是android和iphone的,同道中人有兴趣一起探讨探讨。

发表在 管理 | 一条评论

耐住寂寞,全力冲刺

从5月20日开发至今已有50天了,实际工作日也就40天最多了,前阵子还在怀旧10年前的一款日系回合制游戏《魔力宝贝》浪费了不少时间。昨天吃坏肚子一晚难以入眠,索性起来写写计划。

目前的进度与初期制定的计划有些出入,基本都在开发游戏的核心玩法,而玩法也从原先的一种玩法扩展到单机及联机两种模式。核心玩法的底层已经完成了,也攻克了一个又一个难关,有C++的,有FLASH的。有关于实时性问题的,也有关于C++及FLASH性能的。总之,目前来说还是比较满意的。特别最近随着玩法的不断扩展,新的点子层出不穷,每天都能想到新的东西,然后立即加入进行测试。

目前为止,我都是一个人在战斗。所有的图片都是网上找的(各种盗版。。。)。我还没让我的兄弟开始帮我进行美术创作,这主要是由于之前做项目经理,了解美术随着策划以及技术不断修改直到禅灯枯尽的痛苦,也了解美术创作的艰辛,所以还是尽可能希望美术可以晚些加入战局以减少返工。

不过我越来越想要一名策划,帮我设计一些游戏关卡或者提出一些合理的修改建议,总担心自己毕竟花了大量时间来进行开发,策划出来的游戏未必可以融入市场。

估计这个月底前对游戏进行全面测试,希望一切顺利。


发表在 心情 | 一条评论

AS3内存释放、对象清理的一些心得

最近在优化FLASH,各种释放各种清理,以前也整理过。写出来供大家参考。

内存管理方面:

1.引用计数清零,AS3除了基本数据类型,其他都是引用的

2.removeEventListener调用,或者用事件弱引用 useWeakRefrence:Boolean = true

4.侦听REMOVED_FROM_STAGE事件(不冒泡)或REMOVED事件(冒泡),相当于写析构函数

5.flash.utils.Dictionary弱引用

6.Timer对象一定要进行停止

7.强制GC进行一次完整清扫

对象清理方面:

1.推迟实例化和模块化

2.自定义组件,尽可能,其他组件会包含许多你不需要的功能

3.释放不再使用的对象

a.哪里创建哪里释放(即哪里NEW,哪里释放,如果NEW的变量作为临时变量传给一个对象方法,那就在那个方法里释放)

b.释放方式为 *** = null;

c.释放外部加载对象先要 unloadAndStop

d.清楚对象被谁引用,释放时删除所有的引用才有效

e.bitmapdata先dispose()一下,这个是吃内存大户

4.使用产生对象数量最少的实现方式。例如,复杂的拼接字符串使用 ByteArray

5.重复使用的对象建立对象缓存,不要每次都创建新的

6.不使用框架,或者说写自己的框架,适合自己项目的

阅读unloadAndStop函数的说明可以学习一下清理对象的一点经验:

他可以对子swf:

停止声音。

删除舞台事件侦听器。

删除 enterFrame、frameConstructed、exitFrame、activate 和 deactivate 的事件侦听器。

停止计时器。

断开摄像头和麦克风实例

停止影片剪辑。

内存监控工具:

flash builder profile

System.totalMemory

 

最后送上《Essential.ActionScript.3.0》中对于对象清理的总结:

  • Unregister the object’s methods for events
  • Stop all timers and intervals
  • Stop the playhead of timelines (for instances of movie clips created in the Flash authoring tool)
  • Deactivate any objects that would become unreachable if the object, itself, became unreachable
发表在 技术 | 一条评论

关于JAVA转码C++的一些建议

最近写C++服务端,参考了不少JAVA代码(貌似很不通顺)。。。有些不错的就录用了,在转码过程中积累了一些心得。

在网上你可以搜到一篇《从Java到C++ 对比Java与C++编程的不同》,这篇文章写的很不错,给了我不少启发。我就整理下重点吧。再插一句,JAVA和AS3真是一对双胞胎啊,太像了太像了。

1. 当对象作为函数参数传递时,C++会进行对象的COPY,而JAVA则传的是对象的引用,所以转码时,C++就要加上&。

2. “Foo a;” 在JAVA中,只是声明了a为对象Foo类的引用,没有初始化。在C++中就算是一个对象了,而且调用了缺省的构造函数。所以在JAVA中会有 “a != null” 这样的语句来判断a是否被初始化了,而在C++中,你就需要用到指针了。当然,在判断是否初始化(或者说正确的初始化)这个步骤上,我建议自己定义一个是否初始化的变量来进行判断。

3. JAVA有自动的垃圾回收机制,一个对象只要没有引用指向它了,就会被自动回收。所以JAVA何时何地都可以new一个新的对象出来,而不必操心何时去释放它。C++中,尽量避免使用new吧,否则记得一定要在适当的地方delete。否则内存泄露。当然,你还可以选择boost的智能指针。事实上,我认为这是一个不错的选择。

其他一些语法上的区别我就不多说了,想到再补充。

发表在 技术 | 留下评论

FLASH捕获右键点击功能

今天写游戏的操作呢,鼠标左键发射子弹,按住CTRL再按鼠标左键进行移动。突然蹦出一个IDEA,为什么不能点击鼠标右键进行移动呢?

之前做过这样的尝试,主要有两种办法,一是修改FLASH右键点击的事件流,较复杂。二则是通过JS来实现这个功能。简单来说就是用JS屏蔽鼠标右键,然后由JS捕获鼠标的右键点击,再通过JS与FLASH的交互,即ExternalInterface,来实现伪FLASH右键点击功能。

网上有位朋友仿造GOOGLE工程师写的swfobject.js 改写了一下,称为UxSwfObject.js , 需要的朋友自己搜一下或者留言我发给你。试用了一下觉得不错,推荐给大家。

写法与swfobject的用法差不多,很容易入手。类似:

SwfObject.embedSWF(“RightClick.swf”, “KK”, 560, 420, “9.0.0″,”expressInstall.swf”,null,null,null,null,”rightClick”);

也就最后多加了个FLASH通信的函数名参数,我用FF和IE测试都没问题,用CHROME发现有些小问题,导致embedSWF函数无法启用。

用CHROME的调试工具看了下,只要把其中一行

else if(window.openDatabase){safari=Mua.match(/version\/([\d.]+)/)[1];}

注释掉就行了,很简单吧。

享受使用FLASH右键的乐趣吧~

发表在 技术 | 5 条评论

用FLASH实现多人即时战斗游戏的想法(模拟坦克大战)

目标:

  1. 实现儿时的红白机游戏坦克大战操作的那种爽快感
  2. 实现两人(多人)在不同的电脑上进行战斗操作(移动及发射子弹)的同步,非局域网

即时战斗游戏需要大量的CS交互,这会大大增加服务器开销成本。而这类游戏又无法用P2P实现,在关键点,比如子弹击中的那一刻,各自客户端的判定会有误差。

以下是我的思考过程:

首先我将用户操作的爽快感放在第一位,这就涉及到我必须在用户按下按键的第一时间执行坦克的移动及发射,而坦克大战这款游戏,大家知道有时候最爽的就是开墙,也就是对着砖头墙一边扫一边走。有时候又会与对方的多部坦克进行拼子弹的行为。类似速率极高的行为,如果进行服务器同步呢?如果设定每颗子弹必须相隔0.5秒或1秒发出,这就不是坦克大战了,因为用户玩的不爽!

这确实是一个难题,我参考了很多资料也一无所获,我还特地研究了目前已经在运营的坦克大战ONLINE,游戏画面很不错,功能也很完整,但是玩家不多,聊天频道半天没人说话。我进去体验了几把战斗,我认为最大的问题还在于战斗的流畅性及爽快感(当然,这是与红白机的坦克大战比较的)。游戏中坦克总是慢慢的移动、子弹也有一定的间隔发射时间。调转方向的时候会有转弯的动画播放,此时会停顿。而红白机上的就直接转过去开始移动了。可以看出这很多设定都是为了实现服务器同步以及考虑到服务器成本而做的让步。游戏开发人员不会允许你每几十微秒就向服务器发送信息,然后服务器又会每几十微秒向所有的参与的客户端发送信息(包括其他玩家的信息以及NPC坦克的信息)。这样可以实现游戏的流畅性,可是服务器会很快崩溃的不是么。除非你有雄厚的资金。

需要尽量的减少CS的交互,需要做很多妥协。可是我不想让玩家感觉到停顿和不流畅。我就是要实现红白机上坦克大战的效果。

就移动问题来说,玩家坦克的移动在单机游戏中是每帧进行更新的,就我正在测试的游戏地图来说,移动速度为2,即每帧移动2个像素。我尝试过设置最小的一次移动距离为20像素,这样在我进行一次移动操作后,其他玩家有时间可以收到我的移动请求,并在本地客户端中做延时隐藏(不展开),以保证所有玩家客户端上的画面保持同步。但测试后,发现这样做,玩家操作不爽。砍掉。

然后我做了妥协,玩家本地还是以帧频来更新移动,与服务器的同步采用IAMHERE方法,即每隔0.5秒向服务器发送坦克位置信息。这样另一个玩家收到你的信息一定会有至少0.5秒的滞后,但是这是副本游戏,不是对战游戏,我假定他不CARE.

敌方坦克的移动,采用之前的方法,设定最小移动距离,由服务器每0.25秒广播给参与玩家,但这样服务器发送的数据量还是很大啊。我甚至考虑过敌方坦克的AI放在客户端上,不考虑玩家的作弊问题,然后由服务器初始化敌方坦克的AI随机量,来保证参与玩家画面的同步,但是FLASH游戏,每人帧速有快有慢,这始终无法保持双方画面的同步,更别提加上子弹发射了。

再考虑子弹的发射,我发觉越来越接近无解了。这个发射间隔定在什么时候好呢?另外,对于摧毁建筑物的判定是由服务器来判定还是由客户端来判定呢?正常来说,这种判定应该放在服务端,然后由服务端进行广播,可是这样开墙就不爽了!会停顿。

继续聊子弹,就玩家坦克来说,应该只要有发射就立即通知服务器,让服务器广播给所有参与者。可是玩家在开墙的时候,子弹发射的速率接近“光速“啊。。。这是要让我刷爆服务器么,所以我考虑子弹发射以及打掉建筑物的判定由客户端判定(作弊者就先不考虑了),然后每隔0.25秒,将玩家本身坦克还激活状态中的子弹和位置以及玩家本人打掉的建筑物及敌方坦克及敌方子弹信息(可以拼子弹)一起发送给服务器来同步给其他玩家。

================================================================

看到这里的童鞋不容易。。。和我一起纠结了那么久。呵呵。最终我发现,在现有服务器成本下,我无法实现最初定下的目标。我果断了改变了方案,以另一种游戏模式来进行副本及对战。纠结了3,4天,终于解脱了。

我做游戏的宗旨就是,玩家操作一定要爽,这放在首位。

如果有哪位高人有办法实现我的原定目标,请给予指点,不胜感激!也欢迎各位进行讨论。

发表在 技术 | 10 条评论

白天不懂夜的黑

封闭开发到今天已经六天了,发现我订的计划真的把自己当畜生用了。经常做着做着就到一两点了。一切都算顺利,至今一直紧跟计划。将FLASH PHP 和 C++框架都整合完毕了。不过今天有点悲剧了,看样子是无法按时完成游戏核心玩法的服务器部分了。客户端部分倒搞定了。这C++有大半年没写了,生啊。。。只得把标准库和BOOST又翻了一遍。但是写着写着就出语法错误,脑子还在AS3语法上。。。

这一个人开发游戏还真不容易啊,要将多种开发语言融会贯通,学尽天下武术。复杂的还是C++啊,AS3和PHP都是脚本语言,写起来不用考虑很多性能问题,许多方法也已经封装好了。C++就是跟内存打交道。

小小抱怨一下,看来这个星期日是泡汤了。

发表在 心情 | 2 条评论

游戏开发计划制定

有点惭愧,前期一直在做游戏设计、技术实现评估以及为自己充电,至今未写一行代码。

今天起正式进入封闭开发状态。昨天连夜用Microsoft Project制订了工作计划,与大家分享。

项目虽小,五脏俱全啊。一个完整的网页游戏不外乎这些系统。有许多系统其实是游戏所共有的,我称为公共系统。我的目标是让制作网页游戏尽可能简单化,公共系统提供给外部合适的接口进行调用。因此只要有第一款的基础,之后的网页游戏只要专注于开发核心系统,再进行换肤工作就行了。

我的计划中将开发大体分为三个阶段,M1~M3。

=====================================================

M1阶段,也就是本月,主要实现游戏核心玩法。

实现多人联网对战,完成前端FLASH,后端PHP及C++基础架构的搭建。

=====================================================

M2阶段,也就是6月份,定位游戏的alpha1.0版本,做到游戏好玩。

需要实现:

  1. 玩家基础属性
  2. 游戏大厅
  3. 副本模式
  4. 对战模式
  5. NPC AI
  6. 公共系统:聊天、好友、军团、装备、商城、背包、翻牌、排行

=====================================================

M3阶段定位游戏的alpha2.0版本,做到游戏可以运营

需要实现:

  1. 游戏前后端进行技术优化
  2. 实现各种特效
  3. 公共系统:邮件、帮助、新手引导、丫鬟、任务、成就、公告、寄售
  4. 运营系统:gmTools、运营后台、官网

=====================================================

目前只制订了M1及M2计划的详细时间表,M3计划届时变动调整。

进入封闭开发了,杯具啊。。。每天工作10小时,每周工作六天。除非完成当天工作,否则留下来加班。。。

之前做项目经理时对别人管手管脚,现在轮到管自己了。

所以说,出来混,总是要还的。

发表在 管理 | 4 条评论

即时战斗游戏开发的一些心得(下篇)

想做好即时战斗游戏,并提供有趣的用户体验,有一个必不可少的要素是能让一个或多个游戏对象实时运动。

如果只是单机游戏,那将没有这个烦恼。网络多人游戏因为需要处理网络延时及玩家间的同步问题,就将开发技术推向了一个新的高度。如何进行时间同步,如何隐藏网络延时(latency hiding),下面就来谈谈这两个问题。

时间同步处理

首先,我们的游戏必定是基于时间进行同步而并非帧。否则用I7的玩家就比用386的玩家有太多优势了。俗话说的好,死在技术操作上,心服口服;死在电脑配置上,死不瞑目。。。为了能让所有的客户端对当前时间达成共识,我们不能按照每个客户端自己的时间来同步,只能以统一的服务器时间来同步。又由于网络延时,所以获取的实际服务器时间应为服务器时间加上网络延时的时间。关于如何准确取得这个网络延时的时间,可以用取均值的办法。

隐藏网络延时

我们的游戏属于服务端权威型,但如果总是等到服务端相应之后再对玩家操控的角色进行移动,那将令玩家感到厌烦,大大降低游戏的体验性。所以最好的用户体验就是让客户端立即响应用户的输入。然后再进行服务端的验证(几乎都会同意)。万一服务端拒绝了运动请求,那客户端就对之前的操作进行修正,这会导致跳动发生,但这种罕见的跳动是可以接受的。总体来说,用户体验还算不错。这是对于玩家本身来说的,对于其他玩家的运动轨迹显示则可以进行预测运动判断,这需要传输玩家的矢量信息。同时在预测运动中为了避免突然变向所造成的剧烈的抖动,还需要加入平滑算法,以使对象的航向平滑的过渡到正确航向。当然,应用贝塞尔曲线是最好的方案,但所需的计算量也是最大的。

===================分割线=====================

当然,关于即时战斗游戏的开发内容远不止这些。我会在后面的开发过程中进行不断补充。

发表在 技术 | 9 条评论