项目代码分析

代码分析

代码组成部分

本项目代码共有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类

该类为游戏的主体运行视图

原文地址:https://www.cnblogs.com/hzj20189205/p/10889798.html