android studio可以在执行时更改timertask()期间吗?

exdqitrt  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(353)

我有一个小游戏,在一个随机位置产生一个敌人,并保持传送到另一个随机位置每秒钟。我的问题是,我不知道如何使传送更快的计时器不断减少。
我的计时器从60秒开始计时,一直到“还剩0秒”为止,游戏结束。
我想把“传送”的延迟改成->每0,8秒45秒或者每0,5秒25秒等等。
所以计时器的周期在经过一定时间后会自动改变。
这是我到目前为止尝试过的,但没有任何效果。在整个60秒内,传送仍然每1秒发生一次。

static int period;
static int periodCounter = 0;
// Load progressBar from 0s to 60s

    private void progressLoad() {
        final int[] counter = {pgrBar.getProgress()};
        final Timer timer = new Timer();
        final TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                counter[0]++;
                periodCounter++;
                pgrBar.setProgress(counter[0]);

                runOnUiThread(new Runnable() {
                    public void run() {
                        tv_progress.setText("Zeit verbleibend: " + (60 - counter[0]));
                    }
                });

                if (counter[0] == 60)
                    timer.cancel();
                if (counter[0] == 60)
                    gameOver();
            }

        };

        timer.schedule(timerTask, 0, 1000);

    }
// Change period variable depending on seconds left

    private void changePeriod() {
        if (periodCounter <= 10)
            period = 1000;
        else if (periodCounter <= 20)
            period = 800;
        else if (periodCounter <= 30)
            period = 600;
        else  if (periodCounter <= 40)
            period = 475;
        else if (periodCounter <= 50)
            period = 350;
    }
// TimerTask for teleporting the enemy to random position (x,y) starting at every 1 sec

timer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Random R = new Random();
                        float dx = R.nextFloat() * width[0];
                        float dy = R.nextFloat() * height[0];
                        if (dx > (width[0] - imWidth[0]))
                            dx = width[0] - imWidth[0];
                        if (dy > (height[0] - imHeight[0]))
                            dy = height[0] - imHeight[0];
                        iv_muecke.animate()
                                .x(dx)
                                .y(dy)
                                .setDuration(0)
                                .start();
                    }
                });
            }
        }, 0, period);
cig3rfwq

cig3rfwq1#

private void teleportEnemy() {
    final Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Random R = new Random();
                    float dx = R.nextFloat() * width[0];
                    float dy = R.nextFloat() * height[0];
                    if (dx > (width[0] - imWidth[0]))
                        dx = width[0] - imWidth[0];
                    if (dy > (height[0] - imHeight[0]))
                        dy = height[0] - imHeight[0];
                    iv_muecke.animate()
                            .x(dx)
                            .y(dy)
                            .setDuration(0)
                            .start();
                }
            });
        }
    }, 0, period);
}

根本原因
在android系统中,计时器安排任务一次性执行,或定期重复执行。这就解释了为什么你打电话的时候 schedule() 然后传球 period ,然后会定期重复。
解决方案
如果您想安排在动态时间执行的任务,那么使用handler。所以把你的密码改成。

private void teleportEnemy() {
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            Random R = new Random();
                    float dx = R.nextFloat() * width[0];
            float dy = R.nextFloat() * height[0];
            if (dx > (width[0] - imWidth[0]))
                dx = width[0] - imWidth[0];
            if (dy > (height[0] - imHeight[0]))
                dy = height[0] - imHeight[0];
            iv_muecke.animate()
                    .x(dx)
                    .y(dy)
                    .setDuration(0)
                    .start();

            if (!isGameOver()) {
                handler.postDelayed(this, period);
            }
        }
    });
}

private boolean isGameOver() {
    return pgrBar.getProgress() == 60;
}

相关问题