Я новичок в программировании на Android, и теперь я пытаюсь создать простую игру Sea Battle для одного человека. Корабли - это места, игрок попадает в поле и видит, попал ли выстрел или нет. В принципе, поле выглядит следующим образом:Рисунок на холсте и освежающий
Код:
public void onDraw(Canvas canvas) {
if (getWidth() > getHeight()) {
rebro = getHeight();
} else {
rebro = getWidth(); // the smaller size of screen is "rebro"
}
rebro_piece = rebro/10; // divide the screen by 10 (to get 10x10 field)
Paint background = new Paint();
background.setColor(getResources().getColor(R.color.game_background));
canvas.drawRect(0, 0, rebro, rebro, background); // draw background
Paint divider = new Paint();
divider.setColor(getResources().getColor(R.color.divider_black));
// drawing divider lines
for (int i=0; i<11; i++) {
canvas.drawLine(0, i*rebro_piece, rebro, i*rebro_piece, divider); // horizontal
canvas.drawLine(i*rebro_piece, 0, i*rebro_piece, rebro, divider); // vertical
}
canvas.drawLine(rebro-1, 0, rebro-1, rebro, divider);
}
Вот как я делаю "поле".
В другом классе у меня есть метод, который собирает числа x
и y
из 10 массива, представляющего, где находятся корабли. Для отладки мне нужно нарисовать их на своем поле. Коды координат извлекаются в цикле.
Таким образом, я написал метод drawShip(int x, int y)
.
On Stack Overflow Я основал question «Почему я не могу рисовать снаружи onDraw()
?» и я изменил свой метод к этому:
public void drawShip(int x, int y) {
myX = x; //global
myY = y; //global
needToPaintShip = true; //boolean
invalidate(); // refreshing?
needToPaintShip = false;
}
Здесь needToPaintShip
решает, нужен ли перекройка холст или нет.
Также я редактировал onDraw(Canvas canvas)
метод:
if(needToPaintShip == true) {
Paint ship = new Paint();
ship.setColor(getResources().getColor(R.color.ship_color));
Log.d(TAG, "onDraw(): rebro_piece = " + rebro_piece + " , myX = "+ myX + " , myY = " + myY); // I only get the last coordinates!
Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1));
canvas.drawRect(r, ship);
}
но результат ужасен:
Ребята, я в отчаянии. Как я могу исправить это и сделать «корабли» нарисованы на поле?
Хорошо. Решается проблема с очень маленьким желтым прямоугольником. Но он всегда отображается где-то в правой нижней ячейке ... – Groosha
P.S: Если вы делаете игру, подумайте об использовании игровой среды, а не встроенных графических инструментов. –
Это не игра, я думаю. Это просто «игровое приложение» – Groosha