# SharedPreferences funktionieren nicht...



## apple_pie1998 (30. Sep 2016)

Hallo, 
ich versuche gerade mit SharedPreferences in einer Android-App etwas zu speichern. Das Problem ist, wenn ich mir in der GameView-Klasse mit getHighscore den Score ausgeben lasse, bekomme ich immer 0 zurück.  Außerdem stürtzt das Programm immer ab, sobald ich die safe-Methode aufrufe. Ich hoffe ihr könnt mir dabei helfen.


```
package ordicolor.ordicolor;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;


public class MainActivity extends Activity {

    int highscore;
    SharedPreferences prefHighScoresafe;
    SharedPreferences.Editor prefEditor;

    public MainActivity(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new GameView(this));
        prefHighScoresafe = this.getSharedPreferences("high", Context.MODE_PRIVATE);
        prefEditor = getPreferences(MODE_PRIVATE).edit();
        highscore = prefHighScoresafe.getInt("high",10);


    }


    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    @Override
    protected void onStop(){
        super.onStop();
    }

    public void setHighscore(int pHigh){
        highscore = pHigh;
    }

    public int getHighscore(){
        return highscore;
    }

    public void safe(){
        prefEditor.putInt("high",this.getHighscore());
        prefEditor.commit();
    }

}
```


----------



## Robat (1. Okt 2016)

Hallo apple_pie,

dein Problem liegt meiner Meinung nach darin, dass du deine Editor Variable falsch initialisierst. 
Wenn ich mich recht erinnere, müsste das ganze wie folgt aussehen:


```
SharedPreferences prefs;
SharedPreferences.Editor editor;

prefs = this.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);

editor = prefs.edit() // Hier liegt dein Fehler

highscore = prefs.get(..);
```


----------



## Tobse (1. Okt 2016)

Ich denke auch: du solltest edit() nur unmittelbar vor dem tatsächlichen schreiben aufrufen, dann ändern, dann commit(); und den Editor danach nicht mehr verwenden.


----------



## apple_pie1998 (1. Okt 2016)

Danke erstmal für eure Antworten. Ich habe stundenlang rumprobiert und mein Code ist jetzt folgender:

```
package ordicolor.ordicolor;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;


public class MainActivity extends Activity {

    int highscore;
    SharedPreferences prefHighScoresafe;
    SharedPreferences.Editor prefEditor;

    public MainActivity(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new GameView(this));
        prefHighScoresafe = this.getSharedPreferences("high", Context.MODE_PRIVATE);
        highscore = prefHighScoresafe.getInt("high",10);
    }

    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    @Override
    protected void onStop(){
        super.onStop();
    }

    public void setHighscore(int pHigh){
        highscore = pHigh;
    }

    public int getHighscore(){
        return highscore;
    }

    public void safe(){
        prefHighScoresafe = this.getSharedPreferences("high", Context.MODE_PRIVATE);
        prefEditor = prefHighScoresafe.edit();
        prefEditor.putInt("high",this.getHighscore());
        prefEditor.commit();
    }

}
```

Funktioniert aber nicht...


----------



## Tobse (1. Okt 2016)

Was heisst funktioniert nicht? Ich sehe in diesem Code nicht, dass irgendwo safe() aufgerufen wird. Dann wird natürlich auch nix gespeichert...

Poste mal mehr Code, bitte.


----------



## apple_pie1998 (1. Okt 2016)

Hier ist noch der Code aus der GameView. Ist sehr viel. die wichtigsten Methoden sind onDraw, onTouchEvent und zeit.

