android小游戏制作心得(五)——游戏物体Body类和游戏世界World类

来源:互联网 发布:嘉兴学院网络教育 编辑:程序博客网 时间:2024/05/22 09:00

版权所有。所有权利保留。

欢迎转载,转载时请注明出处:

http://blog.csdn.net/xiaofei_it

Body是所有物体的基类,游戏物体必须从此类派生,并用label标记此派生类。当然用RTTI可以实现类似功能,但本人觉得label标记更好。

background是背景,这里可以用整数数组表示,也可以用图片数组表示。如果是整数数组,那就是R.drawble里的图片编号。

currentBackground是当前的背景,表示方法和上面一致。

position和speed是物体的位置和速度,一般是二维向量,这里为了简便,用int表示。对于静止的物体,该项可忽略,并且move方法要改为空。

当然,还可以加入加速度。

changeBackground是根据需要改变背景,如果不需要,则不用改写。

很多方法都要在实际应用中进行重写。

这个类的很多方法是很重要的,在很多地方调用。举例说一下:

上一章所讲的绘图线程就是要获取游戏世界World的迭代器,然后读取每个物体,调用getPosition方法获取位置,调用getCurrentBackground获取背景,然后进行绘制。

移动物体线程就是调用游戏世界world的move函数。而该move函数的实现是获取迭代器,然后读取每个物体,调用物体的move函数。

另外,游戏物体绝对不能自己构造,必须通过游戏世界World生成。这样可以统一管理。

public class Body{public final int label;protected final int background[];protected int currentBackground;protected int position,speed;public Body(int l,int b[],int cb,int p,int s){label=l;background=b;currentBackground=cb;position=p;speed=s;}public int getCurrentBackground(){return currentBackground;}public void setCurrentBackground(){}public int getPosition(){return position;}public void setPosition(){}public int getSpeed(){return speed;}public void setSpeed(){}protected void changeBackground(){}public void move(int time){changeBackground();position=position+time*speed;}}

游戏世界World保存每个游戏物体,并且控制物体移动。

该类是一个Singleton,必须通过getInstance获取实例。

它将游戏物体保存在一个并发双链表内,该链表有多种实现,这里就不给出了。

注意,在链表内要加上一个内部类Iterator作为迭代器。

move函数实现时就要使用该迭代器,获取每个物体,然后执行移动操作。

addBody是创建Body的线程,这是一个工厂方法。在程序其他地方,禁止生成Body。

getIterator是为了画图、最后保存游戏进度等情况下对游戏世界中的物体进行访问的。调用这个函数获取迭代器后,绝对不能对游戏世界的物体进行更改。

只有游戏世界对象才能直接对游戏物体进行更改。

因此可以模仿C++的STL库的vector::const_iterator那样做另一个迭代器供外部调用。

public class World{private DoubleLinkedList dll;private static World instance=null;private World(){dll=new DoubleLinkedList();}public static World getInstance(){if (instance==null)instance=new World();return instance;}public void move(int time){DoubleLinkedList.Iterator iter=dll.getIterator();iter.moveToBeginning();while (!iter.isEnd()){Body body=iter.getBody();body.move(time);iter.moveToNext();}}public void addBody(int label,int p,int s){通过label的不同创建不同的Body子类,添加到链表中。}public void deleteBody(Body b){}public DoubleLinkedList.Iterator getIterator(){return dll.getIterator();}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 18个月宝宝上火怎么办 打孩子越打上瘾怎么办 八个月不想要了怎么办 胎儿心脏畸形肺动脉瓣闭锁怎么办 小孩爱动怎么办补什么 初中孩子下午上课总犯困怎么办 孩子上课精神不集中怎么办 孩子玩兴奋了就打人怎么办 婴儿兴奋白天不睡觉怎么办 小孩读书精神不集中怎么办 小孩上课精神不集中怎么办 小孩学习精神不集中怎么办 孩子暑假天天看电视不出门怎么办 七个月宝宝缺铁怎么办 天天运动为什么还便秘怎么办 小孩学习注意力不集中怎么办 8个月宝贝太好动怎么办 学生在校受伤家长该怎么办 多动症小孩爱动手指怎么办 孩子大了不听话该怎么办 流产后吹了风怎么办 怀孕1周内喝酒了怎么办 怀孕6周喝酒了怎么办 怀孕后喝了酒怎么办 不知道怀孕喝酒了怎么办 不知道怀孕了喝酒了怎么办 怀孕5天喝酒了怎么办 打孩子耳光后脸肿了怎么办 老师说上课不专心怎么办 孩子不专心好动马虎怎么办 学生上课不认真听讲怎么办 一年级孩子上课不注意听讲怎么办 一年级孩子上课说话不听课怎么办 一年级孩子上课不听课怎么办 小学一年级学生上课不专心怎么办? 小孩听课注意力不集中怎么办 小孩子上课精神不集中怎么办 孩子说我不画了怎么办 幼儿园小朋友上课不专心怎么办 孩子写作业不专心怎么办 小孩做作业不专心怎么办