2015-09-26 32 views
0
public class GameView extends SurfaceView 
{ 
    private GameThread mThread; 
    SurfaceHolder holder; 
    Bitmap fon = BitmapFactory.decodeResource(getResources(), R.drawable.fon); 
    ArrayList<Integer> lasers = new ArrayList<Integer>(); 
    ArrayList<Integer> coordYlasers = new ArrayList<Integer>(); 
    ArrayList<Integer> coordXlasers = new ArrayList<Integer>(); 
    Bitmap laser = BitmapFactory.decodeResource(getResources(), R.drawable.laser); 
    int touchX = 0; 
    int touchY = 0; 
    int coordX = 0; 
    int coordY = 600; 
    int _coordX = 0; 
    private boolean running = false; 
    ArrayList<Bitmap> blocks = new ArrayList<Bitmap>(); 
    public class GameThread extends Thread 
    { 
     private GameView view; 

     public GameThread(GameView view) 
     { 
      this.view = view; 
     } 

     public void setRunning(boolean run) 
     { 
      running = run; 
     } 

     public void run() 
     { 
      int i = 0; 
      while (running) 
      { 
       Canvas canvas = null; 
       try 
       { 
        canvas = view.getHolder().lockCanvas(); 
        synchronized (view.getHolder()) 
        { 
         onDraw(canvas); 
        } 

       } 
       catch (Exception e) { } 
       finally 
       { 
        if (canvas != null) 
        { 
         view.getHolder().unlockCanvasAndPost(canvas); 
        } 
       } 
      } 
     } 
    } 
    public GameView(Context context) 
    { 
     super(context); 

     mThread = new GameThread(this); 
     getHolder().addCallback(new SurfaceHolder.Callback() { 
      public void surfaceDestroyed(SurfaceHolder holder) { 
       boolean retry = true; 
       mThread.setRunning(false); 
       while (retry) { 
        try { 
         mThread.join(); 
         retry = false; 
        } catch (InterruptedException e) { 
        } 
       } 
      } 

      public void surfaceCreated(SurfaceHolder holder) { 
       mThread.setRunning(true); 
       mThread.start(); 

      } 

      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
      } 
     }); 
    } 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      _coordX = coordX; 
      X = (int) event.getX(); 
      Y = (int) event.getY(); 

     } 
     if(event.getAction() == MotionEvent.ACTION_MOVE) 
     { 
      touchX = ((int) event.getX()); 
      touchY = (int) event.getY(); 
      //if (Math.abs(touchX - X) > 10){ 
      coordX = _coordX + (touchX - X); 
      invalidate(); 

      //} 
     } 
     if(event.getAction() == MotionEvent.ACTION_UP) 
     { 
      _coordX = coordX; 
      Y = touchY; 
     } 
     return true; 
    } 
    protected void onDraw(Canvas canvas) { 
     Paint paint = new Paint(); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.RED); 
     paint.setTextSize(20); 

     canvas.drawColor(Color.WHITE); 
     canvas.drawBitmap(fon, 0, 0, null); 
     canvas.drawBitmap(player, coordX, coordY, null); 
     canvas.drawBitmap(laser, coordLaserX, coordLaserY, null); 
     for (int i = 1; i<coordYlasers.size(); ++i){ 
      canvas.drawBitmap(laser, coordXlasers.get(i), coordYlasers.get(i), null); 
     } 
     canvas.drawText("" + V, 10, 25, paint); 
    } 

} 

应用的工作出色,但.... ,游戏崩溃。请帮助。错误,如果隐藏帆布游戏如果我隐藏应用

Logcat错误。

5553-5553/com.example.thetronuo.pregame E /AndroidRuntime﹕FATAL 例外:主要 java.lang.IllegalThreadStateException:主题已经开始。 at java.lang.Thread.start(Thread.java:1045) at com.example.thetronuo.pregame.GameView $ 1.surfaceCreated(GameView.java:161) at android.view.SurfaceView.updateWindow(SurfaceView.java :569) 在android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:231) 在android.view.View.dispatchWindowVisibilityChanged(View.java:7618) 在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039 ) 在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039) 在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039) 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1211) 在android.v iew.ViewRootImpl.doTraversal(ViewRootImpl.java:989) at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:4356) at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:749) at android.view.Choreographer.doCallbacks(Choreographer.java:562) at android.view.Choreographer.doFrame(Choreographer.java:532) at android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:735) at android.os.Handler.handleCallback(Handler.java:725) 在android.os.Handler.dispatchMessage(Handler.java:92) 在android.os.Looper.loop(Looper.java:137) 在机器人。 app.ActivityThread.main(ActivityThread.java:5099) at java.lang.reflect.Met hod.invokeNative(本机方法) 在java.lang.reflect.Method.invoke(Method.java:511) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:803) 在COM .android.internal.os.ZygoteInit.main(ZygoteInit.java:570) at dalvik.system.NativeStart.main(Native Method) 它是活动。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(new GameView(this)); 
} 

“等待()” - 未处理的异常。
在哪里写“resumeThread()”?

public class GameThread extends Thread 
     { 
      private GameView view; 
      private boolean pause = false; 

      private synchronized void check(){ 
       while(pause){ 
        wait(); 
       } 
      } 

      public void pauseThread(){ 
       pause = true; 
      } 

      public void resumeThread(){ 
       pause = false; 
       notify(); 
      } 
      public GameThread(GameView view) 
      { 
       this.view = view; 
      } 

回答

0

我想我有同样的问题。但我修好了。 把一本在你的Thread类:

private boolean pause = false; 

private synchronized void check(){ 
while(pause){ 
wait(); 
} 
} 

public void pauseThread(){ 
pause = true; 
} 

public void resumeThread(){ 
pause = false; 
notify(); 
} 

当onSurfaceDestroyed是叫你需要暂停与你已创建的方法的线程:pauseThread();

也调用方法check();在while循环,所以:

while(true){ 
check(); 
... other code ... 
} 

,并创建活动类的onResume()方法,所以每当用户打开回应用程序,它会自动调用这个方法,并把这个代码进入方法:

resumeThread(); 

我希望这会帮助你,即时通讯不知道这是否是所有的代码,你需要作为即时通讯不在家的那一刻,如果它不工作,生病有一个外观和编辑时,即时通讯在家里。