```
package ordicolor.ordicolor;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Random;

import static java.lang.String.valueOf;

public class GameView extends SurfaceView {


    private SurfaceHolder surfaceHolder;
    MainActivity main = new MainActivity();
    private Bitmap bmp1, bmp2 ,bmp3 ,bmp4 ,bmp5 ,bmp6 ,bmp7 ,bmp8;
    private Bitmap licht;
    private int y;
    private int direction, fortschritt, tlinks, trechts, rZaehler, blinken, etagenHoehe, etage, gefahren, rndEtage, zeitzaehler, rectBreite, cdGeschwindigkeit, screenW ,screenH, sollFahren, score, restartZaehler, btnGroesse, highscore;
    private GameLoopThread theGameLoopThread;
    private Sprite theSprite, theSprite2, theSprite3, theSprite4;
    private boolean amfahren, schaden, hoch, runter, fuellen, gameOver, speichern;
    Random rnd = new Random();
    Paint paint = new Paint();

    @SuppressLint("WrongCall") public GameView(Context context) {
        super(context);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {

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

                    }
                }

            }

            public void surfaceCreated(SurfaceHolder holder) {
                theGameLoopThread.setRunning(true);
                theGameLoopThread.start();
            }

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


            }

        });
        direction = 0;
        fortschritt = 0;
        tlinks = 0;
        trechts = 0;
        rZaehler = 0;
        blinken = 0;
        etagenHoehe = 0;
        etage = 0;
        gefahren = 0;
        rndEtage= 0;
        zeitzaehler = 0;
        rectBreite= 0;
        cdGeschwindigkeit = 0;
        screenW = 0;
        screenH = 0;
        sollFahren = 0;
        score = 0;
        amfahren = false;
        schaden = false;
        hoch = false;
        runter = false;
        fuellen = false;
        gameOver = false;
        speichern = false;
        screenW = main.getScreenWidth();
        screenH = main.getScreenHeight();
        btnGroesse = screenH / 6;

        bmp1 = BitmapFactory.decodeResource(getResources(),R.drawable.fahrstuhl,null);
        bmp1 = Bitmap.createScaledBitmap(bmp1,screenW, screenH * 8,true);
        etagenHoehe = bmp1.getHeight() / 8;
        gefahren = 0;
        bmp2 = BitmapFactory.decodeResource(getResources(),R.drawable.innen,null);
        bmp2 = Bitmap.createScaledBitmap(bmp2, screenW, screenH,true);
        bmp3 = BitmapFactory.decodeResource(getResources(),R.drawable.plus,null);
        bmp3 = Bitmap.createScaledBitmap(bmp3, btnGroesse, btnGroesse,true);
        bmp4 = BitmapFactory.decodeResource(getResources(),R.drawable.minus,null);
        bmp4 = Bitmap.createScaledBitmap(bmp4, btnGroesse, btnGroesse,true);
        bmp5 = BitmapFactory.decodeResource(getResources(),R.drawable.tuerlinks,null);
        bmp5 = Bitmap.createScaledBitmap(bmp5, screenW / 2, screenH,true);
        bmp6 = BitmapFactory.decodeResource(getResources(),R.drawable.tuerrechts,null);
        bmp6 = Bitmap.createScaledBitmap(bmp6, screenW / 2, screenH,true);
        bmp7 = BitmapFactory.decodeResource(getResources(),R.drawable.reparieren,null);
        bmp7 = Bitmap.createScaledBitmap(bmp7, btnGroesse, btnGroesse,true);
        bmp8 = BitmapFactory.decodeResource(getResources(),R.drawable.ordicolorgameover,null);
        bmp8 = Bitmap.createScaledBitmap(bmp8, screenW, screenH,true);
        licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
        trechts = bmp2.getWidth();
        tlinks = -bmp2.getWidth() / 2;
        theSprite = new Sprite(this, bmp3, 0, screenH - btnGroesse);
        theSprite2 = new Sprite(this, bmp4, screenW - btnGroesse , screenH - btnGroesse);
        theSprite3 = new Sprite(this, bmp7, (screenW/2)-(btnGroesse/2) , screenH - btnGroesse);
        theSprite4 = new Sprite(this, bmp8, 0, 0);
        theGameLoopThread = new GameLoopThread(this);
        rndEtage();
        paint.setTextSize(50);
        y = -etagenHoehe *7;
    }


    @Override
    protected void onDraw(Canvas canvas) {
        if(!gameOver){
            paint.setColor(Color.BLACK);
            canvas.drawBitmap(bmp1, 0, y, null);
            canvas.drawBitmap(bmp5,tlinks ,0, null);
            canvas.drawBitmap(bmp6,trechts ,0, null);
            canvas.drawBitmap(bmp2, 0, 0, null);
            canvas.drawBitmap(licht, 0, 0,null);
            theSprite.onDraw(canvas);
            theSprite2.onDraw(canvas);
            if(schaden){theSprite3.onDraw(canvas);}
            canvas.drawText(valueOf(etage),bmp2.getWidth() / 2 - 12, 68, paint);
            canvas.drawText(valueOf(rndEtage),bmp2.getWidth()- 80, bmp2.getHeight() / 2 + 19, paint);
            paint.setColor(Color.GREEN);
            canvas.drawRect(0 ,0 ,rectBreite,10,paint);
        }
        else{
            paint.setColor(Color.WHITE);
            canvas.drawRect(0 ,0 ,screenW,screenH,paint);
            paint.setColor(Color.RED);
            paint.setTextSize(100);
            canvas.drawText("Game Over",100, screenH/4, paint);
            paint.setColor(Color.BLACK);
            canvas.drawText("Score: " + valueOf(score), 100, screenH/4*2, paint);
            canvas.drawText("Highscore: " + valueOf(main.getHighscore()), 100, screenH/8*7, paint);
            theSprite4.onDraw(canvas);
        }



    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (getHolder()) {


                if (theSprite.isTouched(event.getX(), event.getY()) && etage < 7 && !runter) {
                    direction = 30;
                    gefahren = 0;
                    etage++;
                    fortschritt = 0;
                    amfahren = true;
                    hoch = true;
                    fuellen = true;
                    sollFahren += 1;
                }

                if (theSprite2.isTouched(event.getX(), event.getY()) && etage > 0 && !hoch) {
                    direction = -30;
                    gefahren = 0;
                    etage--;
                    fortschritt = 0;
                    amfahren = true;
                    runter = true;
                    fuellen = true;
                    sollFahren += 1;
                }


            if (theSprite3.isTouched(event.getX(), event.getY())) {
                rZaehler++;
            }

            if (theSprite4.isTouched(event.getX(), event.getY()) && gameOver && restartZaehler >= 150) {
                gameOver = false;
                rectBreite = 0;
                paint.setTextSize(50);
                y = -etagenHoehe * 7;
                etage = 0;
                score = 1;
                schaden = false;
                cdGeschwindigkeit = 0;
                restartZaehler = 0;
                sollFahren = 0;
                licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                main.safe();
            }

        }
        return false;
    }


    //Testet, ob der Fahrstuhl die gewünschte Etage errreicht hat und hält ihn an.
    public void fahren(){

        if(amfahren){
            if(fortschritt == 0){
                schliessen();
            }
            if(fortschritt == 1){
                schaden();
            }
            if(fortschritt == 2){
                bewegen();
            }
            if(fortschritt == 3){
                oeffnen();
            }
        }
        else{
            rndEtage();
        }

        if(gameOver){
            restartZaehler++;
        }

    }

    //schließt die Tür
    public void schliessen(){

            if(tlinks < 0){
                tlinks += 20;
                trechts -= 20;
            }
            else{
                tlinks += 4;
                trechts -= 4;
                fortschritt = 1;
                runter = true;
                hoch = true;
            }
    }


    //Steuert den Schaden des Aufzugs.
    public void schaden(){

            if(!schaden){
                if(rnd.nextInt(4 - -1) == 1){
                    schaden = true;
                    rZaehler = 0;
                }
                else{

                    fortschritt = 2;
                }
            }
            else{
                blinken++;
                fuellen = false;
                if(10 <= rZaehler){
                    schaden = false;
                    fortschritt = 2;
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                }
                if(blinken ==10){
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                }
                if(blinken ==20){
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.licht,null);
                    licht = Bitmap.createScaledBitmap(licht, screenW, screenH,true);
                    blinken = 0;
                }
            }

    }


    //Bewegt den Aufzug.
    public void bewegen(){


        fuellen = true;
        if(direction != 0){
            y += direction;
            gefahren += 30;
        }
        if(gefahren >= etagenHoehe * sollFahren) {
            direction = 0;
            fortschritt = 3;
            tlinks -= 4;
            trechts += 4;
            sollFahren = 0;
        }

    }


    //Öffnet die Tür.
    public void oeffnen(){

            if(tlinks > -600){
                tlinks -= 20;
                trechts += 20;
            }
            else{
                amfahren = false;
                fortschritt = 0;
                runter = false;
                hoch = false;
                fuellen = false;
            }

    }

    public void rndEtage(){
        if(etage == rndEtage && !gameOver) {
            rndEtage = rnd.nextInt(7 - -1);
            rectBreite = 0;
            cdGeschwindigkeit++;
            score++;
        }
    }


    //Hier wird die Zeit, die der Spieler zum drücken hat verwaltet.
    public void zeit(){
        if(!fuellen){
            if(zeitzaehler >= 10){
                rectBreite +=30;
                zeitzaehler = cdGeschwindigkeit;
            }
            else{
                zeitzaehler++;
            }
            if(rectBreite >= screenW){
                fortschritt = 3;
                gameOver = true;
                if(main.getHighscore() < score){
                    main.setHighscore(highscore);
                }
            }
        }
    }

}
```


