本文章屬於原創性文章,珍惜他人勞動成果,轉載請註明出處:http://www.pm-road.com/index.php/2014/11/06/157/
前言:最 近閒來無事,而且也是因爲剛接觸安卓不久,所以萌生了以後在開發web 項目的過程中同樣開發安卓手遊,因前一段時間項目需要獨立完成了一款功能型手機app ,該App比較簡單,全是按鈕操作,也就是Activity之間的相互傳值與過渡,所以對安卓的基本知識有了一定了解,在我的印象當中,感覺安卓手遊是比 較困難的,但是有困難就要克服,所以有了開發遊戲的念頭。
接着上一篇文章,框架搭建出來之後,我們把代碼寫一下:
以下是:框架:
按照思路先把Root代碼寫出來:
package com.pm_road.fireair.bean;
/**
*
* @ClassName: Root
* @Description: 所有實體類的父類
* @author liPeng
* @date 2014-11-5 上午10:20:19
*
*/
public class Root {
protected float x;// 位置x
protected float y;// 位置y
protected int srcPic;// 圖標指向
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public int getSrcPic() {
return srcPic;
}
public void setSrcPic(int srcPic) {
this.srcPic = srcPic;
}
}
然後把飛機的實體類代碼寫出來:
package com.pm_road.fireair.bean;
/**
*
* @ClassName: Plane
* @Description: 飛機
* @author lipeng
* @date 2014-11-5 上午10:03:50
*
*/
public class Plane extends Root {
protected int life;// 生命
protected boolean shot;// 是否發射
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
public boolean isShot() {
return shot;
}
public void setShot(boolean shot) {
this.shot = shot;
}
}
接下來是你控制的飛機(實體類裏沒有任何代碼,主要原因是繼承的原因,寫這樣一個實體類,主要原因是用於區別敵機):
package com.pm_road.fireair.bean;
/**
* 控制的戰機
* @ClassName: YourPlane
* @Description: 你的戰機,繼承飛機
* @author lipeng
* @date 2014-11-5 上午10:21:02
*
*/
public class YourPlane extends Plane{
}
敵機實體類代碼:(裏面也沒有任何代碼,主要原因是繼承了plane,區別你控制的飛機)
package com.pm_road.fireair.bean;
/**
*
* @ClassName: EnemyPlane
* @Description: 敵機
* @author lipeng
* @date 2014-11-5 上午10:22:57
*
*/
public class EnemyPlane extends Plane{
}
飛機的子彈實體類:
package com.pm_road.fireair.bean;
/**
*
* @ClassName: Bullet
* @Description: 子彈
* @author liPeng
* @date 2014-11-5 上午10:24:48
*
*/
public class Bullet extends Root{
private boolean fly;//是否飛行
public boolean isFly() {
return fly;
}
public void setFly(boolean fly) {
this.fly = fly;
}
}
實體類寫完之後:我們開始寫相應的線程代碼:首先是PlaneRunnable 線程,而在此線程中:飛機會發射子彈,在發射子彈的時候,會再起一個子彈線程BulletRunnable
package com.pm_road.fireair.thread;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.util.Log;
import android.view.SurfaceHolder;
import android.widget.ImageButton;
import com.pm_road.fireair.bean.Bullet;
import com.pm_road.fireair.bean.Plane;
import com.pm_road.fireair.common.CommonUtil;
/**
* 飛機線程
*
* @ClassName: PlaneThread
* @Description: 飛機線程
* @author lipeng
* @date 2014-11-5 上午10:27:40
*
*/
public class PlaneRunnable implements Runnable {
private Plane plane;// 此線程中的飛機
private Context context;// 上下文
private SurfaceHolder holder;
private ImageButton planeImg;// 飛機的圖片
private int planeHalfWidth;//飛機寬度一半,美化射擊效果
/**
* 構造方法
*
* @param context
*/
public PlaneRunnable(Context context, SurfaceHolder holder) {
super();
this.context = context;
this.holder = holder;
}
@Override
public void run() {
Canvas canvas = null;
while (plane.isShot()) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
Log.i(CommonUtil.THREAD_TAG, plane.getX()+”:”+plane.getY());
canvas.drawText(CommonUtil.BULLET, plane.getX() + planeHalfWidth, plane.getY(), paint);
holder.unlockCanvasAndPost(canvas);
//發射一個子彈
shotOneBullet();
Log.i(CommonUtil.THREAD_TAG, “plane射擊狀態爲true”);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.i(CommonUtil.THREAD_TAG, “plane停止射擊”);
}
/**
* 發射一枚子彈
*/
private void shotOneBullet(){
Bullet bullet = new Bullet();
bullet.setX(plane.getX()+planeHalfWidth);
bullet.setY(plane.getY());
bullet.setFly(true);//飛行中
BulletRunnable bulletRunnable = new BulletRunnable(context,holder);
//子彈裝進線程
bulletRunnable.setBullet(bullet);
//子彈開始飛行
new Thread(bulletRunnable).start();
}
public Plane getPlane() {
return plane;
}
public void setPlane(Plane plane) {
this.plane = plane;
}
public ImageButton getPlaneImg() {
return planeImg;
}
public void setPlaneImg(ImageButton planeImg) {
this.planeImg = planeImg;
planeHalfWidth = planeImg.getWidth() / 2;
}
}
下面是BulletRunnable 的代碼:,爲了美化一個效果,所以當子彈沒有碰到任何東西,飛出屏幕邊界的時候,在屏幕邊緣要進行爆炸,爆炸線程:BoomRunnable
package com.pm_road.fireair.thread;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.util.Log;
import android.view.SurfaceHolder;
import com.pm_road.fireair.bean.Bullet;
import com.pm_road.fireair.common.CommonUtil;
/**
* 子彈線程
*
* @ClassName: BulletRunnable
* @Description: 子彈線程
* @author lipeng
* @date 2014-11-5 上午10:33:19
*
*/
public class BulletRunnable implements Runnable {
private Bullet bullet;//當前的子彈
private Context context;//上下文
private SurfaceHolder holder;
public BulletRunnable(Context context,SurfaceHolder holder) {
super();
this.context = context;
this.holder = holder;
}
@Override
public void run() {
Canvas canvas = null;
while(bullet.isFly()){
canvas = holder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawText(CommonUtil.BULLET, bullet.getX(), bullet.getY()-70, paint);
holder.unlockCanvasAndPost(canvas);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
bullet.setY(bullet.getY() -70);
if(bullet.getY() <= 0){
//如果當前線程的Y超過了屏幕,則將該線程回收
bullet.setFly(false);
//爆炸效果
boom();
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(CommonUtil.THREAD_TAG, “子彈飛行中”);
}
Log.i(CommonUtil.THREAD_TAG, “子彈線程結束”);
}
/**
* 爆炸效果
*/
private void boom(){
//聲明爆炸效果
BoomRunnable boomRunnable = new BoomRunnable(context, holder);
boomRunnable.setBullet(bullet);
//爆炸
new Thread(boomRunnable).start();
}
public Bullet getBullet() {
return bullet;
}
public void setBullet(Bullet bullet) {
this.bullet = bullet;
}
}
以下是爆炸線程:BoomRunnable,該爆炸線程暫時沒有調用圖片,只是用幾根線勾勒出一個簡單效果 ,後期繼續增加:
package com.pm_road.fireair.thread;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.view.SurfaceHolder;
import com.pm_road.fireair.bean.Bullet;
/**
* 爆炸線程
*
* @ClassName: BoomRunnable
* @Description: 爆炸線程
* @author lipeng
* @date 2014-11-5 下午02:43:39
*
*/
public class BoomRunnable implements Runnable {
private Bullet bullet;// 當前的子彈
private Context context;// 上下文
private SurfaceHolder holder;
public BoomRunnable(Context context,SurfaceHolder holder) {
super();
this.context = context ;
this.holder = holder;
}
@Override
public void run() {
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
//碰撞效果
canvas.drawLine(bullet.getX()-10, 2, bullet.getX()-15, 10, paint);
canvas.drawLine(bullet.getX()-15, 10, bullet.getX()-10, 12, paint);
canvas.drawLine(bullet.getX()-10, 12, bullet.getX()-13, 20, paint);
canvas.drawLine(bullet.getX()-13, 20, bullet.getX(), 12, paint);
canvas.drawLine(bullet.getX(), 12, bullet.getX()+13, 20, paint);
canvas.drawLine(bullet.getX()+13, 20, bullet.getX()+10, 12, paint);
canvas.drawLine(bullet.getX()+10, 12, bullet.getX()+15, 10, paint);
canvas.drawLine(bullet.getX()+15, 10, bullet.getX()+10, 2, paint);
holder.unlockCanvasAndPost(canvas);
}
public Bullet getBullet() {
return bullet;
}
public void setBullet(Bullet bullet) {
this.bullet = bullet;
}
}
寫完實體類和線程之後,就應該把他和安卓的xml 進行結合。結合代碼:http://www.pm-road.com/index.php/2014/11/06/161/
本文章屬於原創性文章,珍惜他人勞動成果,轉載請註明出處:http://www.pm-road.com/index.php/2014/11/06/157/