Browsed by
Month: April 2006

5.1我向老板请一天假,

5.1我向老板请一天假,

老板推心置腹地 :"你想请一天假?看看你在向公司要求什么– 一年里有365天你可以工作。 一年52个星期,你已经每星期休息2天,共104天,剩下261天工作。 你每天有16小时不在工作, 掉174天,剩下87天。 每天你至少花30分钟时间上网,加起来每年23天,剩下64天。 每天午饭时间你花掉1小时,又用掉46天,还有18天。 通常你每年请2天病假,这样你 工作时间只有16天。 每年有5个节假日公司休息不上班,你只干11天。 每年公司还慷慨地给你10天假期,算下来你就工作1天,而你TMD还要请这一天假

采用Finite State Machine来解决AI的问题

采用Finite State Machine来解决AI的问题

采用Finite State Machine来解决AI的问题   首先,什么是FSM? A finite state machine is a device, or a model of a device, which has a finite number of states it can be in at any given time and can operate on input to either make transitions from one state to another or to cause an output or action to take place. A finite state machine can only be in one state at any moment in time.   接着是FSM的UML图

迟到的奖学金

迟到的奖学金

都大四下了,快毕业的人了,还能拿上一次奖学金,而且还是拿大三下学期的奖学金,真不知道是否算件喜事了。 我们学校的效率,我向来都是bs的。这次也一样,所不同的这次发生的是件好事。 也好,奖学金,奖励学习的,希望以后也能好好学习吧!

compression & path finding

compression & path finding

I.compression:Run length EncodingHuffman tress   II.path finding   1.Tile-based game random bounce method The Breadth-First Search add Heuristic (simple,complex way) to the Breadth-First Search The A* path finding   2.Line-based game Quadtresss:In a large square game world,You split that up into four squares,Then you go to each squre and split it up into another four squares.And you keep doing this over and over.This is called a quadtres. Create a quadtree out of the map so that the tree is full to a certain numberof…

Read More Read More

[转]一些手机的bug

[转]一些手机的bug

Nokia S40按键会有延迟,中断后原线程还会在后台继续运行直到调用repaint,内存开销不当会死机,其他bug尚未碰到,个人感觉应该是Nokia中Bug最少的机型啦。 Nokia 6600Nokia官方Konwn Issuse已经确认调用readFully不能按指定字节数读取,解决方法Known Issuse上有,另外一种就是用readByte代替。setClip和drawRegion搭配在欧版6600上不能正确设置裁减框,导致绘图错误,港版无此问题,解决方法自己想。 Nokia 3650和6600一样,setClip和drawRegion搭配不能正确设置裁减框。3650频繁I/O操作会死机,应尽量在游戏初始化时将数据一次读入。 Nokia NG这个型号CoCoMo最讨厌了,在背景缓冲上setClip和drawRegion搭配完全不能设置裁减框,解决方法自己想。声音播放有问题,建议在I/O操作等跟系统底层有关调用之后再播放声音,尚未解决。 Nokia 7610drawRegion在这个机型上会拖慢速度,建议使用Nokia UI API上的drawImage。绘图函数调用不当会当机。 Nokia 6681记得有篇blog写过了,其他bug尚未发现。 Moto V300屏幕大小不是176 * 208,上面多了条状态栏,烦人,其他Bug未发现,较好移植。 Moto C650字体大的吓人,setMediaTime该机型不支持,playerUpdate传过来的player是副本,所以应该用equal而不是==。 Sone K700除了屏幕220之外,最好移植的机型了,支持。 其他bug,遇到了再添

[转]3D开端 RayCasting

[转]3D开端 RayCasting

