基于Android平台的星际射击游戏的设计与实现(7)
资料介绍:
}else if(msg.what == -1){
playerbgstate = -1;
playerbg.pause();
}else if(msg.what == 2){
playerbomstate =2;
playerbom.start();
}
}
};
5.2.2 游戏主界面类
游戏中的各种动画,各种特效都是在主界面类中实现,主界面类MyView.Java提供画布Canvas,游戏属性类获得Canvas,然后在各自的updateView方法中更新视图以达到图片动态变化的效果。在主界面中,实现Runnable接口,重写Run()方法,作为游戏的主线程,代码如下:
public void run() {
while (isRun) {
[资料来源:Doc163.com]
if(!ispause){
long startTime = System.currentTimeMillis();
int TIME_IN_FRAME = 30;
doSomeThing();
synchronized (sHolder) {
//拿到当前画布 然后锁定
Canvas mCanvas =sHolder.lockCanvas(null);
updataView(mCanvas);
//绘制结束后解锁显示在屏幕上 [资料来源:Doc163.com]
sHolder.unlockCanvasAndPost(mCanvas);
}
//取得更新游戏结束的时间
long endTime = System.currentTimeMillis();
//计算出游戏一次更新的毫秒数
int diffTime = (int)(endTime - startTime);
if(TIME_IN_FRAME-diffTime>0)
try {
Thread.sleep(TIME_IN_FRAME-diffTime);
[资料来源:http://Doc163.com]
} catch (InterruptedException e) {
e.printStackTrace();
}
timer++;
}
在主界面类MyView.Java中还对整个游戏所需要的图片资源进行初始化,以方便各个属性类去实例化属性对象,避免了各个属性类因多次实例化对象而重复加载图片,耗费内存和暂用cpu资源等问题。
部分代码如下:
public void InitView(){
pengzhuang[0]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.baozha));
planeBitmap[0]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.enemy2)); paodanBitmap[0]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.bullet1)); paodanBitmap[1]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.bullet4)); [资料来源:http://doc163.com]
paodanBitmap[2]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.bullet6));
paodanBitmap[3]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.bullet7));
paodanBitmap[4]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.bullet0));
paodanBitmap[5]=BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.myzd31));
}
在MyView.Java中关键是对各个属性类的逻辑处理,在LogicView()函数中,需要对飞机、子弹、道具,Boss等进行边界判断,碰撞判断等逻辑判断,对超出屏幕范围的子弹、飞机,道具等属性对象进行置空来释放内存。飞机和碰撞的特效的逻辑处理实现代码如下: