我遇到了这个问题。 我用画布绘制角色。
@Override
public void onDraw(Canvas canvas) {
this.mcanvas = canvas;
mcanvas.drawBitmap(mBg, null, mRect, mPaint);
for (int i = temps.size() - 1; i >= 0; i--) {
temps.get(i).onDraw(mcanvas);
}
for (Sprite sprite : sprites) {
sprite.onDraw(canvas);
}
while(timeleft>0) {
timeleft=(int) (timeleft-1);
score.onDraw(canvas,timeleft); break;
}
}
当我为此函数设置drawBitmap并且Thread类运行时。
@Override
public void run() {
long ticksPS = 1000 / FPS;
long startTime;
long sleepTime;
while (running) {
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(2);
} catch (Exception e) {
}
}
}
但是当我重播游戏时,logcat显示错误并关闭应用程序。
06-13 02:04:12.347: E/AndroidRuntime(956): FATAL EXCEPTION: Thread-94
06-13 02:04:12.347: E/AndroidRuntime(956): java.lang.NullPointerException
06-13 02:04:12.347: E/AndroidRuntime(956): at com.example.Boss.GameView.onDraw(GameView.java:353)
06-13 02:04:12.347: E/AndroidRuntime(956): at com.example.Boss.GameLoopThread.run(GameLoopThread.java:30)
它显示错误:
mcanvas.drawBitmap(mBg, null, mRect, mPaint);
和
view.onDraw(c);
我不知道发生了什么事。我需要帮助。提前谢谢!。
答案 0 :(得分:0)
for (Sprite sprite : sprites) {
sprite.onDraw(canvas);
}
尝试使用for-loop代替,我曾经在游戏中运行foreach循环2次或更多次时崩溃,还发布了更多细节:
for(int i =0; i< sprites.size(); i++){
Sprite s = sprites.get(i);
s.onDraw(canvas);
}
答案 1 :(得分:0)
错误似乎是mcanvas
是null
。 lockCanvas()
返回null
时可能会发生这种情况。请查看SurfcaeHolder.lockCanvas()
的文档说明:
如果尚未创建曲面或无法编辑曲面,则返回null。您通常需要实现Callback.surfaceCreated以找出Surface可供使用的时间。