通过PieceManager获得的一个9*9的二维方块Piece类的数组,其中我们值绘制1-8的格子,因为最外层的格子我们将会用来,画线,效果如下图
现在我们可以通过这个数组来绘制基本的界面了
我们会使每一块的小方块之间有6个像素点的距离
绘制的代码如下
protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(background, 0, 0, null); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if(pieces[i][j] != null) { Bitmap curImage = pieces[i][j].getImage(); canvas.drawBitmap(curImage, startX + betweenLength/2 + i * (pieceWidth + betweenLength), startY + betweenLength/2 + j * (pieceHeight + betweenLength), null); } } }
现在主要就是判断,我们到底点击的是哪一个图片了,首先我们根据点击的范围获得点击的方块是数组中的哪一个元素,并对该点击的方块进行一系列的处理。我们会用一个长度为2的一维数组lastClick记录我们上一次点击的方块在我们的二维数组中的脚标,如果我们是刚开局,或是已经消去了两个时,我们会把上次点击的记录lastClick设置成初始化的值,lastClick中的两个元素的值均为-1,否则,就把我们刚才点击的方块的脚标赋值给lastClick,当我们再次点击一个方块区域时,我们会根据此次点击的区域的脚标来获取在这个位置上Piece以获取该位置上图片的Id,然后对比上次点击的方块区域中的图片Id是否和本次的Id一样,如果一样,就消去,否则,lastClick就变为当前点击的位置
public boolean onTouchEvent(MotionEvent event) { float touchX = event.getX(); float touchY = event.getY(); //当点击在图片区域才会有响应 if(touchX > startX && touchX < startX+(pieceWidth+betweenLength)*columnNum && touchY > startY && touchY < startY+(pieceHeight+betweenLength)*rowNum) { int x = (int)((touchX-startX)/(pieceWidth+betweenLength)); int y = (int)((touchY-startY)/(pieceHeight+betweenLength)); //首先判断点击的位置不是已经消失了的图片的位置 if(pieces[x][y] != null) { //如果是刚开始玩或者已经销毁了一对 if(lastClick[0] == -1 && lastClick[1] == -1) { lastClick[0] = x; lastClick[1] = y; } else { //两次点击的不是同一张图片 if(x != lastClick[0] || y != lastClick[1]) { //若果两个图片相同 if(pieces[x][y].getId() == pieces[lastClick[0]][lastClick[1]].getId()) { pieces[x][y] = null; pieces[lastClick[0]][lastClick[1]] = null; lastClick[0] = -1; lastClick[1] = -1; invalidate(); }//如果两次点击的图片不相同,则把此次点击的方块的位置赋值给lastClick else if(pieces[x][y].getId() != pieces[lastClick[0]][lastClick[1]].getId()) { lastClick[0] = x; lastClick[1] = y; } } } } } else System.out.println("哥们点跑偏了!... ..."); return super.onTouchEvent(event); }