----------



## Robat (1. Okt 2016)

Was bedeutet denn funktioniert nicht?
Gibt es eine Fehlermeldung? Wenn ja welche?


----------



## apple_pie1998 (2. Okt 2016)

Nein, gibt leider keine.


----------



## Robat (2. Okt 2016)

Dann schau mal mit bspw. Log.d() nach, ob deine if Verzweigung , wo die main.safe() aufrufst, überhaupt ausgeführt wird.

Edit: mir ist gerade beim überfliegen aufgefallen, dass du a) deinen Highscore in der GameView nirgendswo initialisierst(oder ich hab es übersehen?) Und b)  du in deiner Zeit Methode am Ende zwar überprüfst ob der Score größer ist als der highscore aber dennoch am Ende wieder den highscore als Parameter an setHighscore übergibst anstatt Score.


----------



## apple_pie1998 (2. Okt 2016)

Also Safe wird auf jeden Fall ausgeführt. Die App stürzt an dieser Stelle ab: prefEditor = prefHighScoresafe.edit();


----------



## Tobse (2. Okt 2016)

Also stützt die App doch ab? Dann *MUSS* es eine Fehlermeldung geben. Siehe Logcat.


----------



## apple_pie1998 (2. Okt 2016)

Auf dem Handy steht App angehalten, aber im Android Studio steht, dass die App fehlerfrei läuft.


