前言:准备考研了,前段时间电脑硬盘坏了,郁闷!!!这几天学习了下不用引擎如何用java做一个小游戏。关卡和菜单什么的没做,主要做了玩起来的部分。
声明:转载请注明出处。

开发环境

  • eclipse+android4.4(测试android6.0运行也没问题)
  • 总目录如下:MainActivity.java是引导类、MainGame.java是游戏总体框架类、Hero.java是玩家的战机、Npc.java是敌人的战机、BulletHero.java和BulletNpc.java是子弹类、GameUtils.java是工具类包括常量也在里面。

框架类介绍
基本大部分游戏的运行流程都如下面框架类所示:永远是先逻辑,在绘画,如此循环而已。首先把logo、Init、Menu、都跑一边,做初始化工作。然后开始游戏后一直循环调用Deal_Paly()和Draw_Paly()。具体看源代。

package src.com;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;

/*
 * 框架类
 */
public class Game extends View implements Runnable {

    // 游戏的当前状态
    int Game_State;
    // ------------------------------------ 游戏的状态
    // 游戏的Logo 状态
    public static final int GAME_LOGO = 0X0001;
    // 游戏的加载 状态
    public static final int GAME_INIT = 0X0002;
    // 游戏的菜单 状态
    public static final int GAME_MENU = 0X0003;
    // 游戏的进行 状态
    public static final int GAME_PLAY = 0X0004;
    // 游戏的暂停 状态
    public static final int GAME_PAUSE = 0X0005;
    // 游戏的退出 状态
    public static final int GAME_EXIT = 0X0006;

    // 屏幕的宽度和高度
    int Screen_w, Screen_h;

    Paint paint;

    // 线程
    Thread thread;

    // 线程开关
    boolean isRun;

    // ----------------------------- 触屏相关

    int Point_x, Point_y;
    //判断是否触屏
    boolean isPoint;

    /**
     * 框架类的构造方法(是负责给框架类的数据做初始化用的)
     * 
     * @param context
     */
    public Game(Context context, Display display) {
        super(context);
        // ---------------- 获取当前手机的屏幕的宽度和高度
        this.Screen_w = display.getWidth();
        this.Screen_h = display.getHeight();
        // ---------------- 游戏开始时是从游戏的Logo状态开始的
        this.Game_State = GAME_LOGO;
        // ----------------
        this.paint = new Paint();
        // ---------------- 线程相关初始化
        this.isRun = true;
        this.thread = new Thread(this);
        this.thread.start();// 这行代码执行后,系统就会找run()这个方法自动执行
    }

    /**
     * 线程运行方法
     */
    public void run() {
        // 循环( 逻辑--》绘画--》时间的间隔)
        while (this.isRun) {

            // 1.逻辑
            this.Deal();
            // ----------------------
            // 2.调用总绘画
            this.postInvalidate();

            // ------------------ 3.时间的间隔(20分之一秒)
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    // -------------------------------------

    /**
     * 总绘画(画布)
     */
    public void onDraw(Canvas canvas) {
        // --------------
        switch (this.Game_State) {
        case GAME_LOGO:
            this.Draw_Logo(canvas);
            break;
        case GAME_INIT:
            this.Draw_Init(canvas);
            break;
        case GAME_MENU:
            this.Draw_Menu(canvas);
            break;
        case GAME_PLAY:
            this.Draw_Play(canvas);
            break;
        case GAME_PAUSE:
            this.Draw_Pause(canvas);
            break;
        case GAME_EXIT:
            this.Draw_Exit(canvas);
            break;
        }
    }

    /**
     * 绘画_Logo
     * 
     * @param canvas
     */
    public void Draw_Logo(Canvas canvas) {

    }

    /**
     * 绘画_Init
     * 
     * @param canvas
     */
    public void Draw_Init(Canvas canvas) {

    }

    /**
     * 绘画_Menu
     * 
     * @param canvas
     */
    public void Draw_Menu(Canvas canvas) {

    }

    /**
     * 绘画_Play
     * 
     * @param canvas
     */
    public void Draw_Play(Canvas canvas) {

    }

    /**
     * 绘画_Pause
     * 
     * @param canvas
     */
    public void Draw_Pause(Canvas canvas) {

    }

    /**
     * 绘画_Exit
     * 
     * @param canvas
     */
    public void Draw_Exit(Canvas canvas) {

    }

    /**
     * 触屏事件(系统方法)
     */
    public boolean onTouchEvent(MotionEvent me) {
        this.Point_x = (int) me.getRawX();
        this.Point_y = (int) me.getRawY();
        switch (me.getAction()) {
        case MotionEvent.ACTION_DOWN:
            this.isPoint = true;
            break;
        case MotionEvent.ACTION_UP:
            this.isPoint = false;
            break;
        }
        //这里一定要返回true, 否则ACTION_MOVE里获取不到Point_x, Point_y
        return true;
    }

    // -------------------------------------

    /**
     * 总逻辑方法
     */
    public void Deal() {

        switch (this.Game_State) {
        // 如果游戏的当前状态是LOGO状态时
        case GAME_LOGO:
            this.Deal_Logo();
            break;
        // 如果游戏的当前状态是初始化状态时
        case GAME_INIT:
            this.Deal_Init();
            break;
        // 如果游戏的当前状态是菜单状态时
        case GAME_MENU:
            this.Deal_Menu();
            break;
        // 如果游戏的当前状态是进行状态时
        case GAME_PLAY:
            this.Deal_Play();
            break;
        // 如果游戏的当前状态是暂停状态时
        case GAME_PAUSE:
            this.Deal_Pause();
            break;
        // 如果游戏的当前状态是退出状态时
        case GAME_EXIT:
            this.Deal_Exit();
            break;

        }

    }

    // ----------------------

    /**
     * 逻辑_Logo
     */
    public void Deal_Logo() {
        // .....
        // ----------------
        this.Game_State = GAME_INIT;
    }

    /**
     * 逻辑_Init
     */
    public void Deal_Init() {

        this.Game_State = GAME_MENU;
    }

    /**
     * 逻辑_Menu
     */
    public void Deal_Menu() {

        // .....
        // ----------------
        this.Game_State = GAME_PLAY;

    }

    /**
     * 逻辑_Play
     */
    public void Deal_Play() {

    }

    /**
     * 逻辑_Pause
     */
    public void Deal_Pause() {

    }

    /**
     * 逻辑_Exit
     */
    public void Deal_Exit() {

    }
}

这是游戏运行截图

java 安卓 游戏开发 java能开发安卓游戏吗_Game