Я работаю над игрой для моего BlackBerry и загружаю буфер с потоками.В методе процесса, если 'множители' меньше нуля, я хочу, чтобы поток прекратил работу и на экране появилось диалоговое окно.Все, что я пробовал, не работает.Диалог появляется, как только открывается экран в большинстве случаев.Я попытался создать логическое поле, в котором метод run зацикливается, и присвоил ему значение false, но безрезультатно.
package Test;
import java.util.Random;
import java.util.Vector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.container.FullScreen;
class game extends FullScreen {
public static gameGraphics gfx;
Vector objects = new Vector();
private int lives = 5;
private int score = 0;
private Item item;
private int screenHeight = Display.getHeight();
//Bitmaps
Bitmap red = Bitmap.getBitmapResource("redblock.png");
Bitmap blue = Bitmap.getBitmapResource("blueblock.png");
Bitmap green = Bitmap.getBitmapResource("greenblock.png");
public game()
{
super(FullScreen.DEFAULT_MENU|FullScreen.DEFAULT_CLOSE);
this.initialize();
}
private void initialize() {
Block block1 = new Block(1);
Block block2 = new Block(5);
Block block3 = new Block(9);
objects.addElement(block1);
objects.addElement(block2);
objects.addElement(block3);
item = new Item(2,red,objects);
objects.addElement(item);
gfx = new gameGraphics();
refresher rf = new refresher(item,block1,block2,block3);
Dialog.ask(Dialog.D_OK,"Your score: " + score); //Is this in the right place?
}
private class refresher extends Thread{
private Item item;
private Block block1;
private Block block2;
private Block block3;
private int endOfBlocks;
private boolean runLoop = true;
refresher(Item i,Block a, Block b, Block c)
{
item = i;
block1 = a;
block2 = b;
block3 = c;
endOfBlocks = block3.getBottom();
start();
}
public void run()
{
while(true)
{
Process();
try
{
Thread.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
invalidate();
}
}
public void Process()
{
if(lives > 0){
if(item.getTop() > endOfBlocks)
{
CheckEndOfScreen();
}else{
if(item.collides()){
RepositionBlocks();
lives--;
}
}
item.move();
}else{
//What goes here? ----------------------------------
}
}
public void CheckEndOfScreen(){
if(item.getBottom() > screenHeight){
RepositionBlocks();
score++;
}
}
public void RepositionBlocks()
{
Random random = new Random();
block1.setValues(random.nextInt(3) + 1);
block2.setValues(random.nextInt(3) + 4);
block3.setValues(random.nextInt(3) + 7);
int x = random.nextInt(3) + 1;
switch(random.nextInt(3)){
case 0: item.setValues(red, x); break;
case 1: item.setValues(blue,x); break;
case 2: item.setValues(green,x); break;
}
}
} //End of refresher
protected void paint(Graphics graphics)
{
gfx.Process(graphics, objects, lives);
}
public void close()
{
int response = Dialog.ask(Dialog.D_YES_NO,"Return to menu" + item.leftChannel,Dialog.NO);
if(response == Dialog.YES)
{
super.close();
}
}
protected boolean navigationMovement(int dx,int dy,int status,int time)
{
if(dx > 0){
item.moveRight();
}
if(dx < 0){
item.moveLeft();
}
return true;
}
}