/*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. es进行curl请求时报错:missing authentication token for REST request

    把host 修改一下即可 ELASTICSEARCH_HOST=http://user:password@URL:port

  2. ArcGIS案例学习笔记2_1

    ArcGIS案例学习笔记2_1 联系方式:谢老师,135_4855_4328,xiexiaokui#qq.com 时间:第二天上午 案例1:学校选址 内容:栅格数据分析 教程:pdf page=323 ...

  3. 大型运输行业实战_day06_1_购票功能简单实现

    1.添加购票按钮 对应的html代码 因为列表是js函数动态填充的,故添加按钮应该在js函数中,完整代码如下: /** * 注意在调用该函数时必须输入参数 * 查询+ 分页 * */ function ...

  4. idea 码云 项目上传

    1.点击导航栏 VCS -> Import into Version Control -> 托管项目到码云 2.输入码云帐号密码,点击login. 3.勾选private,点击托管按钮. ...

  5. python获取当前日期

    今天群里一个人问了怎么获取当前时间的问题,以前接触过计算日期之差的,具体代码如下: import datetime d1=datetime.datetime(2014,3,14) d2=datetim ...

  6. sql server 数据库学习

    http://m.blog.csdn.net/anxpp/article/details/51295020

  7. Django的cookie学习

    为什么要有cookie,因为http是无状态的,每次请求都是独立的,但是我们还需要保持状态,所以就有了cookie cookie就是保存在客户端浏览器上的键值对,别人可以利用他来做登陆 rep = r ...

  8. Notepad++正则表达式格式 Editplus使用正则表达式[转]

          使用正则表达式可以很好地完成很多繁琐耗时的工作,以下抄录editplus正则表达式的使用,同样适用于notepad++:表达式 说明 \t 制表符. \n 新行. . 匹配任意字符. | ...

  9. Dreamweaver 调字体大小

    编辑--首选参数--字体 这里是指调代码字体的大小,就是为了编码时看的清楚些

  10. cmake 总结

    cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/bui ...