我在Canvas上制作了类似Battleships游戏的东西。 我们来看看这个领域:
问题是:当我按下另一个单元时,黄色单元会再次变黑。我想保存它的状态,这样这个黄色的细胞就不会再变黑了。
以下是代码在点击时要执行的操作:
// it's some method A
case 1:
drawHit = true;
this.draw_x = x;
this.draw_y = y;
invalidate();
break;
和
// It's in onDraw() method
if (drawHit == true) {
Log.d(TAG, "drawHit! drawX = " + draw_x + ", drawY = " + draw_y);
Paint ship = new Paint();
ship.setColor(getResources().getColor(R.color.ship_color));
Rect r = new Rect(draw_x*rebro_piece, draw_y * rebro_piece, (draw_x+1) * rebro_piece, (draw_y+1)*rebro_piece);
canvas.drawRect(r, ship);
drawHit = false; }
答案 0 :(得分:1)
我相信最好的解决方案是改变你的方法,这是一个简单的例子:
创建一个类来对动作进行建模,例如:
public class BattleTurn {
//here you save your Rect you had on your onDraw()
//but you will have to create the moment user clicks
private Rect rect;
private boolean hit;
//...
}
为每回合游戏保留一份清单。
List<BattleTurn> turns = new ArrayList<BattleTurn>();
每次有人玩你都会添加一个新的转弯(turns.add(...)
)并使你的画布无效,这样它就会重绘。
在onDraw()
上,您将完成每个转弯并绘制它:
//for each turn you draw it on the canvas
for (BattleTurn turn: turns){
//draw the turn like you already do
if (turn.getHit()) {
Log.d(TAG, "drawHit! drawX = " + draw_x + ", drawY = " + draw_y);
Paint ship = new Paint();
ship.setColor(getResources().getColor(R.color.ship_color));
canvas.drawRect(turn.getRect(), ship);
}
}
答案 1 :(得分:1)
我在最近的应用程序中遇到了这个问题,打印了画布上的点。每个点都有不同的颜色和大小,我不得不保存他们的状态。
您所要做的就是创建一个小类,您可以在其中保存单元格,保存信息并将所有信息存储在列表中。在onDraw()方法中,在drawRect()之前,使用已保存的颜色更新Paint对象。
我会在这里向您展示我的片段。 (1个建议:每次调用onDraw时都不要实例化Paint,最好在外面声明它,也许作为你班级的私有变量)
private class MyPoint {
private float x;
private float y;
private int color;
private int size;
// + constructor, getters and setters
}
@Override
public void onDraw(Canvas canvas) {
for (MyPoint point : points) {
paint.setColor(point.get_color());
canvas.drawCircle(point.x, point.y, current_size, paint);
}
}