項目代碼分析

代碼分析

代碼組成部分

本項目代碼共有17個類,能夠分爲活動類、視圖類、遊戲處理類、輔助功能類這4個部分canvas

活動類

該部分包含一個類:MagicTower類
此類繼承了Activity類,是本項目的主活動。佈局

視圖類

該部分實現了遊戲的界面顯示,包含了八個類:GameView類、GameScreen類、MainMenu類、SplashScreen類、HelpScreen類、AboutScreen類、FightScreen類、ThreadCanvas類字體

  • GameView類
    此類繼承了View類,是概念層類。線程

  • GameScreen類
    此類繼承了GameView類,是遊戲的遊戲運行視圖。3d

  • MainMenu類
    此類繼承了GameView類,是遊戲的主菜單視圖。code

  • SplashScreen類
    此類繼承了GameView類,是遊戲的音效選擇視圖。blog

  • HelpScreen類
    此類繼承了GameView類,是遊戲的幫助視圖。繼承

  • AboutScreen類
    此類繼承了GameView類,是遊戲的關於信息視圖。遊戲

  • FightScreen類
    該類是遊戲的戰鬥視圖,因爲該視圖顯示與遊戲運行視圖之上,調用該類須要傳入GameScreen類。事件

  • ThreadCanvas類
    該類是遊戲的操做控制類,做爲獨立線程獨立與其餘視圖以外,用於接收用戶的觸屏或按鍵等操做。

遊戲處理類

該部分實現了遊戲的後臺處理,包括六個類:MainGame類、GameMap類、HeroSprite類、FightCalc類、Task類、MySet類

  • MainGame類
    此類是遊戲的運行本體,負責在各個視圖間的調度。

  • GameMap類
    此類負責處理遊戲的地圖信息。

  • HeroSprite類
    此類負責遊戲的主角(即用戶操做的角色)數據以及對主角的操做處理。

  • FightCalc類
    此類負責遊戲的戰鬥處理。

  • Task類
    此類負責處理遊戲的npc事件以及遊戲關鍵道具。

  • MySet類
    此類負責處理遊戲的基本數據信息設定,如界面長寬、字體大小、基本文字圖像顯示等。

輔助功能類

該部分添加了一些遊戲的輔助功能,包括了兩個類:CMIDIPlayer類和TextUtil類

  • CMIDIPlayer類
    該類是遊戲的音樂播放器,負責播放遊戲背景音樂。

  • TextUtil類
    該類負責對遊戲的一些文本文字進行處理和顯示輸出。

代碼調用關係

核心代碼分析

遊戲運行時首先會調用主活動MagicTower;
MagicTower在運行過程當中會打開ThreadCanvas類對用戶操做進行監控,以及MainGame實例化遊戲本體;

MainGame類在實例化的過程當中會打開SplashScreen界面;

用戶將在SplashScreen界面顯示是否開啓音效,根據觸點位置判斷是否開啓,選擇後將進入MainMenu界面;

在MainMenu界面,用戶經過點擊操做杆的上和下按鍵控制MainMenu中的curItem參數,選擇當前的選項,點擊確認鍵後將根據curItem參數的值實例化進入AboutScreen界面、HelpScreen界面或是GameScreen界面;

在AboutScreen界面、HelpScreen界面將顯示遊戲的相關信息,點擊操做杆的上和下按鍵以外的部分將返回MainMenu界面;

在GameScreen界面實例化的過程當中,將實例化HeroSprite、GameMap和Task三個類,以獲取主角屬性、地圖信息、事件信息等數據。然後在GameScreen界面將從上至下分顯示遊戲地圖、角色狀態欄、操做欄三段圖像。

經過操做欄能夠對主角的行動進行控制,經過方向按鍵能夠修改HeroSprite中的座標;
根據主角的座標以及操做,並根據地圖的佈局能夠修改當前狀態type值
根據type值dealType方法對主角當前遇到的情況進行判斷,是遭遇了樓梯、npc、物品或是怪物;
當主角遭遇了npc時會根據npc類型調用Task類中的不一樣對話;
當遭遇了物品時將根據物品類型修改HeroSprite類中主角的屬性,或是修改Task類中的關鍵物品,並顯示信息;
當遭遇樓梯時將更改GameMap類中的樓層參數,修改地圖信息;
當遭遇怪物時將首先調用FightCalc類中的canAttack方法判斷是否能夠打過,若是打不過則無反應,不然將打開 FightScreen界面顯示戰鬥畫面;
FightScreen界面將顯示主角屬性以及怪物屬性。

本身實現的功能分析

ThreadCanvas類

