这是一款基于一个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 Activity
和class2
我处理用户输入并在屏幕上绘制项目。
在我的Android游戏中,我想要一个从30秒倒计时的功能。我想将剩余时间传递给全局变量,以便我可以在class2
中绘制它。一旦Timer达到0,我想运行goToMenu()
,class2
也必须存在。{/ p>
截至目前,我在CountDownTimer
中拥有class1
子类,并在那里实例化它。我有一个全局布尔值,我在计时器的True
方法中设置为onFinish()
。如果布尔值为True
,那么我在goToMenu()
中运行class2
但由于某种原因它不起作用。