Рисование на Canvas и обновление объектов [2]
Добавлено: 09 июн 2013, 21:02
Этот вопрос будет более полным, нежели предыдущим, чтобы лучше понять проблему.
Я пытаюсь сделать что-то типа "Морского боя" для одного игрока.
Генерируются корабли, затем юзер тычет в экран, а на экране видно, попал или нет. Собственно, всё.
Проблема заключается в графической реализации этой модели.
Есть изначально поле:
Его код:
[syntax=java]public void onDraw(Canvas canvas) {
if (getWidth() > getHeight()) {
rebro = getHeight();
} else {
rebro = getWidth(); // ребро - по наименьшей стороне
}
rebro_piece = rebro / 10; // делаем сетку 10х10 "клеток"
Paint background = new Paint();
background.setColor(getResources().getColor(R.color.game_background));
canvas.drawRect(0, 0, rebro, rebro, background); // рисуем фон
Paint divider = new Paint();
divider.setColor(getResources().getColor(R.color.divider_black));
// разделительные линии
for (int i=0; i<11; i++) {
canvas.drawLine(0, i*rebro_piece, rebro, i*rebro_piece, divider); // горизонтальные
canvas.drawLine(i*rebro_piece, 0, i*rebro_piece, rebro, divider); // вертикальные
}
canvas.drawLine(rebro-1, 0, rebro-1, rebro, divider); // последняя линяя на 1 пиксель левее, чтобы попасть в экран
}
[/syntax]
В другом классе путем некоторых вычислений я получаю 2 числа - это координаты, которые нажал юзер и которые надо изобразить на поле. Эти значения Х и У.
Для этого я написал метод drawShip(int x, int y)
Руководствуясь одним из вопросов со StackOverflow http://stackoverflow.com/questions/1206 ... ent-doesnt
я написал этот метод так:
[syntax=java]public void drawShip(int x, int y) {
myX = x; // переменная класса
myY = y; // переменная класса
needToPaintShip = true; //boolean
invalidate(); // это обновит экран?
needToPaintShip = false;
}[/syntax]
Здесь needToPaintShip - это булево значение, показывающее, есть ли координаты, чтобы их отобразить на экране.
После этого я обновил метод onDraw(Canvas canvas), дописав следующее:
[syntax=java]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); // здесь выводятся только последние координаты!
Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1));
canvas.drawRect(r, ship);
}[/syntax]
Но результат...в общем, взгляните сами.
Товарищи, я в отчаянии. Почему не работает - не понимаю.
Я пытаюсь сделать что-то типа "Морского боя" для одного игрока.
Генерируются корабли, затем юзер тычет в экран, а на экране видно, попал или нет. Собственно, всё.
Проблема заключается в графической реализации этой модели.
Есть изначально поле:
Его код:
[syntax=java]public void onDraw(Canvas canvas) {
if (getWidth() > getHeight()) {
rebro = getHeight();
} else {
rebro = getWidth(); // ребро - по наименьшей стороне
}
rebro_piece = rebro / 10; // делаем сетку 10х10 "клеток"
Paint background = new Paint();
background.setColor(getResources().getColor(R.color.game_background));
canvas.drawRect(0, 0, rebro, rebro, background); // рисуем фон
Paint divider = new Paint();
divider.setColor(getResources().getColor(R.color.divider_black));
// разделительные линии
for (int i=0; i<11; i++) {
canvas.drawLine(0, i*rebro_piece, rebro, i*rebro_piece, divider); // горизонтальные
canvas.drawLine(i*rebro_piece, 0, i*rebro_piece, rebro, divider); // вертикальные
}
canvas.drawLine(rebro-1, 0, rebro-1, rebro, divider); // последняя линяя на 1 пиксель левее, чтобы попасть в экран
}
[/syntax]
В другом классе путем некоторых вычислений я получаю 2 числа - это координаты, которые нажал юзер и которые надо изобразить на поле. Эти значения Х и У.
Для этого я написал метод drawShip(int x, int y)
Руководствуясь одним из вопросов со StackOverflow http://stackoverflow.com/questions/1206 ... ent-doesnt
я написал этот метод так:
[syntax=java]public void drawShip(int x, int y) {
myX = x; // переменная класса
myY = y; // переменная класса
needToPaintShip = true; //boolean
invalidate(); // это обновит экран?
needToPaintShip = false;
}[/syntax]
Здесь needToPaintShip - это булево значение, показывающее, есть ли координаты, чтобы их отобразить на экране.
После этого я обновил метод onDraw(Canvas canvas), дописав следующее:
[syntax=java]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); // здесь выводятся только последние координаты!
Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1));
canvas.drawRect(r, ship);
}[/syntax]
Но результат...в общем, взгляните сами.
Товарищи, я в отчаянии. Почему не работает - не понимаю.