Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android游戏中重新启动Java线程?_Java_Android_Java Threads - Fatal编程技术网

如何在Android游戏中重新启动Java线程?

如何在Android游戏中重新启动Java线程?,java,android,java-threads,Java,Android,Java Threads,我正在用Android创建一个演示游戏,用于学习。在游戏中,当两个物体之间发生碰撞时,我想显示一个“游戏结束”对话框。对话框中有一个“再次播放”按钮。按下时,螺纹应再次开始 我收到以下错误java.lang.IllegalThreadStateException:线程已启动 这是我的密码: public class GamePanel extends SurfaceView implements Runnable { private Thread thread = null;

我正在用Android创建一个演示游戏,用于学习。在游戏中,当两个物体之间发生碰撞时,我想显示一个“游戏结束”对话框。对话框中有一个“再次播放”按钮。按下时,螺纹应再次开始

我收到以下错误
java.lang.IllegalThreadStateException:线程已启动

这是我的密码:

public class GamePanel extends SurfaceView implements Runnable {

    private Thread thread = null;
    private Ball ball;
    private SurfaceHolder surfaceHolder;
    private Paint paint;
    private Canvas canvas;

    volatile boolean playing = true;

    private int hurdleCount = 3;
    private Hurdles[] hurdles;

    private int screenX, screenY;
    private Rect ball_detectCollision;

    public GamePanel(Context context, final int screenX, final int screenY) {
        super(context);

        ball = new Ball(context, screenX, screenY);
        surfaceHolder = getHolder();

        this.screenX = screenX;
        this.screenY = screenY;

        paint = new Paint();
        canvas = new Canvas();

        hurdles = new Hurdles[hurdleCount];
        for (int i = 0; i < hurdleCount; i++) {
            hurdles[i] = new Hurdles(context, screenX, screenY);
        }

        ball_detectCollision = new Rect(ball.getBall_x(), ball.getBall_y(), ball.getBitmap().getWidth(), ball.getBitmap().getHeight());
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                System.out.println("Surface Created");
                setUpdated_x(ball.getBall_x());
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

                System.out.println("Surface Changed");
                thread = new Thread(GamePanel.this);
                thread.start();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                System.out.println("Surface Destroyed");
            }
        });
    }

    public int getUpdated_x() {
        return updated_x;
    }

    public void setUpdated_x(int updated_x) {
        this.updated_x = updated_x;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        setUpdated_x((int) event.getX());

        switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_UP:

                break;

            case MotionEvent.ACTION_DOWN:

                initial_X = getUpdated_x();
                break;

            case MotionEvent.ACTION_MOVE:

                if (getUpdated_x() < screenX - ball.getBitmap().getWidth() || getUpdated_x() > screenX - ball.getBitmap().getWidth()) {
                    draw(getUpdated_x());
                }
                break;
        }
        return true;
    }

    private void draw(int updatedValue) {

        canvas = surfaceHolder.lockCanvas();
        canvas.drawColor(Color.RED);
        canvas.drawBitmap(ball.getBitmap(), updatedValue, ball.getBall_y(), paint);
        ball.setBall_x(updatedValue);

        ball_detectCollision.left = ball.getBall_x();
        ball_detectCollision.top = screenY - ball.getBitmap().getHeight() - 260;
        ball_detectCollision.right = ball.getBall_x() + ball.getBitmap().getWidth();
        ball_detectCollision.bottom = screenY - ball.getBitmap().getHeight() - 260 + ball.getBitmap().getHeight();

        for (int i = 0; i < hurdleCount; i++) {
            canvas.drawBitmap(hurdles[i].getBitmap(), hurdles[i].getX(), hurdles[i].getY(), paint);
        }
        surfaceHolder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void run() {

        while (playing) {
            update();
            draw(getUpdated_x());
            control();
        }
    }

    private void update() {

        for (int i = 0; i < hurdleCount; i++) {
            hurdles[i].update();

            if (Rect.intersects(getBall_detectCollision(), hurdles[i].getDetectCollision())) {
                System.out.println("Collision Detected");

                playing = false;
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        showGameOverMessage();

                    }
                });
            }
        }
    }


    public void pause() {

        playing = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void showGameOverMessage() {

        Toast.makeText(getContext(), "Game Over", Toast.LENGTH_SHORT).show();
        Dialog showDialog = new Dialog(getContext());
        showDialog.setContentView(R.layout.dialog_game_over);
        Button playAgainButton = (Button) showDialog.findViewById(R.id.playAgainButton);
        playAgainButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                playing = true;
                thread.start();
            }
        });
        showDialog.show();

    }
}
公共类游戏面板扩展SurfaceView实现可运行{
私有线程线程=null;
私人舞会;
私人地勤人员地勤人员;
私人油漆;
私人帆布;
易变布尔播放=真;
私有计数=3;
私人障碍[]障碍;
私人int screenX,screenY;
私人矩形球检测碰撞;
公共游戏面板(上下文上下文、最终整数屏幕X、最终整数屏幕Y){
超级(上下文);
球=新球(上下文、屏幕X、屏幕Y);
surfaceHolder=getHolder();
this.screenX=screenX;
this.screenY=screenY;
油漆=新油漆();
画布=新画布();
跨栏=新跨栏[跨栏数];
for(int i=0;iscreenX-ball.getBitmap().getWidth()){
绘制(getUpdated_x());
}
打破
}
返回true;
}
私有void draw(int updatedValue){
canvas=surfaceHolder.lockCanvas();
画布。drawColor(颜色。红色);
drawBitmap(ball.getBitmap(),updatedValue,ball.getBall_y(),paint);
ball.setBall_x(更新值);
ball_detectCollision.left=ball.getBall_x();
ball_detectCollision.top=screenY-ball.getBitmap().getHeight()-260;
ball_detectCollision.right=ball.getBall_x()+ball.getBitmap().getWidth();
ball_detectCollision.bottom=screenY-ball.getBitmap().getHeight()-260+ball.getBitmap().getHeight();
for(int i=0;i
无法重新启动已停止的线程。解决方案是简单地实例化一个新线程并启动它。

您不能重新启动已停止的线程。解决方案是简单地实例化一个新线程并启动它。

游戏结束后,只需停止线程并再次播放按钮即可启动一个新线程

如果需要保存上一个线程的任何实例,请将它们保存在外部变量中。无论如何,在这种情况下有很多选择

编辑

你完全停止了你的线程。当你想开始新游戏时,你只需要开始一个新的线程

我建议保留这样的函数并删除private void startGame() { // Start a new game playing = true; Thread thread = new Thread() { @Override public void run() { try { while (playing) { update(); draw(getUpdated_x()); control(); } } catch (InterruptedException e) { e.printStackTrace(); } } }; thread.start(); }