----------



## Robat (2. Okt 2016)

Wie Tobse schon sagte: wenn die App abstürzt  / angehalten wird, dann muss zwangsläufig irgendwo eine Fehlermeldung auftauchen. Überprüfe noch mal in deinem Logcat Pop-Up, ob du auch wirklich den richtigen Emulator / die richtige App ausgewählt hast (Drop-Down-Menu in der oberen linken Ecke).


----------



## apple_pie1998 (2. Okt 2016)

Sooooo. Ich habs jetzt mal über einen anderen Emulator laufen lassen und der gibt mir jetzt auch eine Fehlermeldung. Keine Ahnung, warum der andere das nicht gemacht hat...

```
10-02 09:48:02.563 2202-2202/ordicolor.ordicolor E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: ordicolor.ordicolor, PID: 2202
                                                                   java.lang.NullPointerException
                                                                       at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:173)
                                                                       at ordicolor.ordicolor.MainActivity.safe(MainActivity.java:50)
                                                                       at ordicolor.ordicolor.GameView.onTouchEvent(GameView.java:200)
                                                                       at android.view.View.dispatchTouchEvent(View.java:7706)
                                                                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                                       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                                       at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
                                                                       at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
                                                                       at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
                                                                       at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
                                                                       at android.view.View.dispatchPointerEvent(View.java:7886)
                                                                       at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
                                                                       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
                                                                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                                       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                                       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
                                                                       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                                       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
                                                                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                                       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                                       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                                       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                                       at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
                                                                       at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
                                                                       at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
                                                                       at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
                                                                       at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                       at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                       at android.os.MessageQueue.next(MessageQueue.java:138)
                                                                       at android.os.Looper.loop(Looper.java:123)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5017)
                                                                       at java.lang.reflect.Method.invokeNative(Native Method)
                                                                       at java.lang.reflect.Method.invoke(Method.java:515)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                                       at dalvik.system.NativeStart.main(Native Method)
```

Wenn ich das richtig verstehe, gibt es die Datei nicht, in der gespeichert werden soll...


----------



## Robat (2. Okt 2016)

Das liegt daran, dass du getSharedPrefernces() nur aufrufen kannst, nachdem onCreate() aufgerufen wurde.
Da du aber versuchst in safe() getSharedPreferences() aufzurufen, gibt er dir diese Nullpointerexception.
Versuch mal in deine safe() Methode als Parameter den Context mit einzuabauen. Wenn du die Methode dann in deiner GameView aufrufst, einfach den Context übergeben, den du im GameView Contructor hast. (globale Context Variable anlegen und this.context = context; )

