сохранение состояния игры при сворачивании.

Ответить
Turalllb
Сообщения: 40
Зарегистрирован: 08 окт 2015, 17:48

сохранение состояния игры при сворачивании.

Сообщение Turalllb » 18 дек 2016, 20:49

В общем

Код: Выделить всё

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {

private static final String TAG= MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new DrawView(this));
    }


    class DrawView extends SurfaceView implements SurfaceHolder.Callback {

        private DrawThread drawThread;

        public DrawView(Context context) {
            super(context);
            getHolder().addCallback(this);
        }

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

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            drawThread = new DrawThread(getHolder());
            drawThread.setRunning(true);
            drawThread.start();
        }

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

        class DrawThread extends Thread {
            int x = 1;

            private boolean running = false;
            private SurfaceHolder surfaceHolder;

            public DrawThread(SurfaceHolder surfaceHolder) {
                this.surfaceHolder = surfaceHolder;
            }

            public void setRunning(boolean running) {
                this.running = running;
            }

            @Override
            public void run() {
                Canvas canvas;
                while (running) {
                    canvas = null;
                    try {
                        canvas = surfaceHolder.lockCanvas(null);
                        if (canvas == null)
                            continue;
                        canvas.drawColor(Color.GREEN);

                        x++;
                        System.out.println(x);
                    } finally {
                        if (canvas != null) {
                            surfaceHolder.unlockCanvasAndPost(canvas);
                        }
                    }
                }
            }
        }

    }

}
Игрушку делаю примерно с такой архитектурой, классы не вложенные только. Такая проблема : при сворачивании игры, всё начинается заново. Прочитал , что дефолтовые методы сохранения/восстановления умеют работать только с компонентами, которые имеют ID. т.е. если просто надеяться , что после OnResume всё продолжится с того же момента на котором свернул , то мы остаемся ни с чем. Как решают эти моменты в играх, где очень много переменных, объектов.. Неужели все переменные вручную сохранять в onSaveInstanceState? или как то придать ID всем переменным по мере их написания? Если вручную в основном классе MainActivity в onSaveInstanceState сохранять все переменные, то возникает другие проблемы: во-первых нужно создавать экземпляры всех классов, чтобы получить все их переменные (мне почему то кажется , что так не поступают) . Во-вторых если же мне нужно сохранить переменную с не основного потока , получается такая фигня: в момент сворачивания, получаю ошибку что переменной которую хочу сохранить нет(ссылку на нулевой объект) . Выход объявить эту переменную в главном классе и чтобы все остальные имели к ней доступ , но так ли делают ? В общем буду рад подробным разъяснениям

Ответить