Android工作室:TimerTask
Android Studio: TimerTask
我正在创建一个简单的点击游戏,它会在屏幕上生成敌人,当用户点击它们时,他们会获得分数并消灭敌人。当用户点击它们时,我通过使图像框可见和不可见来做到这一点。它们 运行 在计时器上并且有一个持续的产卵循环。
目前我想实现一种让用户开始失去健康的方式。所以我想检查敌人的图像框是否可见,如果可见,玩家会慢慢失去生命值。
我对创建可以刷新此作业 UI 的计时器任务感到困惑。如果某些图像可见或不可见,我希望能够不断检查 UI。我已经从我自己的研究中开始了这个,但是如果实现这个,游戏在加载时会崩溃。
要刷新的计时器 UI:
private Timer mTimer1;
private TimerTask mTt1;
private Handler mTimerHandler = new Handler();
public void onStart() {
mTimer1 = new Timer();
mTt1 = new TimerTask() {
public void run() {
mTimerHandler.post(new Runnable() {
public void run() {
//TODO
final TextView health = (TextView) findViewById(R.id.Health);
health.setText("Health: " + health2);
//Enemy ImageViews
final ImageView enemy1 = (ImageView) findViewById(R.id.enemy1);
final ImageView enemy2 = (ImageView) findViewById(R.id.enemy2);
final ImageView enemy3 = (ImageView) findViewById(R.id.enemy3);
final ImageView enemy4 = (ImageView) findViewById(R.id.enemy4);
//sets imageViews into array
final ImageView[] enemies = new ImageView[4];
enemies[0] = enemy1;
enemies[1] = enemy2;
enemies[2] = enemy3;
enemies[3] = enemy4;
boolean running = true;
while (running) {
if (enemy1.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy2.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy3.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy4.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
}
}
});
}
};
mTimer1.schedule(mTt1, 1, 5000);
}
}
这是我创建的定时任务。我想弄清楚为什么这会导致我的游戏崩溃以及如何解决此问题。我以前从未以这种方式使用过计时器,所以如果问题很明显,这就是我没有注意到它的原因。
我在 onCreate 方法中有更多代码,如果需要,可以 post。感谢您为初学者提供的所有帮助和建议。
崩溃:
根据错误信息你需要调用super.onStart()
所以你需要在这里添加:
public void onStart() {
super.onStart();
//你的代码
}
我假设你知道,但以防万一 super 是 class 你扩展了父级。如果您覆盖它的 onStart 函数,则正常的 onStart 过程不会完成,如果您不调用超级函数。
编辑:至于你的其他问题,我(作为 java 的初学者,所以我并不是说这是最好的方法)会考虑做类似的事情:
首先创建一个处理程序并为敌人制作可运行程序:
Handler handler = new Handler();
Runnable[] eRunnables = new Runnable[enemies.length-1];
for(int i = 0; i < eRunnables.length; i++){
eRunnables[i] = new Runnable(){
public void run(){
if(enemies[i].getVisibility() == View.VISIBLE){
health2--;
health.setText("Health:" + health2);
handler.postDelayed(eRunnables[i], 1000);
}
}
};
}
然后在你最初让敌人可见的地方(除了将它们设置为可见之外)做一些类似
的事情
handler.postDelayed(eRunnable[enemyNr], 1000);
当然可以用您想要的毫秒数替换 1000。
再说一次,我并不是说这是最好的方法,只是我想出来的。
我正在创建一个简单的点击游戏,它会在屏幕上生成敌人,当用户点击它们时,他们会获得分数并消灭敌人。当用户点击它们时,我通过使图像框可见和不可见来做到这一点。它们 运行 在计时器上并且有一个持续的产卵循环。
目前我想实现一种让用户开始失去健康的方式。所以我想检查敌人的图像框是否可见,如果可见,玩家会慢慢失去生命值。
我对创建可以刷新此作业 UI 的计时器任务感到困惑。如果某些图像可见或不可见,我希望能够不断检查 UI。我已经从我自己的研究中开始了这个,但是如果实现这个,游戏在加载时会崩溃。
要刷新的计时器 UI:
private Timer mTimer1;
private TimerTask mTt1;
private Handler mTimerHandler = new Handler();
public void onStart() {
mTimer1 = new Timer();
mTt1 = new TimerTask() {
public void run() {
mTimerHandler.post(new Runnable() {
public void run() {
//TODO
final TextView health = (TextView) findViewById(R.id.Health);
health.setText("Health: " + health2);
//Enemy ImageViews
final ImageView enemy1 = (ImageView) findViewById(R.id.enemy1);
final ImageView enemy2 = (ImageView) findViewById(R.id.enemy2);
final ImageView enemy3 = (ImageView) findViewById(R.id.enemy3);
final ImageView enemy4 = (ImageView) findViewById(R.id.enemy4);
//sets imageViews into array
final ImageView[] enemies = new ImageView[4];
enemies[0] = enemy1;
enemies[1] = enemy2;
enemies[2] = enemy3;
enemies[3] = enemy4;
boolean running = true;
while (running) {
if (enemy1.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy2.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy3.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
if (enemy4.getVisibility() == View.VISIBLE) {
int damage = 1;
health2 = health2 - damage;
health.setText("Health:" + health2);
} else {
// Either gone or invisible
}
}
}
});
}
};
mTimer1.schedule(mTt1, 1, 5000);
}
}
这是我创建的定时任务。我想弄清楚为什么这会导致我的游戏崩溃以及如何解决此问题。我以前从未以这种方式使用过计时器,所以如果问题很明显,这就是我没有注意到它的原因。
我在 onCreate 方法中有更多代码,如果需要,可以 post。感谢您为初学者提供的所有帮助和建议。
崩溃:
根据错误信息你需要调用super.onStart() 所以你需要在这里添加:
public void onStart() {
super.onStart();
//你的代码
}
我假设你知道,但以防万一 super 是 class 你扩展了父级。如果您覆盖它的 onStart 函数,则正常的 onStart 过程不会完成,如果您不调用超级函数。
编辑:至于你的其他问题,我(作为 java 的初学者,所以我并不是说这是最好的方法)会考虑做类似的事情:
首先创建一个处理程序并为敌人制作可运行程序:
Handler handler = new Handler();
Runnable[] eRunnables = new Runnable[enemies.length-1];
for(int i = 0; i < eRunnables.length; i++){
eRunnables[i] = new Runnable(){
public void run(){
if(enemies[i].getVisibility() == View.VISIBLE){
health2--;
health.setText("Health:" + health2);
handler.postDelayed(eRunnables[i], 1000);
}
}
};
}
然后在你最初让敌人可见的地方(除了将它们设置为可见之外)做一些类似
的事情handler.postDelayed(eRunnable[enemyNr], 1000);
当然可以用您想要的毫秒数替换 1000。
再说一次,我并不是说这是最好的方法,只是我想出来的。