如何创建textPaint作为倒数计时器来控制游戏结束? 我试图将countDownTimer与drawText一起使用,它可以在Surfaceview中显示,但不会针对每个onTick进行更新。

public class CfView extends SurfaceView {
/** The activity object. */
private final Activity activity;
/** The answer object. */
private static Answer answer;
private static int score;
/** The InputPanel object. */
private static InputPanel inputPanel;
/** The AnswerPanel object. */
private static AnswerPanel answerPanel;
/** Keyboard panel height. */
private static final float INPUT_PANEL_HEIGHT_WEIGHT = 0.7f;
/** Answer panel height. */
private static final float ANSWER_PANEL_HEIGHT_WEIGHT = 0.3f;
private Timer timer;
private String countDownTime;

private boolean gameOver;

private UserInput userInput = new UserInput();
private CountDownTimer cdTimer;

/** Saving and handling of user input of touch events. */
private class UserInput {
    /** Whether there is a user input present. */
    boolean present = false;
    /** Action of the user input {@link MotionEvent}. */
    int action;
    /** x, y positions of the user input {@link MotionEvent}. */
    int x, y;

    synchronized void save(MotionEvent event) {
        present = true;
        action = event.getAction();
        x = (int) event.getX();
        y = (int) event.getY();
        handle();
    }

    synchronized void handle() {
        int pos = -1;
        if (present) {
            cdTimer.start();
            if (action == MotionEvent.ACTION_UP) {

                int[] clickedBallData = inputPanel.checkballStroked(x, y);
                if (clickedBallData != null) {
                    pos = clickedBallData[0];
                    int value = clickedBallData[1];
                    if (answer.isCorrect(value)) {
                        if (answer.isHCF(value)) {
                            score += 500;
                        } else {
                            score += 100;
                        }
                    } else {
                        score -= 100;
                        if (score < 0)
                            score = 0;
                    }
                    inputPanel.updateInputPanel(pos, answer);
                }
            }
            drawGameComponent();
            present = false;
        }
    }
}

private class AnimationTask extends TimerTask {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        Log.d("thread", "run");
        userInput.handle();
        Canvas canvas = getHolder().lockCanvas();
        if (canvas != null) {
            answerPanel.drawOn(canvas);
            inputPanel.drawOn(canvas);
            Paint textPaint = new Paint();
            textPaint.setColor(Color.BLACK);
            textPaint.setTextSize(50);
            textPaint.setTextAlign(Paint.Align.CENTER);
            canvas.drawText("Score : " + score, getWidth() * 0.7f, 50,
                    textPaint);
            textPaint.setColor(Color.BLACK);
            textPaint.setTextSize(50);
            textPaint.setTextAlign(Paint.Align.LEFT);
            canvas.drawText("Time : " + countDownTime + "s", 0, 50,
                    textPaint);
            if (gameOver) {
                textPaint.setTextSize(2 * 30);
                textPaint.setTextAlign(Paint.Align.CENTER);
                canvas.drawText("Times up", getWidth() / 2,
                        getHeight() / 2, textPaint);
                canvas.drawText("Score : " + score, getWidth() / 2,
                        getHeight() / 2 + (2 * 30), textPaint);

            }
            getHolder().unlockCanvasAndPost(canvas);
        }

    }

}

public CfView(Activity activity) {
    super(activity);
    setFocusableInTouchMode(true); // For getting key events
    cdTimer = new CountDownTimer(60000, 1000) {

        public void onTick(long millisUntilFinished) {
            countDownTime = String.valueOf(millisUntilFinished / 1000);
            invalidate();
        }

        public void onFinish() {
            countDownTime = 0 + "";
            gameOver = true;
            cancel();
        }
    };

    setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            userInput.save(event);

            return true;
        }
    });

    this.activity = activity;

    timer = new Timer();
    timer.schedule(new AnimationTask() {
        @Override
        public void run() {
            while (getWidth() == 0)
                ; // Wait for layout
            newGame(true);


        }
    }, 0);

}

public void resume() {
    if (timer == null)
        timer = new Timer();
    timer.schedule(new AnimationTask(), 0, 0);

}

public void pause() {
    timer.cancel();
    timer = null;
}

private void drawGameComponent() {
    Canvas canvas = getHolder().lockCanvas();
    if (canvas != null) {
        answerPanel.drawOn(canvas);
        inputPanel.drawOn(canvas);
        Paint textPaint = new Paint();
        textPaint.setColor(Color.BLACK);
        textPaint.setTextSize(50);
        textPaint.setTextAlign(Paint.Align.CENTER);
        canvas.drawText("Score : " + score, getWidth() * 0.7f, 50,
                textPaint);
        getHolder().unlockCanvasAndPost(canvas);
    }
}

