创建PieceImage类:将一个图片和他的ID封装起来。
package com.jan.link.view;
import android.graphics.Bitmap;
public class PieceImage {
private Bitmap image;
private int imageId;
public PieceImage(Bitmap image,int imageId) {
this.image=image;
this.imageId=imageId;
}
public void setImage(Bitmap image) {
this.image = image;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
public Bitmap getImage() {
return image;
}
public int getImageId() {
return imageId;
}
}
然后创建Piece类。
package com.jan.link.view;
public class Piece {
private PieceImage image; //方块对应的图片
private int beginx,beginy; //左上角的X,y坐标
private int indexx,indexy; //棋盘中的索引
public Piece(int indexX,int indexY) {
this.indexx=indexX;
this.indexy=indexY;
}
public boolean isSameImage(Piece other){
if (image==null) {
if (other.image!=null) {
return false;
}
}
//只有2个图片的ID一直,则认为2个Piece相等
return image.getImageId()==other.image.getImageId();
}
public void setBeginx(int beginx) {
this.beginx = beginx;
}
public int getBeginx() {
return beginx;
}
public void setBeginy(int beginy) {
this.beginy = beginy;
}
public int getBeginy() {
return beginy;
}
public void setImage(PieceImage image) {
this.image = image;
}
public PieceImage getImage() {
return image;
}
public void setIndexx(int indexx) {
this.indexx = indexx;
}
public int getIndexx() {
return indexx;
}
public void setIndexy(int indexy) {
this.indexy = indexy;
}
public int getIndexy() {
return indexy;
}
}
最后是继承自View的GameView
package com.jan.link.view;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import com.jan.link.object.LinkInfo;
public class GameView extends View{
private GameService gameService; //游戏逻辑的实现类
private Piece selectedPieces; //保存当前已经被选中的方块
private LinkInfo linkInfo;//连接信息的对象。
private Paint paint; //画笔对象
private Bitmap selectImage;//选中标示的图片对象。
public GameView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//构造函数
public GameView(Context context){
super(context);
//设置连接线的信息
this.paint=new Paint();
this.paint.setColor(Color.RED);
this.paint.setStrokeWidth(3);
this.selectImage=ImageUtil.getSelectImage(context);
}
//覆盖父类中的onDraw
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (this.gameService==null) {
return;
}
Piece[][] pieces=gameService.getPieces();
if(pieces!=null){
//遍历数组,绘制方块
for (int i = 0; i < pieces.length; i++) {
for (int j = 0; j < pieces[i].length; j++) {
if (pieces[i][j]!=null) {
Piece p=pieces[i][j];
canvas.drawBitmap(p.getImage().getImage(), p.getBeginx(), p.getBeginy(), null);
}
}
}
}
//如果连接对象不为空,绘制连接对象
if (this.linkInfo!=null) {
drawLine(this.linkInfo,canvas); //绘制连接线
this.linkInfo=null;//绘制完成后,清空LinkInfo。
}
//如果有选中的图片,选中标示的图片。
if (this.selectedPieces!=null) {
canvas.drawBitmap(this.selectImage, this.selectedPieces.getBeginx(), this.selectedPieces.getBeginy(),null);
}
}
//根据LinkInfo绘制连接线的方法:
private void drawLine(LinkInfo linkInfo,Canvas canvas){
//首先获取linkInfo中封装的所有连接点
List<Point> points=linkInfo.getLinkPoints();
//依次遍历Linkinfo中的每个连接点
for (int i = 0; i < points.size()-1; i++) {
//获取当前点与下一个点
Point currentPoint=points.get(i);
Point nextPoint=points.get(i+1);
canvas.drawLine(currentPoint.x, currentPoint.y, nextPoint.x, nextPoint.y, this.paint);
}
//设置当前选中块的方法
public void setSelectedPiece(Piece piece){
this.selectedPieces=piece;
}
//开始游戏的方法
public void startGame(){
this.gameService.start();
this.postInvalidate();//子线程中更新UI,就用这个。
}
}
}