該類是一個獨立線程,用於監聽用戶的屏幕操做、按鍵操做,並不斷刷新遊戲的頁面顯示當前的狀態。
其主要方法包括:

  • void refurbish()刷新頁面:
  • void run()遊戲循環
    每當系統休眠MySet.GAME_LOOP的時間後,調用refurbish()刷新畫面;
  • boolean onKeyDown(int keyCode)處理按鍵按下
    當用戶按下按鍵後,調用當前頁面的onKeyDown方法;
  • boolean onKeyUp(int keyCode)處理按鍵鬆開
    當用戶鬆開按鍵後,調用當前頁面的onKeyUp方法;
  • boolean onTouchEvent(MotionEvent event)處理觸屏事件
    當用戶觸屏後,調用當前頁面的onTouchEvent方法;

MySet類

該類包括了一些系統的基本信息,包括:

//界面狀態
    public static final int GAME_SPLASH     = 1;
    public static final int GAME_MENU       = 2;
    public static final int GAME_ABOUT      = 3;
    public static final int GAME_HELP       = 4;
    public static final int GAME_RUN        = 5;
    public static final int GAME_CONTINUE   = 6;

    // 遊戲循環時間 
    public static final int GAME_LOOP       = 100;

    // 屏幕的寬高 
    public static final int SCREENW         = 1080; //屏幕寬
    public static final int SCREENH         = 1920; //屏幕高
    public static final int BORDERW         = 1056; //沙盒寬
    public static final int BORDERH         = 1152; //沙盒高
    public static final int BORDERX         = (MySet.SCREENW - BORDERW) / 2; //沙盒橫座標(相對左上角)
    public static final int BORDERY         = 60; //沙盒縱座標(相對左上角)
    public static final int MessageBoxH     = 210; //消息界面高度

    // 文字的尺寸 
    public static final int TextSize        = 48;

    //觸屏位置判斷
    public static boolean touchUp (int x ,int y) //上
    public static boolean touchDown (int x ,int y) // 下
    public static boolean touchRight (int x ,int y) //  右
    public static boolean touchLeft (int x ,int y) // 左
    public static boolean touchOK (int x ,int y) // 確認
    public static boolean touchBack (int x ,int y) // 返回
    public static boolean touchYes (int x ,int y) // 是
    public static boolean touchNo (int x ,int y) // 否

    // 繪圖
    public static void fillRect(Canvas canvas, int x, int y, int w, int h, Paint paint) //繪製填充矩形
    public static void drawRect(Canvas canvas, int x, int y, int w, int h, Paint paint) //繪製矩形框
    public static void drawImage(Canvas canvas, Bitmap blt, int x, int y, int w, int h, int bx, int by) //繪製圖片
    public static void drawImage(Canvas canvas, Bitmap bitmap, float x, float y) //繪製圖片
    public static void drawString(Canvas canvas, String str, float x, float y, Paint paint) //繪製文本

GameView類

該類是個概念類,表示遊戲中的界面顯示部分。
該類繼承View類,而遊戲中的全部顯示界面都繼承該類。
包括了:

public GameView(Context context) //構造方法
    protected abstract void onDraw(Canvas canvas); // 繪圖
    public abstract boolean onTouchEvent(MotionEvent event); //觸屏操做
    public abstract boolean onKeyDown(int keyCode); //按鍵按下
    public abstract boolean onKeyUp(int keyCode); //按鍵彈起
    protected abstract void reCycle(); //回收資源
    protected abstract void refurbish(); //刷新

GameMap類

該類包括了遊戲的地圖信息,用於繪製遊戲的地圖,包括:

// 基本信息
    public static final int         SWITCH_OFFSET   = 44; //動態相差
    public static final int         TILE_WIDTH      = 96; //單個格子大小
    public static final int         TILE_HEIGHT     = TILE_WIDTH;
    private static final int            TILE_NUM_COL    = 11; //地圖格式 11*11
    private static final int            TILE_NUM_ROW    = TILE_NUM_COL;
    public static final int         MAP_WIDTH       = TILE_WIDTH * TILE_NUM_COL; //地圖大小
    public static final int         MAP_HEIGHT      = MAP_WIDTH;
    public static final int         FLOOR_NUM       = 22;
    public static final int         TILE_NUM        = TILE_NUM_COL * TILE_NUM_ROW; //格子數量

    // 地圖詳細數據
    private int[][] floorArray    // 各層詳細地圖
    private static final int[][] heroPosition // 各層主角出生點

    // 活動參數
    private int                     curUpDown       = 0;// 上/下樓

    private int[]                       curFloorArray   = new int[TILE_NUM]; // 當前層地圖
    public int                          curFloorNum     = 0;    // 樓層數
    public int                          reachedHighest  = 0;    // 最高層數

    private TiledLayer                  floorMap        = null; //地圖
    private HeroSprite                  hero            = null; //主角
    private int                     aheadIndex      = 0; //主角位置
    private int                     aheadCol        = 0; //主角位置(x軸)
    private int                     aheadRow        = 0; //主角位置(y軸)

GameScreen類

該類爲遊戲的主體運行視圖

相關文章
相關標籤/搜索