Наличие таймера обратного отсчета на холсте с использованием класса Surfaceview в Android - PullRequest
0 голосов
/ 12 января 2012

Моя проблема в том, что я делаю одну игру и использую класс Surfaceview и рисую растровые изображения на холсте.

Я хочу, чтобы максимальный срок игры составлял 1 минуту, т.е. 60 000 миллисекунд.

Я хочу показать время на холсте, и как только игра начнется, она должна начать уменьшаться, а когда она станет равной нулю, игра закончится.

То, что я сделал, было 1-м, я рассчитал Систему.System.currentTimeMillis () вначале, когда начинается игра, а затем вычитает текущее время, которое я вычисляю внутри функции onDraw () внутри класса, при рисовании снова вызывается n из gameloopthread.я вычесть timegone = currenttime - время начала.

изначально оставшееся время было = 60000. Я продолжаю вычитать его из timeleft timeleft = timeleft-timegone

и затем пытаюсь использовать класс Paint, чтобы записать оставшееся время на холсте после форматирования, чтобы преобразовать егов секундах.

но это дает неправильные тайминги и иногда странным образом меняется + ve aur -ve и меняется случайным образом.

Я также пытался использовать класс Timer, но я не знаю, какой слушатель яможем передать это в классе Surfaceview bcoz, у нас не может быть таких компонентов View, как кнопки и т. д. в SurfaceView.

Пожалуйста, помогите мне в этом отношении, если вы можете предложить какое-нибудь хорошее решение или указать, где я совершаю ошибку.

спасибо и привет, Mayank

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Вот некоторая основная важная часть кода ... что я делаю ... когда пользователь нажимает onTouchEvent и текущее время сохраняется в переменной starttime.затем внутри функции ondraw я вычисляю текущее время и, используя время начала, вычисляю оставшееся время, а затем передаю значение в функцию onDraw в классе счета, где я могу напечатать счет и оставшееся время.все это происходит в цикле.У меня есть одна переменная с именем clicked, поэтому время начала будет установлено только один раз, когда мы нажмем 1 раз ... но все же я получаю странные результаты ..

    public class GameView extends SurfaceView {
 double timeleft =60,000 //60  sec
int clicked=0;
 static double starttime;//time when we started game
 double timeleft=300000;

 @Override
protected void onDraw(Canvas canvas) {
   if(clicked==0)
    score.onDraw(canvas,timeleft); // trying to print the score by calling onDraw function in score class
    else {
        double timegone= System.currentTimeMillis() - starttime ;
        timeleft=timeleft-timegone; 
        score.onDraw(canvas,timeleft);
    }

       public boolean onTouchEvent(MotionEvent event) 
{   
    if(clicked==0)
    starttime= System.currentTimeMillis();

          clicked++;
    }
   }
 }

тогда эта функция onDraw внутри класса партитуры, которую я использовал для печативремя и другие оценки

   public void onDraw(Canvas canvas, double time) {
    Paint paint = new Paint();
    int min=(int) (time/60000);
    int sec=(int) ((time)%60000);
    paint.setColor(Color.GREEN);
    paint.setTextSize(20);
    canvas.drawText("Coins:"+Integer.toString(coins),gameView.getWidth()-100, 20, paint);
    canvas.drawText("Time Left:"+Integer.toString(min)+":"+Integer.toString(sec),gameView.getWidth()-140, 40, paint);

}
0 голосов
/ 12 января 2012

У вас правильная логика, вы используете класс Calendar при настройке времени? Кроме того, когда вы использовали StandardDateFormat для форматирования времени, вы должны указать часовой пояс, так же, как при использовании календаря? пожалуйста, предоставьте код того, что вы делаете ...

...