0

我正在开发我的第一个 Android 应用程序 - 蛇。现在我正在尝试为该应用程序实现“游戏结束”。所以基本上当蛇撞到墙上时,应用程序应该问你的名字,然后把你的分数放在 HiScore 上。好吧,我对撞墙碎片很感兴趣。我正在尝试使用线程,到目前为止,我还没有发现任何方法可以在不出错的情况下停止它。

我用谷歌搜索了很多,每个人都在说 thread.join(); 正在等待线程结束,那么结束每半秒绘制一次简单正方形的线程需要多长时间?当我在播放时按下手机上的后退按钮时,pause(); 功能完美。日志“游戏已结束”出现在 LogCat 上。

所以问题是当蛇撞到墙上时我无法停止此活动,日志“游戏已结束”永远不会发生。这是为什么?

我的代码:

public class SnakeCage extends SurfaceView implements Runnable{

    // blah blah .. functions that draw and stuff ..


    public void pause() {
        isRunning = false;
        while(true){
            try {
                aThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        aThread = null;
    Log.d("pause()","game has ended"); // <<<<<<<<<THIS ONE>>>>>>>>>
    }

    public void resume() {
        isRunning = true;       
        aThread = new Thread(this);
        aThread.start();
    }

    public void init(){
        // blah blah...
    }


    private void gameOver() {
    int pHeadX = snakeHead.posX;
    int pHeadY = snakeHead.posY;

        Log.d("gameOver()", "checking");

        if(pHeadY<0 || pHeadX<0 || pHeadX>23 || pHeadY>19){

            Log.d("gameOver()", "game now will end");
            gameOver = true;
        }
    }

    public void run() {

        while (isRunning){
            if(!aHolder.getSurface().isValid())
                continue;

            canvas = aHolder.lockCanvas();

            // drawing

            gameOver();
            if(gameOver) break;

            // more drawing 


            aHolder.unlockCanvasAndPost(canvas);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if(gameOver){
                 pause();
        }
    }

和活动类:

public class PlayingActivity extends Activity implements OnClickListener{

    SnakeCage v;
    Button snakeGoUp;
    Button snakeGoDown;
    Button snakeGoLeft;
    Button snakeGoRight;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     

        setContentView(R.layout.frame_layout);
        v = (SnakeCage)findViewById(R.id.sView);

        // listeners and stuff

    }


    @Override
    protected void onPause() {
        super.onPause();
        v.pause();
    }


    @Override
    protected void onResume() {
        super.onResume();
        v.resume();
    }


    @Override
    public void onClick(View view) {
        switch(view.getId()){

        case R.id.snakeUp:
            v.move(1);
            break;

        case R.id.snakeDown:
            v.move(2);
            break;

        case R.id.snakeLeft:
            v.move(3);
            break;

        case R.id.snakeRight:
            v.move(4);
            break;
        }

    }
}
4

2 回答 2

2

我已经做了:

Context context = getContext();
((PlayingActivity)context).finish();

从:

如何从 SurfaceView 类或嵌套线程中结束活动

虽然它不能满足我......现在已经足够了

于 2013-08-30T16:40:15.313 回答
1

我建议使用 LocalBroadcastManager 向 发送消息Activity,通知它杀死自己。您可以在其中有一个内部类Activity来接收广播并在Activity其中调用一个私有方法来结束它。

public class MyActivity extends Activity {

    public void onCreate(Bundle state) {
        LocalBroadcastManager.getInstance(this).registerReceiver(new MessageHandler(),
                                                             new IntentFilter("kill"));
    }

    private void killActivity() {
        finish();
    }

    public class MessageHandler extends BroadcastReceiver {
        onReceive(Context context, Intent intent) {
            killActivity();
        }

}

然后,您SurfaceView需要做的就是:

Intent intent = new Intent("kill");
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);

它的代码多一点,但恕我直言,它更干净。

于 2013-08-30T20:21:30.033 回答