项目代码分析

代码分析

代码组成部分

本项目代码共有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类
    该类负责对游戏的一些文本文字进行处理和显示输出。

代码调用关系

1510297-20190519165647183-2143042734.png

1510297-20190519165306654-94882724.png

核心代码分析

游戏运行时首先会调用主活动MagicTower;
MagicTower在运行过程中会打开ThreadCanvas类对用户操作进行监控,以及MainGame实例化游戏本体;
1510297-20190519170701896-263536938.png

MainGame类在实例化的过程中会打开SplashScreen界面;
1510297-20190519170810840-12064441.png

用户将在SplashScreen界面显示是否开启音效,根据触点位置判断是否开启,选择后将进入MainMenu界面;
1510297-20190519171113258-596840369.png

1510297-20190519171019529-1260317668.png

在MainMenu界面,用户通过点击操作杆的上和下按键控制MainMenu中的curItem参数,选择当前的选项,点击确认键后将根据curItem参数的值实例化进入AboutScreen界面、HelpScreen界面或是GameScreen界面;
1510297-20190519171636912-1056667344.png

在AboutScreen界面、HelpScreen界面将显示游戏的相关信息,点击操作杆的上和下按键之外的部分将返回MainMenu界面;
1510297-20190519171935828-618442788.png

在GameScreen界面实例化的过程中,将实例化HeroSprite、GameMap和Task三个类,以获取主角属性、地图信息、事件信息等数据。而后在GameScreen界面将从上至下分显示游戏地图、角色状态栏、操作栏三段图像。
1510297-20190519172616418-1686246045.png

通过操作栏可以对主角的行动进行控制,通过方向按键可以修改HeroSprite中的坐标;
根据主角的坐标以及操作,并根据地图的布局可以修改当前状态type值
根据type值dealType方法对主角当前遇到的状况进行判断,是遭遇了楼梯、npc、物品或是怪物;
当主角遭遇了npc时会根据npc类型调用Task类中的不同对话;
当遭遇了物品时将根据物品类型修改HeroSprite类中主角的属性,或是修改Task类中的关键物品,并显示信息;
当遭遇楼梯时将更改GameMap类中的楼层参数,修改地图信息;
当遭遇怪物时将首先调用FightCalc类中的canAttack方法判断是否可以打过,如果打不过则无反应,否则将打开 FightScreen界面显示战斗画面;
FightScreen界面将显示主角属性以及怪物属性。
1510297-20190519174240804-1212602102.png

自己实现的功能分析

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值