您的位置:首页 > 移动开发 > Android开发

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

2013-09-11 00:08 621 查看
版权所有。所有权利保留。

欢迎转载,转载时请注明出处:
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息