2013-06-09 2 views
1

Я новичок в программировании на Android, и теперь я пытаюсь создать простую игру Sea Battle для одного человека. Корабли - это места, игрок попадает в поле и видит, попал ли выстрел или нет. В принципе, поле выглядит следующим образом:Рисунок на холсте и освежающий

the field

Код:

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); 
    } 

но результат ужасен:

the awful result

Ребята, я в отчаянии. Как я могу исправить это и сделать «корабли» нарисованы на поле?

+0

Хорошо. Решается проблема с очень маленьким желтым прямоугольником. Но он всегда отображается где-то в правой нижней ячейке ... – Groosha

+0

P.S: Если вы делаете игру, подумайте об использовании игровой среды, а не встроенных графических инструментов. –

+0

Это не игра, я думаю. Это просто «игровое приложение» – Groosha

ответ

1

Почему вы установили needToPaintShip = false; после вызова invalidate()? Вам не нужно снова рисовать корабль в последующих кадрах?

Кроме того, похоже, этот пункт:

Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1)); 

, вероятно, следует:

Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, (myX+1)*rebro_piece, (myY+1)*rebro_piece)); 

А почему всегда появляется корабль в правом нижнем углу, это зависит от того, что вы передаете drawShip (x, y), который не показан. Возможно ли, что вы передаете пиксельные координаты вместо чего-то в диапазоне [0-10)?

+0

Спасибо за объяснение, я исправил это – Groosha

Смежные вопросы