• 【转】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);
            }
          }
      }
    }

    }

  • 相关阅读:
    torchvision.transforms用法
    下采样上采样 nn.MaxPool2d() nn.AvgPool2d()池化层
    resnet系列网络(BottelNeck、BasicBlock)
    alexnet网络结构及pytorch实现
    pytorch 使用Module类和Sequential类自定义模型
    model.eval()和model.train()
    RNN循环神经网络recurrent neural network和lstm、gru
    python assert断言
    LeNet:GradientBased Learning Applied to Document Recognition
    11.innodb的行格式
  • 原文地址:https://www.cnblogs.com/2008nmj/p/5365765.html
Copyright © 2020-2023  润新知