我做了很好的搜索并尝试了很多东西,但无论我尝试做什么,只是赢了工作,游戏在启动时运行正常!但是一旦我关闭并重新打开就拒绝运行。它不需要继续,我很高兴它重新启动。崩溃日志告诉我它与我的线程有关。但我真的找不到该死的东西。任何帮助或建议都会很棒。
//游戏线程
import android.graphics.Canvas;
import android.view.SurfaceHolder;
public class GameThread extends Thread {
private boolean running;
private GameSurface gameSurface;
private SurfaceHolder surfaceHolder;
private Object mPauseLock = new Object();
private boolean mPaused;
public GameThread(GameSurface gameSurface, SurfaceHolder surfaceHolder) {
this.gameSurface= gameSurface;
this.surfaceHolder= surfaceHolder;
}
@Override
public void run() {
long startTime = System.nanoTime();
while(running) {
Canvas canvas= null;
try {
// Get Canvas from Holder and lock it.
canvas = this.surfaceHolder.lockCanvas();
// Synchronized
synchronized (canvas) {
this.gameSurface.update();
this.gameSurface.draw(canvas);
}
}catch(Exception e) {
// Do nothing.
} finally {
if(canvas!= null) {
// Unlock Canvas.
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}
long now = System.nanoTime() ;
// Interval to redraw game
// (Change nanoseconds to milliseconds)
long waitTime = (now - startTime)/1000000;
if(waitTime < 10) {
waitTime= 10; // Millisecond.
}
System.out.print(" Wait Time="+ waitTime);
try {
// Sleep.
this.sleep(waitTime);
} catch(InterruptedException e) {
}
synchronized (mPauseLock) {
while (mPaused) {
try {
mPauseLock.wait();
} catch (InterruptedException e){
}
}
}
startTime = System.nanoTime();
System.out.print(".");
}
}
public void onPause() {
synchronized (mPauseLock) {
mPaused = true;
}
}
public void onResume() {
synchronized (mPauseLock) {
mPaused = false;
mPauseLock.notifyAll();
}
}
public void setRunning(boolean running) {
this.running= running;
}
}
// GameSurface
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {
private GameThread gameThread;
private Player player;
private boolean mGameIsRunning;
public GameSurface(Context context) {
super(context);
// Make Game Surface focusable so it can handle events. .
this.setFocusable(true);
// Sét callback.
this.getHolder().addCallback(this);
}
public void update() {
this.player.update();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
player.setActionDown();
int movingVectorX =x- this.player.getX() ;
int movingVectorY =y- this.player.getY() ;
this.player.setMovingVector(movingVectorX,movingVectorY);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
player.setactionUp();
}
}, 100);
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
player.setactionUp();
}
return false;
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawColor(Color.parseColor("#eeeeee"));
this.player.draw(canvas);
}
// Implements method of SurfaceHolder.Callback
@Override
public void surfaceCreated(SurfaceHolder holder) {
Bitmap playerbitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.player);
this.player = new Player(this,playerbitmap,100,50);
this.gameThread = new GameThread(this,holder);
if (gameThread.getState() == Thread.State.TIMED_WAITING) {
gameThread.setRunning(false);
} else if (gameThread.getState() == Thread.State.TERMINATED) {
gameThread.setRunning(false);
} else {
this.gameThread.setRunning(true);
this.gameThread.start();
start();
}
}
public void start() {
if(!mGameIsRunning) {
gameThread.start();
mGameIsRunning = true;
} else {
gameThread.onResume();
}
}
// Implements method of SurfaceHolder.Callback
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
// Implements method of SurfaceHolder.Callback
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry= true;
while(retry) {
try {
this.gameThread.setRunning(false);
// Parent thread must wait until the end of GameThread.
this.gameThread.join();
}catch(InterruptedException e) {
e.printStackTrace();
}
retry= true;
}
}
}
:
if (gameThread.getState() == Thread.State.TIMED_WAITING) {
gameThread.setRunning(false);
} else if (gameThread.getState() == Thread.State.TERMINATED) {
gameThread.setRunning(false);
} else {
this.gameThread.setRunning(true);
this.gameThread.start();
start();
}
是我尝试让它发挥作用的最后一次尝试。我不知道自己做错了什么。感谢您提前提供任何帮助。
//记录:
12-11 07:10:39.631 E/AndroidRuntime(6488): FATAL EXCEPTION: Thread-2
12-11 07:10:39.631 E/AndroidRuntime(6488): Process: archtectsproductions.endlessrunner, PID: 6488
12-11 07:10:39.631 E/AndroidRuntime(6488): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:39.631 E/AndroidRuntime(6488): at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:39.631 E/AndroidRuntime(6488): at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 07:10:41.250 E/AndroidRuntime(6515): FATAL EXCEPTION: Thread-2
12-11 07:10:41.250 E/AndroidRuntime(6515): Process: archtectsproductions.endlessrunner, PID: 6515
12-11 07:10:41.250 E/AndroidRuntime(6515): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:41.250 E/AndroidRuntime(6515): at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:41.250 E/AndroidRuntime(6515): at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 07:10:48.881 E/AndroidRuntime(6573): FATAL EXCEPTION: Thread-2
12-11 07:10:48.881 E/AndroidRuntime(6573): Process: archtectsproductions.endlessrunner, PID: 6573
12-11 07:10:48.881 E/AndroidRuntime(6573): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:48.881 E/AndroidRuntime(6573): at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:48.881 E/AndroidRuntime(6573): at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 08:06:05.357 E/AndroidRuntime(9121): FATAL EXCEPTION: Thread-2
12-11 08:06:05.357 E/AndroidRuntime(9121): Process: archtectsproductions.myapplication, PID: 9121
12-11 08:06:05.357 E/AndroidRuntime(9121): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 08:06:05.357 E/AndroidRuntime(9121): at archtectsproductions.myapplication.GameView.onDraw(GameView.java:84)
12-11 08:06:05.357 E/AndroidRuntime(9121): at archtectsproductions.myapplication.GameLoopThread.run(GameLoopThread.java:28)
12-11 08:32:09.819 E/AndroidRuntime(12015): FATAL EXCEPTION: Thread-2
12-11 08:32:09.819 E/AndroidRuntime(12015): Process: archtectsproductions.walkingtest, PID: 12015
12-11 08:32:09.819 E/AndroidRuntime(12015): java.lang.AssertionError: Attempt to repark
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.lang.Thread.parkFor$(Thread.java:2143)
12-11 08:32:09.819 E/AndroidRuntime(12015): at sun.misc.Unsafe.park(Unsafe.java:325)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.LockSupport.park(LockSupport.java:161)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:840)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:873)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185)
12-11 08:32:09.819 E/AndroidRuntime(12015): at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
12-11 08:32:09.819 E/AndroidRuntime(12015): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:999)
12-11 08:32:09.819 E/AndroidRuntime(12015): at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:975)
12-11 08:32:09.819 E/AndroidRuntime(12015): at archtectsproductions.walkingtest.GameThread.run(GameThread.java:31)
12-11 08:50:28.534 E/AndroidRuntime(14071): FATAL EXCEPTION: main
12-11 08:50:28.534 E/AndroidRuntime(14071): Process: archtectsproductions.walkingtest, PID: 14071
12-11 08:50:28.534 E/AndroidRuntime(14071): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Thread$State java.lang.Thread.getState()' on a null object reference
12-11 08:50:28.534 E/AndroidRuntime(14071): at archtectsproductions.walkingtest.GameSurface.surfaceCreated(GameSurface.java:68)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.SurfaceView.updateWindow(SurfaceView.java:632)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:162)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2239)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1280)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6432)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.Choreographer.doCallbacks(Choreographer.java:686)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.Choreographer.doFrame(Choreographer.java:621)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.os.Handler.handleCallback(Handler.java:751)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.os.Handler.dispatchMessage(Handler.java:95)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.os.Looper.loop(Looper.java:154)
12-11 08:50:28.534 E/AndroidRuntime(14071): at android.app.ActivityThread.main(ActivityThread.java:6321)
12-11 08:50:28.534 E/AndroidRuntime(14071): at java.lang.reflect.Method.invoke(Native Method)
12-11 08:50:28.534 E/AndroidRuntime(14071): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
12-11 08:50:28.534 E/AndroidRuntime(14071): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
12-11 09:41:56.793 D/AndroidRuntime(19572): >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
12-11 09:41:56.795 D/AndroidRuntime(19572): CheckJNI is OFF
12-11 09:41:56.906 D/AndroidRuntime(19572): Calling main entry com.android.commands.am.Am
12-11 09:41:56.917 D/AndroidRuntime(19572): Shutting down VM
12-11 09:41:57.187 D/AndroidRuntime(19586): >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
12-11 09:41:57.189 D/AndroidRuntime(19586): CheckJNI is OFF
12-11 09:41:57.315 D/AndroidRuntime(19586): Calling main entry com.android.commands.am.Am