我的游戏线程出了什么问题?

时间:2014-03-10 13:56:16

标签: java android

我已经尝试了一段时间来实现游戏线程以利用循环来实现逻辑。我不久前在这里发了一个问题,希望没有人介意跟进。

我已经设法从我的研究中收集了这些代码:

public class GameView extends SurfaceView implements SurfaceHolder.Callback 
{
    class GameThread extends Thread 
    {
        //states
        public static final int STATE_LOSE = 1;

        public static final int STATE_PAUSE = 2;

        public static final int STATE_READY = 3;

        public static final int STATE_RUNNING = 4;

        private Paint m_paint;

        //canvas dimensions
        private int m_canvasWidth;

        private int m_canvasHeight;

        private long m_lastTime;

        private boolean m_run = false;

        private int m_mode;

        public ImageView ship;
        RelativeLayout.LayoutParams shipParams;

        // Handle to the surface manager
        private SurfaceHolder m_surfaceHolder;

        public GameThread(SurfaceHolder surfaceHolder, Context context, Handler handler)
        {
            m_surfaceHolder = surfaceHolder;
        }

        //Initialise the game
        public void doStart() 
        {

            synchronized (m_surfaceHolder)
            {
                resetGame();
                m_lastTime = System.currentTimeMillis() + 100;
                setState(STATE_RUNNING);
                ship = (ImageView) findViewById(R.id.imageView1);
                shipParams = (RelativeLayout.LayoutParams)ship.getLayoutParams();
            }
        }

        public void pause() 
        {
            synchronized (m_surfaceHolder) 
            {
                if (m_mode == STATE_RUNNING)
                setState(STATE_PAUSE);
            }
        }

        @Override
        public void run() 
        {
            while (m_run) 
            {
                Canvas c = null;
                try 
                {
                c = m_surfaceHolder.lockCanvas(null);
                synchronized (m_surfaceHolder) 
                    {
                        if (m_mode == STATE_RUNNING)
                        {
                            updateGame();
                        }
                        doDraw(c);
                    }
                }
                catch(Exception e){}
                finally 
                {

                    if (c != null) 
                    {
                        m_surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

        public void setRunning(boolean b) 
        {
            m_run = b;
        }


        public void setState(int mode) 
        {
            synchronized (m_surfaceHolder) 
            {
                setState(mode, null);
            }
        }


        public void setState(int mode, CharSequence message) 
        {
            synchronized (m_surfaceHolder) 
            {
                m_mode = mode;
            }
        }

        public void setPlayers(boolean onePlayer)
        {

        }


        public void setSurfaceSize(int width, int height) 
        {
            synchronized (m_surfaceHolder) 
            {
                m_canvasWidth = width;
                m_canvasHeight = height;
            }
        }


        public void unpause() 
        {
            synchronized (m_surfaceHolder) 
            {
                m_lastTime = System.currentTimeMillis() + 100;
            }
            setState(STATE_RUNNING);
        }


        private void doDraw(Canvas canvas)
        {
            canvas.drawARGB(255, 0, 0, 0);
        }

        private void updateGame() 
        {
            long now = System.currentTimeMillis();
            if (m_lastTime > now)
                return;
                double elapsed = (now - m_lastTime) / 1000.0;
                m_lastTime = now;
            System.out.print("HELLO WORLD");
            shipParams.topMargin++;
            ship.setLayoutParams(shipParams);
        }

        private boolean collided(Rect rectangle)
        {
            return false;
        }

        public boolean foundWinner()
        {
            return false;
        }

        public void resetGame()
        {

        }

        public void handleInput(MotionEvent event)
        {

        }
    }

    private Context m_context;

    private GameThread m_thread;

    private Handler m_handler;

    public GameView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);


        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        m_handler = new Handler() {
        @Override
        public void handleMessage(Message m) {

        Bundle b = m.getData();
        MotionEvent e = b.getParcelable("event");
        m_thread.handleInput(e);
        }
        };

        m_thread = new GameThread(holder, context, m_handler);
        setFocusable(true); 
    };


    public GameThread getThread() 
    {
        return m_thread;
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus)
    {
        if (!hasWindowFocus)
        m_thread.pause();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    {
        m_thread.setSurfaceSize(width, height);
    }


    public void surfaceCreated(SurfaceHolder holder)
    {
        if(m_thread.getState() == State.TERMINATED)
        {
            m_thread = new GameThread(getHolder(), m_context, m_handler);
            m_thread.setRunning(true);
            m_thread.start();
            m_thread.doStart();
        }
        else
        {
            m_thread.setRunning(true);
            m_thread.start();
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder)
    {
        boolean retry = true;
        m_thread.setRunning(false);
        while (retry) 
        {
            try 
            {
                m_thread.join();
                retry = false;
            } 
            catch (InterruptedException e) 
            {
            }
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        return true;
    }
}

我相当肯定我的问题就在这里,它只是一个合乎逻辑的问题。对我来说,一切似乎都很好,但我需要帮助。

我试图在第47行绘制图像,并在第153行的更新方法中定义了一个移动。我还放置了一条打印行以进行额外调试,但该行未显示。

我很难过。

任何帮助都会很棒,谢谢。

如果需要,以下是我的其他代码:

编辑:我应该注意到我在代码中没有出现任何类型的错误,它只是没有响应

2 个答案:

答案 0 :(得分:1)

您正在将m_run初始化为false,然后在run()方法的while循环中,您必须设置为true。将其更改为true,线程将正常工作。

答案 1 :(得分:1)

在doStart()过程中将 m_run 设置为 true