現在我們進行第二篇教學,有了框架我們可以自由地在屏幕上繪制我們想要的東西了。背景是用的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