#java #timer
#java #таймер
Вопрос:
Я только начинаю использовать Motodev для программирования для Android с использованием Java. Я работаю над примером для начинающих — создаю простую игровую программу. В примере для начинающих предлагается рассмотреть возможность установки таймера запуска / остановки, чтобы программа завершилась через 30 секунд и сказала «game over». Затем мне нужно открыть пункт меню для новой игры или выхода. Мне очень сложно понять, как использовать класс Timer для завершения работы приложения. Кто-нибудь может мне помочь с этим?
Есть 3 класса, с которыми я работаю:
Игровой холст (суперкласс)
package com.dotsmasher;
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class DotSmasherCanvas extends View implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(detectHit((int)event.getX(),(int)event.getY())){
score = 1;
invalidate();
}
return false;
}
int dotX, dotY, score;
public int getDotX() {
return dotX;
}
public void setDotX(int dotX) {
this.dotX = dotX;
}
public int getDotY() {
return dotY;
}
public void setDotY(int dotY) {
this.dotY = dotY;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
protected void moveDot(){
//create 2 random numbers
//assign the new numbers to dotX, dotY
Random generator = new Random();
generator.setSeed(System.currentTimeMillis());
int w = getWidth()-20;
int h = getHeight()-40;//to avoid covering score
float f = generator.nextFloat();
dotX = (int)(f*w)%w;
f = generator.nextFloat();
dotY = (int)(f*h)%h;
}
protected boolean detectHit(int x, int y){
if((x>=dotXamp;amp;x<=dotX 20)amp;amp;(y>=dotYamp;amp;y<=dotY 20)){
//we have a hit
return true;
}
return false;
}
protected void onDraw(Canvas canvas){
canvas.drawColor(Color.BLACK);
Paint dotPaint = new Paint();
dotPaint.setColor(Color.RED);
canvas.drawRect(dotX,dotY,dotX 20,dotY 20,dotPaint);
canvas.drawText("Score: " score,20,20,dotPaint);
}
public DotSmasherCanvas(Context context){
super(context);
moveDot();
setOnTouchListener(this);
}
}
КЛАСС ТАЙМЕРА
package com.dotsmasher;
import java.util.TimerTask;
import com.dotsmasher.DotSmasherCanvas;
public class DotSmasherTimerTask extends TimerTask {
DotSmasherCanvas canvas;
public DotSmasherTimerTask(DotSmasherCanvas canvas){
this.canvas = canvas;
}
@Override
public void run() {
canvas.moveDot();
canvas.postInvalidate();
}
}
ОСНОВНОЙ КЛАСС
package com.dotsmasher;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import java.util.Timer;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
setTitle("DotSmasher");
canvas = new DotSmasherCanvas(getBaseContext());
timer = new Timer();
task = new DotSmasherTimerTask(canvas);
timer.schedule(task, 0, 1500);
setContentView(canvas);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.item01:
newGame();
return true;
case R.id.item02:
quit();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
void newGame(){
canvas.setScore(0);
}
void quit(){
timer.cancel();
task = null;
timer = null;
canvas = null;
finish();
}
private Timer timer;
private DotSmasherCanvas canvas;
private DotSmasherTimerTask task;
}