zoukankan      html  css  js  c++  java
  • 如何构建自己的游戏框架并且制作游戏(二)(附源码)

    现在我们进行第二篇教学,有了框架我们可以自由地在屏幕上绘制我们想要的东西了。背景是用的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);// 移除组件中的敌军
                                    }
                            }
                    }
            }
    }
    

      至此,整个游戏教学完成。
    这是一个简单的游戏,但是代码量却不少,特别是框架部分,但是这个框架可以说是很基础的,但却囊括了游戏的很多方面,如果以后有机会去游戏公司,框架部分会更复杂,现在的辛苦只是为了以后的轻松而准备,我相信,如果一个人可以克服困难,看懂它的话,那他离真正的游戏大师也差不多远了,真正的机遇留个有准备的人!

    源码下载:

     https://files.cnblogs.com/feifei1010/AirBottle2.zip

    欢迎安卓开发热爱者加入群相互交流~北京群111059554,西安群252746034,武汉群121592153

     

     

  • 相关阅读:
    用户空间与内核空间,进程上下文与中断上下文[总结]【转】
    select、poll、epoll之间的区别总结[整理]【转】
    v4l2驱动文档之——streaming IO【转】
    Linux网络编程一步一步学【转】
    V4L2驱动的移植与应用(二+三)【转】
    【PHP面向对象(OOP)编程入门教程】20.PHP5接口技术(interface)
    【PHP面向对象(OOP)编程入门教程】19.抽象方法和抽象类(abstract)
    【PHP面向对象(OOP)编程入门教程】18.__call()处理调用错误
    【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
    【PHP面向对象(OOP)编程入门教程】16.__toString()方法
  • 原文地址:https://www.cnblogs.com/feifei1010/p/2653768.html
Copyright © 2011-2022 走看看