public void drawTimeText() {
    Canvas canvas = getHolder().lockCanvas();
    Paint textPaint = new Paint();
    if (canvas != null) {
        textPaint.setColor(Color.BLACK);
        textPaint.setTextSize(50);
        textPaint.setTextAlign(Paint.Align.LEFT);
        canvas.drawText("Time : " + countDownTime + "s", 0, 50, textPaint);
        if (gameOver) {
            textPaint.setTextSize(2 * 30);
            textPaint.setTextAlign(Paint.Align.CENTER);
            canvas.drawText("Times up", getWidth() / 2, getHeight() / 2,
                    textPaint);
            canvas.drawText("Score : " + score, getWidth() / 2, getHeight()
                    / 2 + (2 * 30), textPaint);

        }
        getHolder().unlockCanvasAndPost(canvas);
    }

}

public void newGame(boolean newGame) {
    score = 0;
    gameOver = false;
    if (newGame) {
        answer = new Answer(activity);
        Log.d("CF", getHeight() + ";" + getWidth());
        answerPanel = new AnswerPanel(activity, 0, 0, getWidth(),
                (int) (getHeight() * ANSWER_PANEL_HEIGHT_WEIGHT), answer);
        inputPanel = new InputPanel(activity, 0,
                (int) (getHeight() * (ANSWER_PANEL_HEIGHT_WEIGHT)),
                getWidth(), (int) (getHeight()), answer);

    } else {
        answer.newNumber();
        inputPanel.resetInputPanel();
        answerPanel.resetAnswerPanel(answer);

    }
    drawGameComponent();
}

public void updateCategory(Answer.Level level) {
    answer.updateCategory(level);
    newGame(false);
}

@Override
protected boolean verifyDrawable(Drawable who) {
    return true;
}

@Override
public void invalidateDrawable(Drawable drawable) {
}

}

  ask by user2900440 translate from so

本文未有回复,本站智能推荐:

1回复

如何为recyclerview中的每个列表项添加计数器计时器

我想创建一个列表,其中显示每个项目的剩余时间,请告诉我如何在回收器视图中添加此列表,我已经看到了列表视图的解决方案,但在回收器视图中不起作用。 如何在ListView中处理多个倒数计时器?
1回复

单击某个按钮时如何增加计时器?

我想知道在计时器运行时是否可以增加秒,小时或分钟。 目前,我已经在我的应用feedAdapter中实现了这个答案。 我还在CountDownTimer中使用了这种增量函数,它的确可行!但是只有当您暂停它然后再次恢复它时(我们才可以使用它)。 所有处理程序和函数都在此链接的答案中! 我
1回复

Android中的计时器

我是android的初学者。 现在,我正在开发一个简单的应用程序。 我想在应用程序中创建一个计时器。 我希望它从10倒数到0(它将对用户可见),并且当它为0时,它应该可以进行计数。 当调用onTouch事件时,它应该开始递减计数。 我尝试过这种方式,但是没有用。 有人可以帮忙吗?
2回复

如何在Firebase中添加倒数计时器?

我使用的火力DATABASE,我想在同一时间加入倒数计时器 ,显示给所有用户。 如何以一种非常简单的方式执行该操作? 我的数据库是这样的: ` 我试图做这样的事情,但是它只检索时间的开始而没有数据库时间的更新。 总体思路是,我希望每个用户在进入活动时都能看到相同的时间
3回复

如何设置Android游戏的计时器?

我想为Android编程游戏。 播放原则:用户应该在短时间内选择正确的答案。 我的问题是输入(选择答案)和时间(倒计时)之间的组合。 我试图运行一个线程,但线程不可停止。 因此,用户给出答案,将显示下一个活动,一段时间后(当“计时器”变为0时)将再次显示活动。 我怎么能
1回复

Android倒数计时器与游戏循环问题

我有一个倒数计时器,试图从SurfaceView线程(不是主线程)倒数,这给出了一个异常“无法在尚未调用Looper.prepare()的线程内创建处理程序”。 在查看其他答案时,他们说使用处理程序来解决问题(我无法真正使用runonUIthread,因为我无权访问任何活动)。 我的问题
3回复

计时器结束前当前的自动启动功能?

我试图在计时器启动时启动活动,并在10秒后计时器结束时再次启动当前活动。 但是5秒钟后,当前活动将再次开始,并且在计时器结束后将调用oFinish()方法。 我没有在当前活动中的任何其他地方或计时器启动时正在启动的活动中启动crrent活动。 请帮助我理解这一点。谢谢 OneY
1回复

Android游戏中的倒数计时器

什么是在Android游戏中为点数实现倒数计时器的最佳方法,例如:用户丢掉所有点数,并且他将在1小时后获得5分。 考虑到该应用可能会被破坏,并且在运行时该5分的剩余时间将在应用中显示,因此如何实施此操作! 注意:游戏很简单,不只使用android pure引擎。
3回复

我想创建一个倒数计时器,一旦计时器结束,我希望另一个倒数计时器运行

这可以帮助我创建计时器,但是如何在上述计时器完成后立即创建计时器,并在计时器完成后生成通知
1回复

android中的倒计时器

我有一个带有一些值的表,我想每10秒更新一次UI(值)。 我想向用户展示倒数计时器以了解将要发生的事情......但它会崩溃。 我用于此的代码如下所示: 当我有System.out.println(i--);时,它在简单的Java应用程序中运行良好System.out.println