面向对象法制作贪吃蛇小游戏 |
| [来源:闪吧 | 作者:ladeng6666 | 时间:2008-08-27 | 点击: | 收藏本文 【大 中 小】] |
|
这不能算是一个教程,只是我学习oop过程中的一个总结,有不对的地方,还请各位大侠多多指正!
一、面向过程的编程
如果你以前做过贪吃蛇,可以跳过这一节,直接看oop的写法。
起初的想法是:在库里有3个MC,分别是head(蛇头),body(蛇关节),wall(墙)。
游戏开始时:先载入一个head,然后有一个从1到snakeLength的for循环,载入snakeLength个body,分别命名为body1,body2…”body”+snakeLength,另外还要载入一圈围墙wall,wall的个数要视舞台的长宽而定了。
游戏进行时:head的移动通过单位改变它的坐标就可以了,这个单位也就是单位位移,即head的长宽,body的移动,可以设两个值,oldX,oldY,来记录上一个位置的坐标,作为下一个body的目标坐标,也就是,head走一步,body1走到head的old坐标,body2走到body1的old坐标…依此类推。蛇的移动,我们用setInterval来实现,因为我们可以用第二个参数来改变设的移动速度,也就可以做到level越高,速度越快,以增加游戏的难度。
这是一个很好的想法,可是在动手作的过程中,问题就暴露出来了。蛇头吃到墙和body应该是gameOver的,应该怎么实现呢?你可能会想到hitTest,好的,我们来设想一下,假设蛇头为长宽均为20个像素的正方形,舞台为400*400,那么一圈围墙将会有20+20+18+18=76个wall,再有10个body,那么蛇头没走一步,要进行这样的碰撞检测。首先是一个10次的循环hitTest(”body”+i);然后是26次循环hitTest(”wall”+i);这仅仅是只有一圈围墙的空白围墙,如果再加上一些障碍墙呢?那么很容易就能有100次以上的循环hitTest,对于现在的计算机来说,应该算不了什么,的是你怎么给他们命名呢?for循环”wall”+i?障碍物呢?障碍物的位置坐标怎么记录?另外还有一个很重要的东西,food,贪吃蛇嘛,肯定要有东西吃,检测碰撞后,我们要判断碰到的是什么,如果是food应该怎么加分,碰到wall后怎么gameOver?,游戏过关怎么更换地图?当想到这些问题的时候,你会发现,自己的代码写的乱七八糟,当你试着修改的时候,可能是牵一发而动全身。
面对这些问题,我们选择了面向对象的编程,即OOP。
二、面向对象的编程
面向对象的编程就是将head,body,map写到单独的类文件里。我们在实例化这些类的时候,就产生了对象,Movieclip就是一个类,当我们新建一个mc的时候,就是新建了一个对象,它有自己的属性和方法…闲话说多了,谈游戏。
第一步:我们不考虑怎么让head走,而是想怎么生成一个地图,贪吃蛇是一个区块游戏,所以我们把地图方到外部的文件的二维数组里,方便维护和修改,根据数组来attach库里的tile,这个数组里不同的flag值,代表不同的东西,比如:0代表空,1代表head,2代表body,3代表food,4代表wall。而库里的tile里,不同帧里有不同的东西,我们只要根据flag跳到相应的帧里就可以了,然后执行相关的加分,gameOver等操作,当蛇移动的时候,我们只需要修改目标坐标的flag值就可以了。 首先、新建地图,我们用一个Map类来完成,它应该有这样的功能: 1根据mymap数组新建地图,createMap(mymap); 2建立地图的过程中,应该能根据flag是tile跳到相应的帧,setObj(flag); 3当蛇吃到food后,能随机的生成下一个food,randomFood(); 然后、我们新建一个Body类,他的功能如下: 1跟这上自己的上一节(father),往前走,go(father); 最后、我们新建一个Head类,他是Body的子类,功能大致如下: 1自动的往前走,并返回下一目标位置的flag,以便游戏根据flag进行相应的操作,goNext(); 2根据键盘按下的key来设置速度step,setStep(key); 到这里,我们需要的类都建好了,下一步,就是在fla文件里,将他们连起来了。
第二步:
首先、我们新建一个map类,用map类的createMap方法来新建一个地图。
然后、再新建一个蛇头head,接着是一个body数组,用来存放蛇关节,数组的每个元素都是一个body类。
最后、我们就是用一个setInterval,让蛇头和body不断的移动,然后,我们就开始游戏了。
附件: oop贪吃蛇.rar
|
|
| 文章如果有错误或者缺少文件,请发邮件提交给我们 |
|
|
|
|
|
|
|
| >>> 最新评论:(共有 0 位网友发表了评论) 查看所有评论 |
|
|
| 发表评论 |
|
| ·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂 |
| ·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任 |
| ·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据 |
| ·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为 |
|