边做游戏边学android—5(飞机大战④子弹发射和碰撞检测)
2015-05-22 00:06
441 查看
飞机是要发射子弹的,子弹也不止一种,先创建子弹的基类。代码如下:
再创建子弹类:
子弹是在飞机里发射出来的,修改一下myplane的代码。修改后如下:
当然也还要在mianview里初始化视图和draw里加上创建子弹的代码。修改之后的代码如下:
游戏运行截图:
再加上游戏分数。主界面,和游戏结束界面,飞机大战就基本完成了,当然,为了使游戏内容丰富一点,也可以添加多种子弹和敌机。然后还有游戏里添加物品。
package com.example.object; import android.content.res.Resources; import android.graphics.Canvas; public class Bullet extends GameObject { protected int harm; public Bullet(Resources resources) { super(resources); // TODO Auto-generated constructor stub } @Override protected void initBitmap() { // TODO Auto-generated method stub } @Override public void drawSelf(Canvas canvas) { // TODO Auto-generated method stub } @Override public void release() { // TODO Auto-generated method stub } public boolean isCollide(GameObject obj) { if(object_x + object_width <= obj.getObject_x()){ return false; } else if(obj.getObject_x() + obj.getObject_width() <= object_x){ return false; } else if(object_y + object_height <= obj.getObject_y()){ return false; } else if(obj.getObject_y() + obj.getObject_height() <=object_y){ return false; } return true; } public int getHarm() { return harm; } public void setHarm(int harm) { this.harm = harm; } }
再创建子弹类:
package com.example.object; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import com.example.planewars.R; public class MyBullet extends Bullet { private Bitmap bullet; private int sum=3; private int current=0; public MyBullet(Resources resources) { super(resources); // TODO Auto-generated constructor stub initBitmap(); this.harm =1; } public void initial(int arg0,float arg1,float arg2) { if(current< sum){ isAlive = true; speed = 10; object_x = arg1 - object_width/2; object_y = arg2 - object_height; current++; } } public void initBitmap(){ bullet = BitmapFactory.decodeResource(resources, R.drawable.bullet); object_width = bullet.getWidth(); object_height = bullet.getHeight(); } public void drawSelf(Canvas canvas){ if(isAlive){ canvas.save(); canvas.clipRect(object_x, object_y, object_x + object_width, object_y + object_height); canvas.drawBitmap(bullet, object_x, object_y,paint); canvas.restore(); logic(); } } public void release(){ if(!bullet.isRecycled()){ bullet.recycle(); } } public void logic(){ // if(object_y >=0) { // object_y -= speed; // } else { // isAlive = false; // } object_y -= speed; } public boolean isCollide(GameObject obj){ return super.isCollide(obj); } }
子弹是在飞机里发射出来的,修改一下myplane的代码。修改后如下:
package com.example.object; import java.util.ArrayList; import java.util.List; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import com.example.planewars.R; import com.example.view.MainView; import com.example.factory.GameObjectFactory; import com.example.interfaces.IMyPlane; public class MyPlane extends GameObject implements IMyPlane { private float middle_x; private float middle_y; private Bitmap myplane; private Bitmap myplaneexplosion; private MainView mainView; private GameObjectFactory factory; private List<Bullet> bullets; private Bitmap bullet; public MyPlane(Resources resources) { super(resources); // TODO Auto-generated constructor stub initBitmap(); factory = new GameObjectFactory(); bullets = new ArrayList<Bullet>(); //createBullet(); this.speed = 8; } public void setMainView(MainView mainView) { this.mainView = mainView; } public void setScreenWH(float screen_width, float screen_height) { super.setScreenWH(screen_width, screen_height); object_x = screen_width/2 - object_width/2; object_y = screen_height - object_height; middle_x = object_x + object_width/2; middle_y = object_y + object_height/2; } @Override protected void initBitmap() { // TODO Auto-generated method stub myplane = BitmapFactory.decodeResource(resources, R.drawable.myplane); myplaneexplosion = BitmapFactory.decodeResource(resources, R.drawable.myplaneexplosion); object_width = myplane.getWidth()/2; object_height = myplane.getHeight(); } @Override public void drawSelf(Canvas canvas) { // TODO Auto-generated method stub if(isAlive){ int x = (int) (currentFrame * object_width); canvas.save(); canvas.clipRect(object_x, object_y,object_x + object_width, object_y + object_height); canvas.drawBitmap(myplane, object_x -x, object_y, paint); canvas.restore(); currentFrame++; if(currentFrame >= 2){ currentFrame = 0; } } else { int x = (int) (currentFrame * object_width); canvas.save(); canvas.clipRect(object_x, object_y,object_x + object_width, object_y + object_height); canvas.drawBitmap(myplaneexplosion, object_x -x, object_y, paint); canvas.restore(); currentFrame++; if(currentFrame >= 2){ currentFrame = 1; } } } public void shoot(Canvas canvas,List<EnemyPlane> planes){ for(Bullet obj:bullets){ if(obj.isAlive()){ for(EnemyPlane pobj:planes){ if(pobj.isCanCollide()){ if(obj.isCollide(pobj)){ pobj.attacked(obj.getHarm()); } } } obj.drawSelf(canvas); // bullet = BitmapFactory.decodeResource(resources, R.drawable.bullet); // canvas.save(); // canvas.clipRect(object_x, object_y, object_x + object_width, object_y + object_height); // canvas.drawBitmap(bullet, object_x, object_y,paint); // canvas.restore(); } } } public void createBullet(){ for(int i=0;i<5;i++){ MyBullet bullet =(MyBullet) factory.createBullet(resources); bullets.add(bullet); } } public void initBullet(){ for(Bullet obj:bullets){ // if(obj.isAlive()){ obj.initial(0, middle_x, middle_y); // break; // } } } public void isBulletoverTime(){ createBullet(); } @Override public void release() { // TODO Auto-generated method stub if(!myplane.isRecycled()){ myplane.recycle(); } if(!myplaneexplosion.isRecycled()){ myplaneexplosion.recycle(); } } public float getMiddle_x() { return middle_x; } public void setMiddle_x(float middle_x) { this.middle_x = middle_x; this.object_x = middle_x - object_width/2; } public float getMiddle_y() { return middle_y; } public void setMiddle_y(float middle_y) { this.middle_y = middle_y; this.object_y = middle_y - object_height/2; } }
当然也还要在mianview里初始化视图和draw里加上创建子弹的代码。修改之后的代码如下:
public void initObject(){ myPlane.isBulletoverTime(); myPlane.initBullet(); for(EnemyPlane obj:enemyPlanes){ if(obj instanceof SmallPlane){ obj.initial(speedTime, 0, 0); continue; } } } public void release(){ for(GameObject obj:enemyPlanes){ obj.release(); } myPlane.release(); } public void drawSelf(){ try{ canvas = sfh.lockCanvas(); canvas.drawColor(Color.WHITE); //canvas.scale(scalex, scaley, 0, 0); myPlane.drawSelf(canvas); myPlane.shoot(canvas, enemyPlanes); for(EnemyPlane obj:enemyPlanes){ obj.drawSelf(canvas); if(obj.isCanCollide() && myPlane.isAlive()){ if(obj.isCollide(myPlane)){ myPlane.setAlive(false); } } } } catch(Exception err){ err.printStackTrace(); }finally{ if(canvas != null); sfh.unlockCanvasAndPost(canvas); } }
游戏运行截图:
再加上游戏分数。主界面,和游戏结束界面,飞机大战就基本完成了,当然,为了使游戏内容丰富一点,也可以添加多种子弹和敌机。然后还有游戏里添加物品。
相关文章推荐
- 边做游戏边学android—4(飞机大战③添加敌机和碰撞检测)
- [cocos2d-x][游戏开发]通过cocos2d-x实现简易飞机大战 08.游戏界面 碰撞检测
- Android游戏开发之检测游戏碰撞的原理实现(九)
- unity之飞机大战和碰撞检测、射线
- 飞机游戏移动和发射子弹的小模型
- Android 游戏检测碰撞方法
- Android游戏开发之检测游戏碰撞的原理实现(九)
- Android游戏开发基础part7--碰撞检测
- cocos2d-x入门(4)-英雄发射子弹和碰撞检测
- Android 游戏检测碰撞方法:多种检测碰撞的定义及说明
- Android游戏开发基础part7--碰撞检测
- android 游戏 碰撞检测
- android 3D 游戏实现之简单碰撞检测
- 边做游戏边学android—3(飞机大战②飞机移动)
- pygame编写飞机大战(8)-碰撞检测
- 【移动开发】Android游戏开发SurfaceView应用----手指发动小球(小球碰撞检测例子)
- android游戏物理引擎开发——碰撞检测(三)
- Android游戏开发基础part7--碰撞检测
- Android游戏开发---碰撞检测
- 【Unity3D】枪战游戏—发射子弹、射线检测