在Android游戏中无法实现CountDownTimer

时间:2014-07-29 16:48:55

标签: java android countdowntimer

这是一款基于一个Activity的简单Android游戏,该游戏在我的AndroidGame课程中进行了扩展。我的大多数其他类扩展我的'Screen'类来制作菜单,游戏内屏幕,Game Over屏幕等等。我想创建一个CountDownTimer的实例,一旦用户按下播放就调用它并且确认游戏正在运行(在我的GameScreen类中),然后在30秒后将用户返回主菜单。

我的主要活动看起来像这样。我已经把整个课程包括在内了,但是用评论包围了重要的部分:

package com.game.framework.implementation;

import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.view.Window;
import android.view.WindowManager;

import com.game.framework.Audio;
import com.game.framework.FileIO;
import com.game.framework.Game;
import com.game.framework.Graphics;
import com.game.framework.Input;
import com.game.framework.Screen;

public abstract class AndroidGame extends Activity implements Game {
    AndroidFastRenderView renderView;
    Graphics graphics;
    Audio audio;
    Input input;
    FileIO fileIO;
    Screen screen;
    WakeLock wakeLock;

    //////// Timer variables ////////
    public static boolean timerFinished = false;
    public static MyCount counter;
    ////////////////////////////////////////

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
        int frameBufferWidth = isPortrait ? 480: 800;
        int frameBufferHeight = isPortrait ? 800: 480;
        Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, Config.RGB_565);

        float scaleX = (float) frameBufferWidth / getWindowManager().getDefaultDisplay().getWidth();
        float scaleY = (float) frameBufferHeight / getWindowManager().getDefaultDisplay().getHeight();

        renderView = new AndroidFastRenderView(this, frameBuffer);
        graphics = new AndroidGraphics(getAssets(), frameBuffer);
        fileIO = new AndroidFileIO(this);
        audio = new AndroidAudio(this);
        input = new AndroidInput(this, renderView, scaleX, scaleY);
        screen = getInitScreen();
        setContentView(renderView);

        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyGame");



        //////// Instantiate counter ////////
        counter = new MyCount(30000,1000);  
        //////////////////////////////////

    }

    @Override
    public void onResume() {
        super.onResume();
        wakeLock.acquire();
        screen.resume();
        renderView.resume();
    }

    @Override
    public void onPause() {
        super.onPause();
        wakeLock.release();
        renderView.pause();
        screen.pause();

        if (isFinishing())
            screen.dispose();
    }

    @Override
    public Input getInput() {
        return input;
    }

    @Override
    public FileIO getFileIO() {
        return fileIO;
    }

    @Override
    public Graphics getGraphics() {
        return graphics;
    }

    @Override
    public Audio getAudio() {
        return audio;
    }

    @Override
    public void setScreen(Screen screen) {
        if (screen == null)
            throw new IllegalArgumentException("Screen must not be null");

        this.screen.pause();
        this.screen.dispose();
        screen.resume();
        screen.update(0);
        this.screen = screen;
    }

    @Override
    public void onBackPressed() {
        getCurrentScreen().backButton();
    }

    public Screen getCurrentScreen() {

        return screen;
    }

    //////// The Timer Class ////////////////////////////////
    public class MyCount extends CountDownTimer{
        public MyCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onFinish() {
            timerFinished = true;
        }

        @Override
        public void onTick(long millisUntilFinished) {

        }
    }
    ////////////////////////////////////////////////////////

}

现在,一旦计时器用完,如您所见,我将布尔值timerFinished更改为true。在我的GameScreen课程中,我有一个名为updateRunning的方法,一旦游戏开始并且正在运行(已按下播放),就会处理用户交互。

private void updateRunning(List<TouchEvent> touchEvents, float deltaTime) {

        ///// Start the timer and go to menu if time is up /////
        AndroidGame.counter.start();
        if (AndroidGame.timerFinished == true) {
            goToMenu();
        }
        ///////////////////////////////////////////////////////

        int len = touchEvents.size();

        for (int i = 0; i < len; i++) {
            TouchEvent event = (TouchEvent) touchEvents.get(i);
            if (event.type == TouchEvent.TOUCH_DOWN) {
                // Do lots of stuff based on which buttons the user presses

我没有收到错误并且游戏运行正常,但是在30秒后它没有返回主菜单。我不知道为什么,并且真的很感激任何有关此事的想法。谢谢!

编辑1:这是我的goToMenu()方法:

private void goToMenu() {
    game.setScreen(new MainMenuScreen(game));

}

我无法在AndroidGame内调用此内容,因为它引用了game,并且使该静态会导致很多问题。


编辑2:

这是我正在尝试做的TLDR版本 - 为了清晰起见。

我有class1,我extend Activityclass2我处理用户输入并在屏幕上绘制项目。

在我的Android游戏中,我想要一个从30秒倒计时的功能。我想将剩余时间传递给全局变量,以便我可以在class2中绘制它。一旦Timer达到0,我想运行goToMenu()class2也必须存在。{/ p>

截至目前,我在CountDownTimer中拥有class1子类,并在那里实例化它。我有一个全局布尔值,我在计时器的True方法中设置为onFinish()。如果布尔值为True,那么我在goToMenu()中运行class2但由于某种原因它不起作用。

0 个答案:

没有答案