今天看见朋友玩弹弹堂,呵呵,挺好玩个网页游戏。不过我FLASH不太会,拿着AS3看了半天越看越不太明白,感觉AS3里面的包是不是有点像VB.NET里的名空间呢,反正糊涂了,跑题,跑题。于是后来觉得写一个单机游戏没事自己玩玩也很休闲。
出处:http://www.cnblogs.com/zcsor
应该需要这么几个部分:
一、模仿真实世界的抛物运动(已完成)
1、核心元素包含这么几个方面:
Dim g As V2 = New V2(0.0F,0.0F) '重力
Dim Damping As Single = 0.0F '空气阻尼
Dim Power As Single = 0.0F '力度
Dim Wind As Single = 0.0F '风速
Dim Density As Single = 0.0F '密度
Dim timeStep As Single = 0.0F '时间步数
Dim mSize = New SizeF(0.0F,0.0F) '体积
可能没有质量让人挺纳闷的,其实质量是用体积来进行计算的,这个体积还需要冲突检测时用就这么“继承”下来了,因为有密度嘛,质量计算起来就比较容易。
2、其他元素:
这里指的就是继承自上面类(当然我只给出了定义,因为准确模拟了弹弹堂的运行效果,所以都改成0.0F了,否则被人利用外挂泛滥就没意思了)的子类进行扩展——游戏显示界面的一些换算参数,例如可以加入力度条显示与实际参与运算值的比例(K值),包括风力的K等。
3、动量作用的模拟
上面定义中含有一个时间步数,可能没做过的朋友有些费解。它是用来规定每秒计算多少次步进的,并不影响实际的游戏帧率,而是影响动量的作用。很明显,如果我们规定质量为1,很多物理学公式都得以简化,但是还是能够设定比较好的。
初始发射时,给一个冲量——瞬时动量,这样就可以让物体运动起来了,通过重力加速度和风力以及空气阻力的不断作用(都是冲量的,因为是用微积分模拟,所以持续作用变为瞬时作用,只要时间步数够小,模拟结果就够准确)就可以达到模拟真实世界抛物的效果了。其实很多游戏都是这样的,而且很简单的运动那种计算代码都是自己写的,像台球啥的,估计学编程的都做过,呵呵,反正我这业余爱好者是做过,就是简单的按步去加减翻转正负啥的。
二、游戏界面的实现(还没做)
1、像上面说的,继承模拟运动类,加入一些参数就可以完成与界面的接口了。
2、用DX来做2D应该入门水平就会……(我还没入门,都得看书,不过XNA做规范界面简单几句顶传统的DX好几十句,巨汗,就是在VB里面有些功能还用不了)实际上就是把与界面的接口类的数据图形化显示出来了。
这部分主要工作还是在于动画的制作,3DS倒是不错的选择,不过也不熟练……用图片恐怕又有点那个,待定吧。反正最近是没空,只是有个想法,突然对这个模拟真实世界2D抛物有兴趣就耗到深夜了,总算写完核心。
好了,先睡觉,明后天继续写这篇。
继续改一改。说到模拟真实世界抛物,其实很多游戏里面都用到了引擎,包括像黏黏世界这样的小游戏(POPCAP的小游戏都很好玩,有空的可以玩玩)都用了引擎。著名的引擎还是很多的,有商业的有免费的。如果要开发一个2D的,选择也很多,不过多数引擎都比较复杂包含十几个甚至有几十个类的,有一些就比较简单,三个两个类。如果没有游戏源码或者现成的代码,写类似游戏还是用一个引擎比较简单。里面各种参数包括冲突检测等都是很全面的,而且运算速度非常快。当然了,绝大多数引擎都包括了显示界面类,这也许是好事也许是坏事,要看你的需求了,你要自己写界面显示,那其他的就是多余的,给学习带来麻烦——在没有良好分离的示例代码中显示代码往往要进行繁杂的剔除,让人不爽。
今天下午和朋友谈到这个游戏的外挂很多,从封包来讲很简单,这不是我所很不擅长的,只是听朋友说看了一下;我想说一下模式识别,很久以前在CSDN的博客上写自动登录页面的一些文章时,就谈到了这个问题,但一直也没有写一写。
就从防止外挂的角度来说,谈谈一些弱点,自然也就明了了。游戏里面的数值和一些人物位置等,都可以用模式识别的方式来做。特别的,这个数据都用了深色边框,这对于熟悉传统的灰度化然后识别的朋友来说简直是易如反掌:
1、灰度化
2、创建模板
3、模板匹配
这个思路我简单的写了一下,不过模板部分耗了一些时间,手工做的一种仅四向的梯度模板,速度还可以。两个字的识别率达到97%。不怪网上有说JAVA读屏就做出很厉害的G,当然也说明了测试结束代码就删除了。
其实还有一些思路可以识别字符:
1、快速填充或边缘检索
2、分区域特征提取
这个思路也写了一下,用的快速填充然后取四象限向特征,不过效果不好,3、8易混,0、6、9有时也出问题,综合来看单字识别率仅85%,如果是双字那识别率就惨不忍睹了。
所以,要防止一些“低手”拿别人代码就拼凑出来G,这个字符边框和固定字体就要修改一下,不知道AS3动态字体怎么做,VB.NET是很简单的。就谈到这里吧。该吃饭了。