贪吃蛇中使用了三个文件,snake.java,snakeView.java和tileView.java,网上资料显示,在做贪吃蛇的时候,我们使用了一个framelayout绝对定位,在里面放两个和父元素一样大的子元素,一个是我们自定义的view:snake,这个元素是游戏的界面,我们不停的操作和重绘该view来完成游戏的交互。另一个是在中间有蓝色文本框的相对定位的布局框架,她用来显示游戏状态。网上资料显示这个tileview是一个游戏贴片类,是我们自定义的view,他事先游戏画面的贴片计算,贴片的类定义,贴片的绘制和tile相关方法。我大概可以看懂snake.java和snakeview.java,但是不怎么看懂tileview.java,还望高人指点,希望不吝赐教,越详细越好。源代码:package com.example.android.snake; 
 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.View; 
 
 
public class TileView extends View { 
 
    
    protected static int mTileSize; 
 
    protected static int mXTileCount; 
    protected static int mYTileCount; 
 
    private static int mXOffset; 
    private static int mYOffset; 
 
 
    private Bitmap[] mTileArray;  
 
   
    private int[][] mTileGrid; 
 
    private final Paint mPaint = new Paint(); 
 
    public TileView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
 
        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.recycle(); 
    } 
 
  
    public void resetTiles(int tilecount) { 
        mTileArray = new Bitmap[tilecount]; 
    } 
 
 
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
        mXTileCount = (int) Math.floor(w / mTileSize); 
        mYTileCount = (int) Math.floor(h / mTileSize); 
 
        mXOffset = ((w - (mTileSize * mXTileCount)) / 2); 
        mYOffset = ((h - (mTileSize * mYTileCount)) / 2); 
 
        mTileGrid = new int[mXTileCount][mYTileCount]; 
        clearTiles(); 
    } 
 
  
    public void loadTile(int key, Drawable tile) { 
        Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888); 
        Canvas canvas = new Canvas(bitmap); 
        tile.setBounds(0, 0, mTileSize, mTileSize); 
        tile.draw(canvas); 
 
        mTileArray[key] = bitmap; 
    } 
 
   
    public void clearTiles() { 
        for (int x = 0; x < mXTileCount; x++) { 
            for (int y = 0; y < mYTileCount; y++) { 
                setTile(0, x, y); 
            } 
        } 
    } 
 
    
    public void setTile(int tileindex, int x, int y) { 
        mTileGrid[x][y] = tileindex; 
    } 
 
 
    @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); 
                } 
            } 
        } 
 
    } 
 
}

解决方案 »

  1.   

    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.view.View;public class TileView extends View { protected static int mTileSize; // 节大小 protected static int mXTileCount; // X坐标
    protected static int mYTileCount; // Y坐标 private static int mXOffset; // X轴偏移量
    private static int mYOffset; // Y轴偏移量 private Bitmap[] mTileArray; // 存放图片的数组 private int[][] mTileGrid; // 瓦片网格数组 private final Paint mPaint = new Paint(); // 画笔 public TileView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    //获得风格属性组
    TypedArray a = context.obtainStyledAttributes(attrs,
    R.styleable.TileView);
    //获得R.styleable.TileView_tileSize,缺省值为12
    mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
    //返回先前使用过的风格属性集,使用TypedArray后一定要使用这个。
    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.recycle();
    } public void resetTiles(int tilecount) {
    mTileArray = new Bitmap[tilecount];//创建图片数组
    } @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    mXTileCount = (int) Math.floor(w / mTileSize);//获得X轴能放多少个节
    mYTileCount = (int) Math.floor(h / mTileSize);//获得Y轴能放多少个节 mXOffset = ((w - (mTileSize * mXTileCount)) / 2);//获得X偏移量
    mYOffset = ((h - (mTileSize * mYTileCount)) / 2);//获得Y偏移量 mTileGrid = new int[mXTileCount][mYTileCount];//创建整个网格数组
    clearTiles();//清屏
    }
    //加载图片
    public void loadTile(int key, Drawable tile) {
    //创建图片
    Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,
    Bitmap.Config.ARGB_8888);
    //创建画布
    Canvas canvas = new Canvas(bitmap);
    //画图
    tile.setBounds(0, 0, mTileSize, mTileSize);
    tile.draw(canvas); mTileArray[key] = bitmap;
    }
    //清屏方法
    public void clearTiles() {
    for (int x = 0; x < mXTileCount; x++) {
    for (int y = 0; y < mYTileCount; y++) {
    setTile(0, x, y);
    }
    }
    }
    //设置一个方格方法
    public void setTile(int tileindex, int x, int y) {
    mTileGrid[x][y] = tileindex;
    }
    //画图方法 
    @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);
    }
    }
    } }}
      

  2.   

    多谢一楼的解答,请问snake.java,snakeView.java和tileView.java这三个之间具体是怎么协同工作,最后可以达到显示贪吃蛇的效果呢?
      

  3.   

    我只看了tileView的代码,不过从代码看,这个view是用来控制snake的显示的,那么就需要有一个类来控制tileView让他显示什么