Edit: Was ich vergessen habe zu sagen: Über den Context kannst du dann in der safe methode getSharedPreferences() aufrufen


----------



## apple_pie1998 (2. Okt 2016)

Danke ! Ich hab zum ersten mal seit 3 Tagen einen Fortschritt gemacht. Es speichert jetzt ohne Fehler und liest den score in der onCreate() Methode auch richtig aus, aber trotzdem ist der score, wenn man ihn sich ausgeben lässt, wieder 100. Ich vermute mal, dass das daran liegt, dass wenn ich in der GameView main erstelle auch wieder der highscore in der MainActivity auf 100 gesetzt wird. Wenn ja, wie kann man das verhindern ?
Das ist der aktuelle Code:

```
package ordicolor.ordicolor;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;


public class MainActivity extends Activity {

    int highscore = 100;
    SharedPreferences pref;
    SharedPreferences.Editor prefEditor;

    public MainActivity(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new GameView(this));
        pref = this.getSharedPreferences("high", Context.MODE_PRIVATE);
        highscore = pref.getInt("high",2);
    }

    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    @Override
    protected void onStop(){
        super.onStop();
    }

    public void setHighscore(int pHigh){
        highscore = pHigh;
    }

    public int getHighscore(){
        return highscore;
    }

    public void safe(Context pContext){
        pref = pContext.getSharedPreferences("high", Context.MODE_PRIVATE);
        prefEditor = pref.edit();
        prefEditor.putInt("high",this.getHighscore());
        prefEditor.commit();
    }

}
```


