/*TileView:tile有瓦片的意思,用一个个tile拼接起来的就是地图。TileView就是用来呈现地图的类*/

public class TileView extends View {

/*控制View中切片的尺寸和它们的范围参数。Width/Height是以像素为单位的,Drawables要被按比例缩放以适应方位。X/T瓦片数量是要被画出的切片的数量*/

protected static int mTileSize; //地图tile的大小。其实就是点的宽和高(是一样的值)

protected static int mXTileCount; //地图上x轴能容纳的tile的数量。下面类似
  protected static int mYTileCount;

private static int mXOffset; //地图的起始坐标
  private static int mYOffset;

/*一个hash键值对对象,由子类指定用来参考的drawable*/

private Bitmap[] mTileArray;

//地图上tile对应的图片数组。每一种tile都对应一个bitmap。比如mTileArray[1]就是草地的bitmap。可以类推。

/*一个二维整数数组,其中的数字代表tile的索引,将画在对应的位置*/

private int[][] mTileGrid;

//地图上的tile数组。比如int[1][1]=0说明这个点是草地。int[1][2]=1说明这个点是苹果

//其实思想就是这么简单。方式可以有各种各样

//画笔,canvas的图形绘制,需要画笔Paint实现

private final Paint mPaint = new Paint();

public TileView(Context context, AttributeSet attrs, int defStyle){
    super(context, attrs, defStyle);
    //这里用到的TypeArray。不懂的童鞋要去google下。是google弄出来的一种样式数组,其实就像定义一个控件的属性的集合。
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
    mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
    a.recycle();
  }

public TileView(Context context, AttributeSet attrs){

super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);

mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);

a.recyle();

}

/*重置Bitmap的内部数列,用来画切片,并设置插入的切片的最大索引*/

public void resetTiles(int tilecount){

mTileArray = new Bitmap[tilecount];

}

//个人认为。这个函数是比较有意思的。这个是view的一个回调函数。最开始初始化的时候view的大小都是0。当进行layout之后。每个view都确定了大小。这样就开始回调这个函数

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh){

mXTileCount = (int)Math.floor(w/mTileSize);

mXTileCount = (int)Math.floor(h/mTileSize);

mXOffset = ((w - (mTileSize * mXTileCount))/2);

mYOffset = ((h - (mTileSize * mYTileCount))/2);

mTileGrid = new int[mXTileCount][mYTileCount];

clearTiles();

}

/*设置指定的Drawable作为特定的整数键的切片*/

public void loadTile(int key, Drawable tile){

Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888); //创建一个bitmap

Canvas canvas = new Canvas(bitmap); //创建画布

tile.setBounds(0,0,mTileSize, mTileSize);

tile.draw(canvas);

mTileArray[key] = bitmap;

}

/*重置所有的切片为0(空)*/

public void clearTiles(){

for(int x=0; x<mXTileCount; x++){

for(int y=0; y<mYTileCount; y++){

setTile(0, x, y);

}

}

}

/*用来指定一个特定的切片(loadTile和整数值参考设置)在给定的x/y坐标在下一次invalidate/draw循环时*/

public void setTile(int tileindex, int x, int y){

mTileGrid[x][y] = tileindex;
  }

//这个函数就是画出地图了。遍历地图的点,然后把每个tile的坐标都计算出来,然后一个个的tile都draw到canvas上

@Override
  public void onDraw(Canvas canvas){
    super.onDraw(canvas);
    for(int x=0; x<mXTileCount; x+=1){
      for(int y=0; y<mYTileCount; y+=1){
        if(mTileGrid[x][y] > 0){
         canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x*mTileSize, mYOffset + y*mTileSize, mPaint);
        }
      }
  }
}

}

【转】Android贪吃蛇源代码的更多相关文章

  1. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  2. android贪吃蛇(超级简陋版)

    public class body { public int ax;//代表X周变量 public int ay;//代表Y轴变量 public int getAx() { return ax; } ...

  3. C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!

    前几天有个同学加我QQ私聊我说他们老师布置了一个贪吃蛇,他不知道怎么写所以来找我求解,我给他简单讲解了思路和一些难点之后他也能够自己独立将项目完成了!考虑到更多同学可能有贪吃蛇上的问题,今天有时间就来 ...

  4. HTML5贪吃蛇源代码

    显示效果例如以下:点击这里!       代码下载:点击这里! <script> function show(){  var date = new Date(); //日期对象  var ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. Android实现贪吃蛇游戏

    [绥江一百]http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...

  7. <Android 应用 之路> 简易贪吃蛇

    最简单的贪吃蛇 最近想着忙里偷闲写点简单的Android应用,增加一些生活乐趣,由于平时工作主要精力并不是集中在书写apk上,更多的是解决代码问题和维护模块稳定,但是写代码本身是一件比较有趣的事情,因 ...

  8. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  9. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

随机推荐

  1. Servlet Request 请求转发

    request.getRequestDispatcher("logined.jsp").forward(request, response);    //登录用户在登录页面验证通过 ...

  2. servlet第三篇

    Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度. 针对客户端的多次Servlet请求,通常情况下,服务器只会 ...

  3. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  4. ComputeSignature 中行支付签名报错(win7 64位系统)

    在做中行加密验签的时候出现的问题.原本在XP系统下可以正常运行的,现在换了win7 64位系统就出现了这个问题,没头绪 所以发上来求各位大大支招 有什么好的解决方案.. 我的解决办法: 1.C:\Do ...

  5. destoon 分页

    php: global $pagesize,$page; $pagesize = 10;//分页改为10条一页 $offset or $offset = ($page-1)*$pagesize; $t ...

  6. Mybatis中的N+1问题与延迟加载

    0.什么是N+1问题? 在查询中一下子取出所有属性,就会使数据库多执行几条毫无意义的SQL .实际中不需要把所有信息都加载进来,因为有些信息并不常用,加载它们会多执行几条毫无用处的 SQL,导致数据库 ...

  7. linux中使用locate搜索文件方法记录

    在linux中,有时用apt或者yum等软件包管理工具直接安装软件的时候,不知道软件到底安装到哪里去了,配置文件放哪里?这个时候就可以使用搜索命令locate来找到这些文件.海词上locate翻译为找 ...

  8. 迭代器&生成器&yield异步

    迭代器 #迭代器是访问集合元素的一种形式,迭代器从集合的第一个元素开始访问,直到所有的元素被访问# 结束才结束,迭代器只能往前访问,不能往后访问,比如你先访问1,在访问2,在访问3.如果已经# 访问到 ...

  9. Ugly number丑数2,超级丑数

    [抄题]: [思维问题]: [一句话思路]:Long.valueOf(2)转换为long型再做 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图 ...

  10. vs2008 FileUpload 上传控件 Gridview传多个值

    拖fileupload控件,控件后加button1 lable1 lable2,还要在与本窗体同意目录下新建img文件夹protected void Button1_Click(object send ...