現在我們進行第二篇教學,有了框架我們可以自由地在屏幕上繪制我們想要的東西了。背景是用的BackGround組件,人物和子彈,還有精靈都是用的Sprite精靈組件


GameActivity類,游戲的主Activity類,在這里繼承基類,只需要將界面替換為GameView就可以了。
package com.mocn.airBottle;
import android.R;
import android.os.Bundle;
import com.mocn.framework.BaseActivity;
import com.mocn.framework.BaseView;
/**
* 游戲的Activity類
*
* @author Administrator
*
*/
public class PlaneGameActivity extends BaseActivity {
public BaseView baseView;// 引用BaseView
public GameView gameView;// 引用GameView
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
baseView = new GameView(this);// 得到baseView對象
setContentView(baseView);;// 設置顯示界面為baseView
}
}
GameView類,游戲的主界面繪制類,在這里我們要繪制飛機和敵軍,判斷檢測子彈和敵軍的碰撞事件
package com.mocn.airBottle;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.mocn.framework.BackGroundLayer;
import com.mocn.framework.BaseView;
import com.mocn.framework.Utils;
public class GameView extends BaseView implements OnTouchListener {
BackGroundLayer backLayer;// 背景組件
Plane plane;// 飛機類
public boolean pressPlane = false;
public GameView(Context context) {
super(context);
setOnTouchListener(this);
// 繪制背景
backLayer = new BackGroundLayer(Utils.getBitmap("game/bg.png"), 800,
480);
backLayer.setPosition(0, 0);
// 繪制飛機
plane = new Plane(Utils.getBitmap("game/plane.png"), 150, 179);
plane.setPosition(40, 300);
}
@Override
public void drawSurfaceView(Canvas canvas, Paint paint) {
super.drawSurfaceView(canvas, paint);
GameData.bulletsAndEnemy();// 判斷子彈和敵軍的碰撞
GameData.createEnemy();// 創建敵軍
}
/**
* 觸摸事件執行的方法
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {// 按下執行的事件
// 按下點中飛機執行的方法
if (Utils.inRect(plane.x - plane.w / 2, plane.y - plane.h / 2,
plane.w, plane.h, event.getX(), event.getY())) {
pressPlane = true;// 將飛機可移動設置為true
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {// 拖動執行的事件
if (pressPlane) {
plane.setPosition(event.getX(), event.getY());// 將飛機的坐標設置為拖動時的坐標
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {// 釋放按鍵時執行的方法
pressPlane = false;// 將飛機可移動設置為false
}
return true;
}
}
Plane,飛機類,在飛機類中我們給它順便裝上子彈
package com.mocn.airBottle;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.mocn.framework.LayerManager;
import com.mocn.framework.Sprite;
import com.mocn.framework.Utils;
/**
* 飛機類
*
* @author Administrator
*
*/
public class Plane extends Sprite {
public int timeSpan = 1000;// 飛機的發子彈間隔時間
public long updateTime = 0;// 飛機的更新時間
public Plane(Bitmap bitmap, int w, int h) {
super(bitmap, w, h, true);
}
@Override
public void drawSelf(Canvas canvas, Paint paint) {
super.drawSelf(canvas, paint);
// 給飛機裝上子彈
if (System.currentTimeMillis() > updateTime) {
// 創建子彈
Bullet b = new Bullet(Utils.getBitmap("game/buttle.png"), 50, 50);
b.setPosition(x + w / 2, y);// 設置子彈的位置
b.setAction("bb");// 設置子彈的動作
LayerManager.insert(b, this);// 在飛機層的前面插入子彈層
GameData.bullets.add(b);// 添加一顆子彈
updateTime = System.currentTimeMillis() + timeSpan;
}
}
}
Buttle類,子彈類,在這個類中我們要設置子彈的動作和路線
package com.mocn.airBottle;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.mocn.framework.LayerManager;
import com.mocn.framework.Sprite;
/**
* 子彈類,繼承精靈類
*
* @author Administrator
*
*/
public class Bullet extends Sprite {
public int speed = 10;// 子彈的速度
public Bullet(Bitmap bitmap, int w, int h) {
super(bitmap, w, h, false);
addAction("bb", new int[] { 0, 1, 2, 3, 4, 5 }, new int[] { 50, 50, 50,
50, 50, 50 });
}
@Override
public void drawSelf(Canvas canvas, Paint paint) {
super.drawSelf(canvas, paint);
x += speed;// 讓子彈移動
// 當子彈超出屏幕移除子彈
if (x >= 800) {
LayerManager.deleteLayer(this);
GameData.bullets.remove(this);
}
}
}
Enemy類,敵軍類,在這個類中我們要給它設置動作和路線
package com.mocn.airBottle;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.mocn.framework.Sprite;
/**
* 敵軍的繪制類
*
* @author Administrator
*
*/
public class Enemy extends Sprite {
public Enemy(Bitmap bitmap, int w, int h) {
super(bitmap, w, h, true);
addAction("left", new int[] { 0, 1, 2, 3, 4 }, new int[] { 50, 50, 50,
50, 50 });// 設置動作集合
}
@Override
public void drawSelf(Canvas canvas, Paint paint) {
super.drawSelf(canvas, paint);
x -= 2;// 敵軍往左移動
}
}
最后一個,GameData類,游戲數據類,在這里我們有創建敵軍的方法和子彈和敵軍的碰撞處理
package com.mocn.airBottle;
import java.util.Vector;
import com.mocn.framework.LayerManager;
import com.mocn.framework.Utils;
/**
* 游戲數據類,用於控制敵軍的出現和子彈與敵軍的碰撞
*
* @author Administrator
*
*/
public class GameData {
public static Vector<Bullet> bullets = new Vector<Bullet>();
public static Vector<Enemy> enemys = new Vector<Enemy>();
private static long updateTime;// 設置更新時間
/**
* 創建敵軍的方法
*/
public static void createEnemy() {
if (System.currentTimeMillis() < updateTime)
return;
updateTime = System.currentTimeMillis() + 3000;// 設置更新時間,3秒出一只
// 創建敵軍
Enemy e = new Enemy(Utils.getBitmap("game/enemy.png"), 72, 69);
e.setPosition(800, (float) Math.random() * 480);// 設置敵軍的位置,x坐標固定,y坐標隨機
e.setAction("left");// 設置動作
enemys.add(e);// 在Vector中添加一個敵軍
}
/**
* 子彈和敵軍碰撞后的處理方法
*/
public static void bulletsAndEnemy() {
// 遍歷子彈和敵軍
for (int i = bullets.size() - 1; i >= 0; i--) {
Bullet b = bullets.elementAt(i);
for (int j = enemys.size() - 1; j >= 0; j--) {
Enemy e = enemys.elementAt(j);
// 調用工具類中的碰撞檢測方法
boolean t = Utils.colliseWidth(b.x - b.w / 2, b.y - b.h / 2,
b.w, b.h, e.x - e.w / 2, e.y - e.h / 2, e.w, e.h);
if (t) {
bullets.remove(b);// 移除Vector中的子彈
enemys.remove(e);// 移除Vector中的敵軍
LayerManager.deleteLayer(b);// 移除組件中的子彈
LayerManager.deleteLayer(e);// 移除組件中的敵軍
}
}
}
}
}
至此,整個游戲教學完成。
這是一個簡單的游戲,但是代碼量卻不少,特別是框架部分,但是這個框架可以說是很基礎的,但卻囊括了游戲的很多方面,如果以后有機會去游戲公司,框架部分會更復雜,現在的辛苦只是為了以后的輕松而准備,我相信,如果一個人可以克服困難,看懂它的話,那他離真正的游戲大師也差不多遠了,真正的機遇留個有准備的人!
源碼下載:
http://files.cnblogs.com/feifei1010/AirBottle2.zip
歡迎安卓開發熱愛者加入群相互交流~北京群111059554,西安群252746034,武漢群121592153