```
package ordicolor.ordicolor;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Random;

import static java.lang.String.valueOf;

public class GameView extends SurfaceView {


    private SurfaceHolder surfaceHolder;
    MainActivity main = new MainActivity();
    private Bitmap bmp1, bmp2 ,bmp3 ,bmp4 ,bmp5 ,bmp6 ,bmp7 ,bmp8;
    private Bitmap licht;
    private int y;
    private int direction, fortschritt, tlinks, trechts, rZaehler, blinken, etagenHoehe, etage, gefahren, rndEtage, zeitzaehler, rectBreite, cdGeschwindigkeit, screenW ,screenH, sollFahren, score, restartZaehler, btnGroesse, highscore;
    private GameLoopThread theGameLoopThread;
    private Sprite theSprite, theSprite2, theSprite3, theSprite4;
    private boolean amfahren, schaden, hoch, runter, fuellen, gameOver;
    Random rnd = new Random();
    Paint paint = new Paint();
    public Context context = this.getContext();

    @SuppressLint("WrongCall") public GameView(Context context) {
        super(context);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {

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

                    }
                }

            }

            public void surfaceCreated(SurfaceHolder holder) {
                theGameLoopThread.setRunning(true);
                theGameLoopThread.start();
            }

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


            }

        });
        direction = 0;
        fortschritt = 0;
        tlinks = 0;
        trechts = 0;
        rZaehler = 0;
        blinken = 0;
        etagenHoehe = 0;
        etage = 0;
        gefahren = 0;
        rndEtage= 0;
        zeitzaehler = 0;
        rectBreite= 0;
        cdGeschwindigkeit = 0;
        screenW = 0;
        screenH = 0;
        sollFahren = 0;
        score = 0;
        amfahren = false;
        schaden = false;
        hoch = false;
        runter = false;
        fuellen = false;
        gameOver = false;
        screenW = main.getScreenWidth();
        screenH = main.getScreenHeight();
        btnGroesse = screenH / 6;
        context = this.context;

        bmp1 = BitmapFactory.decodeResource(getResources(),R.drawable.fahrstuhl,null);
        bmp1 = Bitmap.createScaledBitmap(bmp1,screenW, screenH * 8,true);
        etagenHoehe = bmp1.getHeight() / 8;
        gefahren = 0;
        bmp2 = BitmapFactory.decodeResource(getResources(),R.drawable.innen,null);
        bmp2 = Bitmap.createScaledBitmap(bmp2, screenW, screenH,true);
        bmp3 = BitmapFactory.decodeResource(getResources(),R.drawable.plus,null);
        bmp3 = Bitmap.createScaledBitmap(bmp3, btnGroesse, btnGroesse,true);
        bmp4 = BitmapFactory.decodeResource(getResources(),R.drawable.minus,null);
        bmp4 = Bitmap.createScaledBitmap(bmp4, btnGroesse, btnGroesse,true);
        bmp5 = BitmapFactory.decodeResource(getResources(),R.drawable.tuerlinks,null);
        bmp5 = Bitmap.createScaledBitmap(bmp5, screenW / 2, screenH,true);
        bmp6 = BitmapFactory.decodeResource(getResources(),R.drawable.tuerrechts,null);
        bmp6 = Bitmap.createScaledBitmap(bmp6, screenW / 2, screenH,true);
        bmp7 = BitmapFactory.decodeResource(getResources(),R.drawable.reparieren,null);
        bmp7 = Bitmap.createScaledBitmap(bmp7, btnGroesse, btnGroesse,true);
        bmp8 = BitmapFactory.decodeResource(getResources(),R.drawable.ordicolorgameover,null);
        bmp8 = Bitmap.createScaledBitmap(bmp8, screenW, screenH,true);
        licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
        trechts = bmp2.getWidth();
        tlinks = -bmp2.getWidth() / 2;
        theSprite = new Sprite(this, bmp3, 0, screenH - btnGroesse);
        theSprite2 = new Sprite(this, bmp4, screenW - btnGroesse , screenH - btnGroesse);
        theSprite3 = new Sprite(this, bmp7, (screenW/2)-(btnGroesse/2) , screenH - btnGroesse);
        theSprite4 = new Sprite(this, bmp8, 0, 0);
        theGameLoopThread = new GameLoopThread(this);
        rndEtage();
        paint.setTextSize(50);
        y = -etagenHoehe *7;
    }


    @Override
    protected void onDraw(Canvas canvas) {
        if(!gameOver){
            paint.setColor(Color.BLACK);
            canvas.drawBitmap(bmp1, 0, y, null);
            canvas.drawBitmap(bmp5,tlinks ,0, null);
            canvas.drawBitmap(bmp6,trechts ,0, null);
            canvas.drawBitmap(bmp2, 0, 0, null);
            canvas.drawBitmap(licht, 0, 0,null);
            theSprite.onDraw(canvas);
            theSprite2.onDraw(canvas);
            if(schaden){theSprite3.onDraw(canvas);}
            canvas.drawText(valueOf(etage),bmp2.getWidth() / 2 - 12, 68, paint);
            canvas.drawText(valueOf(rndEtage),bmp2.getWidth()- 80, bmp2.getHeight() / 2 + 19, paint);
            paint.setColor(Color.GREEN);
            canvas.drawRect(0 ,0 ,rectBreite,10,paint);
        }
        else{
            paint.setColor(Color.WHITE);
            canvas.drawRect(0 ,0 ,screenW,screenH,paint);
            paint.setColor(Color.RED);
            paint.setTextSize(100);
            canvas.drawText("Game Over",100, screenH/4, paint);
            paint.setColor(Color.BLACK);
            canvas.drawText("Score: " + valueOf(score), 100, screenH/4*2, paint);
            canvas.drawText("Highscore: " + valueOf(main.getHighscore()), 100, screenH/8*7, paint);
            theSprite4.onDraw(canvas);
        }



    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (getHolder()) {


                if (theSprite.isTouched(event.getX(), event.getY()) && etage < 7 && !runter) {
                    direction = 30;
                    gefahren = 0;
                    etage++;
                    fortschritt = 0;
                    amfahren = true;
                    hoch = true;
                    fuellen = true;
                    sollFahren += 1;
                }

                if (theSprite2.isTouched(event.getX(), event.getY()) && etage > 0 && !hoch) {
                    direction = -30;
                    gefahren = 0;
                    etage--;
                    fortschritt = 0;
                    amfahren = true;
                    runter = true;
                    fuellen = true;
                    sollFahren += 1;
                }


            if (theSprite3.isTouched(event.getX(), event.getY())) {
                rZaehler++;
            }

            if (theSprite4.isTouched(event.getX(), event.getY()) && gameOver && restartZaehler >= 150) {
                gameOver = false;
                rectBreite = 0;
                paint.setTextSize(50);
                y = -etagenHoehe * 7;
                etage = 0;
                score = 1;
                schaden = false;
                cdGeschwindigkeit = 0;
                restartZaehler = 0;
                sollFahren = 0;
                licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                main.safe(context);
            }

        }
        return false;
    }


    //Testet, ob der Fahrstuhl die gewünschte Etage errreicht hat und hält ihn an.
    public void fahren(){

        if(amfahren){
            if(fortschritt == 0){
                schliessen();
            }
            if(fortschritt == 1){
                schaden();
            }
            if(fortschritt == 2){
                bewegen();
            }
            if(fortschritt == 3){
                oeffnen();
            }
        }
        else{
            rndEtage();
        }

        if(gameOver){
            restartZaehler++;
        }

    }

    //schließt die Tür
    public void schliessen(){

            if(tlinks < 0){
                tlinks += 20;
                trechts -= 20;
            }
            else{
                tlinks += 4;
                trechts -= 4;
                fortschritt = 1;
                runter = true;
                hoch = true;
            }
    }


    //Steuert den Schaden des Aufzugs.
    public void schaden(){

            if(!schaden){
                if(rnd.nextInt(4 - -1) == 1){
                    schaden = true;
                    rZaehler = 0;
                }
                else{

                    fortschritt = 2;
                }
            }
            else{
                blinken++;
                fuellen = false;
                if(10 <= rZaehler){
                    schaden = false;
                    fortschritt = 2;
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                }
                if(blinken ==10){
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.lichtzwei,null);
                }
                if(blinken ==20){
                    licht = BitmapFactory.decodeResource(getResources(),R.drawable.licht,null);
                    licht = Bitmap.createScaledBitmap(licht, screenW, screenH,true);
                    blinken = 0;
                }
            }

    }


    //Bewegt den Aufzug.
    public void bewegen(){


        fuellen = true;
        if(direction != 0){
            y += direction;
            gefahren += 30;
        }
        if(gefahren >= etagenHoehe * sollFahren) {
            direction = 0;
            fortschritt = 3;
            tlinks -= 4;
            trechts += 4;
            sollFahren = 0;
        }

    }


    //Öffnet die Tür.
    public void oeffnen(){

            if(tlinks > -600){
                tlinks -= 20;
                trechts += 20;
            }
            else{
                amfahren = false;
                fortschritt = 0;
                runter = false;
                hoch = false;
                fuellen = false;
            }

    }

    public void rndEtage(){
        if(etage == rndEtage && !gameOver) {
            rndEtage = rnd.nextInt(7 - -1);
            rectBreite = 0;
            cdGeschwindigkeit++;
            score++;
        }
    }


    //Hier wird die Zeit, die der Spieler zum drücken hat verwaltet.
    public void zeit(){
        if(!fuellen){
            if(zeitzaehler >= 10){
                rectBreite +=30;
                zeitzaehler = cdGeschwindigkeit;
            }
            else{
                zeitzaehler++;
            }
            if(rectBreite >= screenW){
                fortschritt = 3;
                gameOver = true;
                if(main.getHighscore() < score){
                main.setHighscore(score);
                }
            }
        }
    }

}
```


