2011-05-12 1 views
0

내 프로그램을 묶는 데 어려움이 있습니다 (종료). SurfaceView가 Activity에 있고, SurfaceView에서 3 개의 생명을 잃었을 때 게임이 끝났다고 가정합니다. 새로운 액티비티를 열어 보려고했지만 keyDispatchingTimedOut 오류가 발생합니다. 내 UIThread와 관련이 있다는 것을 알고 있습니다. 내 활동에 처리기를 작성한 다음 내 표면보기에 액세스 할 수 있도록 지시 받았습니다. 그런 다음 내 처리기에 메시지를 보낼 수 있으며 기본 UI 스레드에서 UI를 업데이트 (또는 새 활동 시작) 할 수 있습니다. 그러나 ... 나는 이것을 어떻게하는지 모른다! 어떤 액티비티를 핸들러에 생성합니까? 새로운 활동을 시작하고 싶습니다. 나는 정말로 여기에서 길을 잃어 버렸습니다. 그리고 이것은 제가 프로그램을 응집력있게 만드는 데 필요한 마지막 부분입니다. 그 밖의 것이 없다면 활동을 어떻게 닫을 수 있습니까? 내 UI 스레드 문제 :(를 많이 일으키는내 게임 종료 문제 (UI 스레드로 새 활동을 열 수 없음)

표면보기

public class BoardView extends SurfaceView implements SurfaceHolder.Callback{ 
Context mContext; 

// thread initialization 
private BoardThread thread; 
Thread timer; 
Thread timer2; 

// box variables 
Bitmap box = 
    (BitmapFactory.decodeResource 
      (getResources(), R.drawable.box)); 
private int box_x = 140; 
private int box_y = 378; 
private int boxWidth = box.getWidth(); 
private int boxHeight = box.getHeight(); 

// storage 
private Vector<Blossom> blossomVector = new Vector<Blossom>(); 
Iterator<Blossom> dataIterator = blossomVector.iterator(); 

// counters 
private int blossomNum = 0; 
private String score; 
private int currentScore = 0; 
private int lives = 3; 

boolean mode = false; 
boolean game = false; 

OutputStreamWriter out = null; 
FileOutputStream fOut = null; 

private static final String TAG = "Debug"; 
final Paint scorePaint = new Paint(); 

public BoardView(Context context){ 
    super(context); 

    scorePaint.setColor(Color.BLACK); 
    scorePaint.setTextSize(12); 
    scorePaint.setTypeface(Typeface.MONOSPACE); 


    //surfaceHolder provides canvas that we draw on 
    getHolder().addCallback(this); 

    //set up read/write data 
    File root = Environment.getExternalStorageDirectory(); 


    // controls drawings 
    thread = new BoardThread(getHolder(),this, blossomVector, dataIterator, box_x, box_y, 
      boxWidth, boxHeight); 

    timer2 = new Thread(){ 
     public void run(){ 
      while(game == false){ 
       uiCallback.sendEmptyMessage(0); 
       try{ 
        Thread.sleep(5000); // change to be random 
       } 
       catch (InterruptedException e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 

    timer = new Thread(){ 
     public void run(){ 
      //makes sure the player still has 3 lives left 
      while(game == false){ 
       uiCallback.sendEmptyMessage(0); 
       try { 
        Thread.sleep(2000); // wait two seconds before drawing the next flower 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } //sleep for 2 seconds 
      } 
     } 
    }; 
    timer.start(); 
    timer2.start(); 


    //intercepts touch events 
    setFocusable(true); 

} 


@Override 

public void onDraw(Canvas canvas){ 
    canvas.drawColor(Color.WHITE); 
    score = "" + currentScore; 

    //note: pay attention to order you draw things 
    //don't change order or else blossoms will fall 
    //on top of box, not "into" it. 

    //display the scoreboard 
    canvas.drawText("Score: " + score,240,420,scorePaint); 
    // uses a synchronized method to prevent concurrent modification 
    DrawBlossoms(canvas); 
    canvas.drawBitmap(box, box_x, box_y, null); 

} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    //handles movement of box 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     if(event.getX() > box_x & event.getY() > box_y & 
       event.getX() < box_x + boxWidth & event.getY() < box_y + boxHeight) 
     { 
      mode = true; 
     } 
    } 

    if(event.getAction() == MotionEvent.ACTION_MOVE) { 
     if(event.getX() > box_x & event.getY() > box_y & 
       event.getX() < box_x + boxWidth & event.getY() < box_y + boxHeight) 
     { 
      mode = true; 
     } 
     if(mode == true){ 
      box_x = (int)event.getX(); 
     } 

    } 

    if(event.getAction() == MotionEvent.ACTION_UP){ 
     mode = false; 
    } 

    invalidate(); 
    return true; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, 
     int format, int width, int height){ 
    Log.v(TAG, "Surface Changed"); 
    //somehow these don't seem to be working 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder){ 
    thread.startRunning(true); 
    thread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder){ 
    Log.v(TAG, "Surface Destroyed"); 
    try { 
    thread.join(); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

} 

private Handler uiCallback = new Handler(){ 
    public synchronized void handleMessage(Message msg){ 
     //add a new blossom to the blossom Vector!! 
     blossomVector.add(new Blossom( 
      (BitmapFactory.decodeResource 
        (getResources(), R.drawable.blossom)))); 
     dataIterator = blossomVector.iterator(); 
     blossomNum++; 
     Log.v(TAG, "Number of Blossoms =" + blossomNum); 
    } 
}; 


private synchronized void DrawBlossoms(Canvas c) // method to draw flowers on screen and test for collision 
{ 
    Canvas canvas = c; 
    dataIterator = blossomVector.iterator(); 
    while (dataIterator.hasNext()) 
    { 
     Blossom tempBlossom = dataIterator.next(); 
     tempBlossom.Draw(canvas); 
     if (tempBlossom.hit(box_x,box_y, box_x + boxWidth, box_y + boxHeight, blossomVector) == true) 
     { 
      Log.v(TAG, "ITERATOR WORKS!"); 
      dataIterator.remove(); 
      currentScore += 100; 
     } 

     if (tempBlossom.dropped() == true) 
     { 
      dataIterator.remove(); 
      Log.v(TAG, "Blossom dropped"); 
      lives--; 
     } 
     if (lives == 0) 
     { 
      // stop the thread that makes blossoms 
      game = true; 
      //save the highscore 
      try { 
       File root = Environment.getExternalStorageDirectory(); 
       if(root.canWrite()){ 
       File highscoresFile = new File(root, "score.txt"); 
       FileWriter writer = new FileWriter(highscoresFile, true); 
       BufferedWriter out = new BufferedWriter(writer); 
       //out.newLine(); 
       out.append(score); 
       out.newLine(); 
       out.close(); 
       } 
      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 





     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     } 

    } 
} 

}

스레드

public class BoardThread extends Thread { 

private SurfaceHolder surfaceHolder; 
private BoardView boardView; 

private Vector<Blossom> blossomVector; 
private int boxX; 
private int boxY; 
private int boxWidth; 
private int boxHeight; 
private boolean mrun =false; 
private Iterator<Blossom> iterator; 

private static final String TAG = "Debug"; 

public BoardThread(SurfaceHolder holder, BoardView boardView2, 
     Vector<Blossom> blossomVector1, Iterator<Blossom> dataIterator, 
     int box_x, int box_y, int boxW, int boxH) { 

    surfaceHolder = holder; 
    boardView=boardView2; 

    blossomVector = blossomVector1; 
    iterator = dataIterator; 
    boxX = box_x; 
    boxY = box_y; 
    boxW = boxWidth; 
    boxH = boxHeight; 
} 

public void startRunning(boolean run) { 

    mrun=run; 
} 

@Override 
public void run() { 

    super.run(); 
    Canvas canvas; 
    while (mrun) { 
     canvas=null; 
     try { 
      canvas = surfaceHolder.lockCanvas(null); 
       synchronized (surfaceHolder) { 
       //update position 
       //Position(blossomVector, boxX, boxY, boxWidth, boxHeight); 
       // draw flowers 
       boardView.onDraw(canvas); 
      } 
     } finally { 
       if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    } 
당신의 서피스 뷰 SurfaceView 또는 BoardView을 보여주고 활동에서

답변

0
Which activity do I create the handler in? 

귀하의 경우.

내가 처리기에 대한 방법을 작성해야 어디 처리기

+0

를 사용하여

지금
public BoardView(Context context, Handler mHandler) 

당신이 어떤 일을 할 수에 BoardView의 생성자를 수정? SurfaceView에서? Handler와 함께 작동하는 스레드는 어디에서 실행되어야합니까? –

+0

여기서 BoardView를 호출하는 곳에서의 활동 – ingsaurabh

관련 문제