Android优美代码赏析:Snake游戏分析

1.运行时图

2.软件架构图

3.eclipse生成资源定义

按上一篇导入Snake Sample代码后,eclipse将根据Snake\res下的资源生成\Snake\gen\com\example\android\snake\R.java

Snake\res\layout\snake_layout.xml为游戏界面布局文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" //继承系统设置
    android:layout_height="match_parent">
    
    <com.example.android.snake.SnakeView
     android:id="@+id/snake" //定义app id为snake
        android:layout_width="match_parent"

//继承系统设置

android:layout_height="match_parent"
                tileSize="24"
                />
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

<TextView
         android:id="@+id/text" //定义test view id为 text
            android:text="@string/snake_layout_text_text"
            android:visibility="visible"
            android:layout_width="wrap_content"

//继承系统设置

android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center_horizontal"
            android:textColor="#ff8888ff"
            android:textSize="24"/>
    </RelativeLayout>

</FrameLayout>

生成的R.java为:(根据资源文件的目录来分析代码即可)

package com.example.android.snake;

public final class R {
    public static final class attr {

public static final int tileSize=0x7f010000;
    }

public static final class drawable {
        public static final int greenstar=0x7f020000;
        public static final int redstar=0x7f020001;
        public static final int yellowstar=0x7f020002;
    }

public static final class id {
        public static final int snake=0x7f050000;
        public static final int text=0x7f050001;
    }

public static final class layout {
        public static final int snake_layout=0x7f030000;
    }

public static final class string {
        public static final int mode_lose_prefix=0x7f040002;
        public static final int mode_lose_suffix=0x7f040003;
        public static final int mode_pause=0x7f040001;

public static final int mode_ready=0x7f040000;
        public static final int snake_layout_text_text=0x7f040004;
    }
    public static final class styleable {

public static final int[] TileView = {
            0x7f010000
        };

public static final int TileView_tileSize = 0;
    };

}

4.基础状态说明:

1)游戏状态

//状态
    private int mMode = READY;
    public static final int PAUSE = 0;
    public static final int READY = 1;
    public static final int RUNNING = 2;
    public static final int LOSE = 3;
//状态设置函数 public void SnakView::setMode(int newMode);
    
       //方向
    private int mDirection = NORTH;
    private int mNextDirection = NORTH;
    private static final int NORTH = 1;
    private static final int SOUTH = 2;
    private static final int EAST = 3;
    private static final int WEST = 4;
//方向设置函数:public boolean SnakView::onKeyDown(int keyCode, KeyEvent msg);

//其他
    private long mScore = 0;
    private long mMoveDelay = 600;
  (mScore记录分数,mMoveDelay为每次移动的时间间距)

private long mLastMove;

   2)显示点状态(绘制指定点)
      //状态定义,0为不画图片
    private static final int RED_STAR = 1;
    private static final int YELLOW_STAR = 2;
    private static final int GREEN_STAR = 3;
    //导入资源 

privatevoid initSnakeView() {
        setFocusable(true);

Resources r = this.getContext().getResources();

resetTiles(4);
        loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));
        loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));
        loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));
        
    }

//绘制点

SnakeView::updateSnake -> TextView::setTile
调用TextView::onDraw时逐个去画,

View::invalidate激活上述onDraw

绘图的实现是通过一个redraw的定时来实现的

mRedrawHandler.sleep(mMoveDelay);

此redraw的定义:

/**
     * Create a simple handler that we can use to cause animation to happen.  We
     * set ourselves as a target and we can use the sleep()
     * function to cause an update/invalidate to occur at a later date.
     */

private RefreshHandler mRedrawHandler = new RefreshHandler();

class RefreshHandler extends Handler {

@Override
        public void handleMessage(Message msg) {
            SnakeView.this.update();
            SnakeView.this.invalidate();
        }

public void sleep(long delayMillis) {
            this.removeMessages(0);
            sendMessageDelayed(obtainMessage(0), delayMillis);
        }

};

3)界面布局与状态初始化

布局文件位于:  Snake/res/layput/snake_layout.xml
初始化:
(1)程序onCreate时:
setContentView(R.layout.snake_layout);
(2)构造SnakeView类时:initSnakeView();

4)按键处理
public boolean SnakView::onKeyDown(int keyCode, KeyEvent msg);

5.逻辑实现:(待完成)
1)随机苹果的生成:
initNewGame ->addRandomApple
2)Snake的移动
根据每一次移动的mMoveDelay 也为redraw的间距来分析
(1)绘画:update -》 updateSnake
(2)吃Apple动作
(3)程序暂停与撞墙死亡
作者:Anpher Zhang QQ:275000205

