如何構建自己的游戲框架並且制作游戲(二)(附源碼)


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM