【转】Android贪吃蛇源代码

时间:2023-03-10 02:16:33
【转】Android贪吃蛇源代码

/*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);
        }
      }
  }
}

}