当前位置: 首页 > 知识库问答 >
问题:

错误,如果隐藏画布-游戏

白高超
2023-03-14
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错误。

•致命异常:main java.lang.IllegalThreadStateException:线程已启动。在java.lang.thread.start(thread.java:1045)在com.example.theTronuo.pregame.gameView$1。SurfaceCreated(gameView.java:161)在Android.view.surfaceView.updateWindow(surfaceView.java:569)在Android.view.surfaceView.onWindowsIbilityChanged(surfaceView.onWindowsIbilityChanged(surfaceView.java:231)在Grapher$FrameDisplayEventReceiver.Run(choreographer.java:735)在Android.os.handler.handleCallback(handler.java:725)在Android.os.handler.dispatchMessage(handler.java:92)在Android.os.looper.loop(looper.java:137)在Android.app.activitythread.main(activitythread.java:5099)在java.lang.reflect.Method.invokenative(原生方法)在

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));
}

“wait()”-未处理的异常。
在哪里写入“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;
            }

共有1个答案

徐高懿
2023-03-14

我想我也有同样的问题。但我修好了。在Thread类中放一个this:

private boolean pause = false;

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

public void pauseThread(){
pause = true;
}

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

调用OnSurfaceDestromed时,需要使用您创建的方法暂停线程:pauseThread();

还可以调用方法check();在while-loop中,因此:

while(true){
 check();
... other code ...
}
resumeThread();
 类似资料:
  • 问题内容: 在iOS 11中,a中的隐藏动画的行为已更改,但是我无法在任何地方找到该文档。 iOS 10 iOS 11 两者中的代码是这样的: 如何在iOS 11上还原以前的行为? 问题答案: 只是有同样的问题。该修复程序将添加到动画块中。您要隐藏的物品的容器在哪里? 不确定为什么这在iOS 11中突然成为一个问题,但公平地说,这一直是推荐的方法。

  • 问题内容: 我正在尝试将Jenkins作业配置为连接到Altassian Stash。我正在为Jenkins 使用git插件。 这里的作业配置详细信息-在源代码管理下,选择git: 储存库网址:https://lab.xyz.com/stash/scm/projects/sandbox.git 凭证:jenkinuser / password(在Jenkins配置的全局凭证中定义) 我收到以下错误

  • 我是Android开发的新手。目前,我正在使用Firestore UI填充RecycerView。它可以正常工作,但现在我希望在RecycerView不包含数据或插入某些内容时动态隐藏/显示该视图。在我的适配器类中重写onDataChanged方法时,我注意到我可以正确地动态检测适配器中的项数是否为0。我如何使用它使我的RecycerView可见或不可见?

  • 我刚刚把我的超文本标记语言转换成WordPress。你可以在这里看到。我选择了每页显示一篇文章。 但是,我注意到我没有'Previous'链接和div。我现在只有'Next'链接和div。 如果我添加了'Previous'链接和div,我如何在我的主页中隐藏它(这里有最新的条目)?我如何在最后一个条目中隐藏“下一个”链接和div,而在最后一个条目页面中只显示“上一个”链接和div? 我想这个主题更

  • 如果侧边栏中没有内容,我想隐藏它们,不幸的是,有26.000个函数可以调用你的侧边栏,我对此并不感兴趣。我只想隐藏我的侧边栏,如果它们是空的,当它们包含小部件时显示它们。 现在我不确定是应该使用get_sidebar函数还是dynamic_sidebar函数。另外,我想知道我是否应该使用侧边栏的名称。php调用它或函数中的ID。php

  • 我有三个编辑文本字段。在这些字段中,我想只显示第一个字段的软输入键盘,并禁用后面两个字段,即日期和时间字段。 通过使用下面的代码,我可以禁用字段2和字段3的键盘,但当用户关注字段1时,键盘会出现,但当用户点击字段2或字段3时,键盘不会隐藏。虽然当第一次点击字段2或3时,不会出现键盘。 如果软输入键盘已打开,如何隐藏它?