----------



## Robat (2. Okt 2016)

Ich verstehe nicht ganz, warum du den Highscore intialisierst. 
Lt. android.developer seite ist getInt() so definiert:


> getInt(String key, int defValue)
> 
> Retrieve an int value from the preferences.



Also änder doch int highsocre = 100; ab zu int highscore; und initialisiere highscore in der onCreate() einfach so: highscore = pref.getInt("highsocre", 100);. So hast du doch für alles gesorgt.
Sprich wenn der highscore gesetzt ist, dann wird er aus der Pref ausgelesen und wenn er nicht gesetzt ist bekommt er den defValue 100.
Sollte reichen, oder?


----------



## apple_pie1998 (2. Okt 2016)

Ich habs endlich gelöst !!! Das = 100 setzen war nur zum testen. Ich habs jetzt einfach so gelöst, dass ich mir den Highscore hole bevor ich die GameView erstelle und den Highscore als Parameter an den GameView übergebe und dann mit dem GameView den Highscore von main setze. Also so: 

```
public class MainActivity extends Activity {

    int highscore;
    SharedPreferences pref;
    SharedPreferences.Editor prefEditor;

    public MainActivity(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        pref = this.getSharedPreferences("high", Context.MODE_PRIVATE);
        highscore = pref.getInt("high",2);
        super.onCreate(savedInstanceState);
        setContentView(new GameView(this, highscore));
    }
```

Vielen dank euch beiden ! Ihr habt mir echt sehr geholfen. Ich pack euch in die Credits, falls ich das Spiel mal fertigstellen sollte


----------