转载请注明出处:http://zhangsufeng.cnblogs.com/

求一份Android或嵌入式linux开发工作。
附录:部分内容摘自http://xusaomaiss.iteye.com/blog/393135

posted on 2011-10-14 12:20 Anpher Zhang 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zhangsufeng/archive/2011/10/14/2212038.html

Android优美代码赏析:Snake游戏分析相关推荐

  1. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  2. MTK优美代码赏析2:MenuItemMask_flag

    MTK优美代码赏析2:MenuItemMask_flag 从mtk业已经有15个月了,现在自己虽然对这个mtk的架构很熟悉了,但感觉自己欠缺的还是太多,窥到嵌入式的冰山一角让我更加渴望更深层次的学习. ...

  3. Android SDK实例之Snake游戏深入解析(一)

    Snake是Android SDK例子程序中的一个小游戏,工程源代码:android-sdk-windows-1.5_r2\platforms\android-1.1\samples\Snake.这个 ...

  4. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  5. Android Audio代码分析8 - AudioHardwareALSA::openOutputStream函数

    发现以前写的东西,对调用函数的展开放在了函数的前面,导致不方便找到原来代码及设置的函数参数. 以后打算稍作改动,把对被调函数的展开放在原代码的后面,这样看起来应该方便些. 闲言少叙,跳入代码. 前两天 ...

  6. java太阳系_Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  7. 基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程

    基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程在线看Android源代码网址: http://aospxref.com/a ...

  8. Android APP代码执行历史漏洞与攻击面分析

    文章目录 前言 错误的反射调用 漏洞根源分析 漏洞防御建议 反射调用思考 CVE-2020-8913 漏洞根源分析 动态加载Dex "寄生兽"漏洞 TikTok APP漏洞 代码执 ...

  9. 安卓逆向009实战分析smali代码破解小游戏(贪吃蛇)

    文章目录 一些小知识 小游戏实践 一些小知识 反编译一个APK,找到他的源码所在地,即smali(原本是dex文件)温馨提示,一个dex就反编译一个smali文件,当dex内的方法超过65535个,就 ...

  10. android源码大全 IOS游戏源代码打包下载 小游戏|视频教程 微信小程序源码带后台全套|公众号平台

    不断更新中,下面是2017-12-22更新部分 IOS_源码及视频一小部分: 开发环境:Xcode 基于cocos2d的tweejump跳跃游戏ios经典游戏源码.rar  https://pan.b ...

最新文章

  1. 深度|人工智能赋能“新基建”产业的四方面及建议
  2. 接口隔离原则最直白描述
  3. java 视频 缩略图_Java截取视频文件缩略图
  4. 【RecyclerView】 一、RecyclerView 最基本用法 ( 添加支持库 | 设置布局文件 | 自定义适配器 )
  5. MFC中修改程序图标
  6. modules runAllManagedModulesForAllRequests=true /(转1)
  7. WPF中引入外部资源
  8. 树莓派和微信和服务器,用树莓派搭建微信公共平台
  9. Java描述设计模式(06):建造者模式
  10. 重构_改善既有的代码设计(一)
  11. 组态王bitset用法_关于STEP7在组态王里定义I/O离散变量
  12. TabWidget的一个小疑问
  13. 硬盘与电线挨着会高温吗_对着电线撒尿,会触电吗?
  14. Spring源码深度解析百度网盘下载
  15. VHDL数控分频器及其应用
  16. 算法题6 b站扭蛋机
  17. 程序员最爱用的在线代码编辑器合集,哪款是你的最爱?
  18. 传图取字:微信小程序自动把图片上的文字提取出来
  19. 信奥日记——动态规划(动规初步)
  20. Kubernetes多运营商云服务器部署(kubeadm+ipvs+flannel)

热门文章

  1. VMware虚拟机下网络连接的三种模式
  2. 交换排序 java_Java交换排序:冒泡排序和快速排序
  3. python如何删除对象属性_如何销毁python中属性中的对象?
  4. linux 串口内核加载,linux对串口编程的详解(从应用层到内核驱动,包括232,485)
  5. flex 还有人用么_那些北京人用过的老物件,能认出10个说明您老了!
  6. 移动**21*设置无法接通_手机通话质量不好?你可能只差一步设置!
  7. 关于监听套接字的形象解释
  8. mysql8 groups关键字
  9. php推送mip示例,首页—mip推送软件—首页
  10. 数据库与表的操作之SQL Server 2012中的数据类型