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

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

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

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();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值