代码分析
代码组成部分
本项目代码共有17个类,可以分为活动类、视图类、游戏处理类、辅助功能类这4个部分
活动类
该部分包含一个类:MagicTower类
此类继承了Activity类,是本项目的主活动。
视图类
该部分实现了游戏的界面显示,包含了八个类:GameView类、GameScreen类、MainMenu类、SplashScreen类、HelpScreen类、AboutScreen类、FightScreen类、ThreadCanvas类
-
GameView类
此类继承了View类,是概念层类。 -
GameScreen类
此类继承了GameView类,是游戏的游戏运行视图。 -
MainMenu类
此类继承了GameView类,是游戏的主菜单视图。 -
SplashScreen类
此类继承了GameView类,是游戏的音效选择视图。 -
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类
该类为游戏的主体运行视图