• 项目代码分析


    代码分析

    代码组成部分

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

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

  • 相关阅读:
    android sdk adt 版本
    android 动画
    android sdk 更新
    eclipse 自定义项目类型
    android 电量
    webApp 重用问题
    tomcat 配置首页
    什么是供应链
    dom4j使用selectSingleNode方法报错
    java编译过程中的bug
  • 原文地址:https://www.cnblogs.com/hzj20189205/p/10889798.html
Copyright © 2020-2023  润新知