3D开端 RayCasting              很佩服卡马克,他所独立研究出的图形学算法,几乎涉及图形学这门最令我头大的学科的各个领域。是他将Wolfenstein 3D搬上了286这样老古董的机型,是他将FPS带入了我们的生活。从1992年Wolfenstein 3D发售至今10多年时间,仅凭一个人的力量就推动了图形学及计算机硬件的发展,他是美国创业梦及个人英雄主义的完美体现。   RayCasting 射线追踪       从Wolfenstein 3D到DOOM3,我又重玩了一遍,技术进步的轨迹清晰可见。卡马克是个天才,但他技术的高楼并不是凭空建立,他的聪明才智加上他的专注造就了今天的卡马克及DOOM3。追随他的足迹,我想探究天才造就的秘密,那就先从RayCasting说起吧!       在当时286 386时代,CPU速度的低下是不可能在实时的状态下运行真正的3D引擎的,RayCasting算法的出现是第一个解决之道。由于它只需要对每条垂线进行必要的计算,所以它能够运行的很快。        Wolfenstein 3D的射线追踪引擎非常的有限,所有的墙必须是相同的高度,而且在2D平面他们必须是正方形的格子。就像在Wolfenstein 3D的地图编辑器里看到的那样。        像梯子,跳跃和高度差这样的东东在这个引擎里是不被实现的。在DOOM里虽然也使用了射线追踪引擎,但是更高级一些,可以实现例如斜的墙,不同的高度,地板及天花板以及透明的墙等。游戏里人物及物品等都使用了2D的贴图,就像公告牌一样。       这里说明一下RayCasting并不是RayTracing!RayCasting是一种伪3D技术,是使得3D场景可以在比较低速的CPU上运行的一种解决办法;而RayTracing是一种真实3D场景的实时渲染技术,在真实的3D场景里他被用作映像及阴影的计算,它需要很高速的CPU才能完成计算。 主要思想:       RayCasting的主要思想是:地图是2D的正方形格子,每个正方形格子用0代表没有墙,用1 2 3等代表特定的墙,用来做纹理映射。 int worldMap[mapWidth][mapHeight]= { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1, 1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1, 1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };       从Player的位置发出一条射线,沿着Player视角的方向向前与地图Tile进行碰撞检测,当这条射线碰到了墙,记录下碰撞点跟Player的距离,使用这个距离来计算这堵墙在屏幕上应该是多高。大家都知道Player离墙越远,肯定墙就越低,反之则越高。这些只需要2D计算就可以了,下图显示了这个原理。   碰撞点的判定:     因为这条射线上有无数个点,但我们不可能取无数个点来判定是否碰到了墙,所以如何取点就变得很重要。这时候就该我们的图形学出马啦!因为碰撞点只可能在水平线上或垂直线上,所以我们可以利用DDA来做。什么,你不知道什么是DDA,还不赶快拿出图形学来狂补一下。     DDA(Digital Differential Analysis 数字微分分析法)通俗来讲就是增量计算。如下图检测点为红点:       这里就不再讲述DDA的算法啦,有兴趣的朋友可以参看图形学。      检测这些点是否碰到了墙应该是件容易的事,当发现了碰撞点,距离也就很好计算出来了吧! 定义视域?      接下来我们要定义Player的视域,也就是视野范围。首先需要定义一个Player的位置向量pos,Player的位置可以表示为(x, y),同时也可以把它看成一个2维向量,这样更方便考虑问题和计算。我们还需要定义一个Player的朝向向量dir,该向量从Player的位置出发,沿着Player所看去的方向,其长度并不重要,只要我们把该向量数乘一个标量就可以很方便的改变其长度,而方向却不变。另外我们还需要定义一个摄像机向量plane,用来代表计算机的屏幕,所以dir总是与plane相垂直并且指向屏幕的里面,如下图:       绿点代表Player的位置;黑线代表dir向量;黑点代表dir与plane的交点,所以其位置应该是dir+pos;蓝线代表全部的摄像机向量,所以plane应当从黑点开始向右到蓝点结束。所以右面的蓝点位置应该为黑点向量加上plane既pos+dir+plane,左面蓝点的位置应当为pos+dir-plane;红线代表一些射线,其向量很容易被计算:dir+部分plane。例如从左面数第三条红线,其与plane的交点在plane的1/3处,所以其向量应为dir+1/3*plane。      左右边界的红线定义了一个可视范围,所以可视范围的定义跟两个向量有关:plane和dir。如果dir的长度等于plane的长度,可视范围的角度将会是90度,如果dir的长度大于plane的长度,可视范围的角度将小于90度,这时候物体将远离我们,我们看到的物体将会变小;如果dir的长度小于plane的长度,可是范围的角度将大于90度,这时候物体将被拉进,我们看到的物体将被放大。      如果Player需要旋转的话,其摄像机向量plane及方向向量都进行了旋转,我们可以乘上下面的矩阵来做到这一点:[ cos(a)…

Read More Read More

篮球场变黄了

篮球场变黄了

今天早出门 ,发现有点不对劲,果然,调色板失调了,周围所有事物都偏黄了。 学校的橡胶篮球场,变成了黄色,非常诡异~ 原来,这就是沙尘暴,总算没有白来北京,终于有机会一瞥这传说中的景色。    

都是翻译惹的祸!

都是翻译惹的祸!

昨天和同事探讨java的封装,自认为对此概念比较了解,于是侃侃而谈,然而,同事却提出了另一个概念,讨论了半天,得不到答案,只好求助于internet。 经过一番折腾,终于知道了答案。 原来都是翻译惹的祸,原因如下(以think in java为例) 在原版书中,曾提到 Each object has its own memory made up of other objects. Put another way, you create a new kind of object by making a package containing existing objects. Thus, you can build complexity into a program while hiding it behind the simplicity of objects. 再看看翻译后的 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。 这里,封装=package   那么,在对象特性时,文章又这样解释道: Access control is often referred to as implementation hiding. Wrapping data and methods within classes in combination with implementation hiding is often called encapsulation. 这里,封装=encapsulation…

Read More Read More

开始整理一些自认为还不错的漫画书目,以后有机会再看一遍

开始整理一些自认为还不错的漫画书目,以后有机会再看一遍

七龙珠圣斗士星矢阿拉蕾孔雀王之退魔圣传电脑骑士北斗神拳强殖装甲足球小将福星小子龙珠Z幽游白书篮球飞人三X三只眼龙之迷金田一少年事件簿Touch(棒球英豪)圣子到鬼神童子地狱老师浪客剑心 寄生兽(岩明均)名侦探柯南