SharedPreferences funktionieren nicht...

apple_pie1998

Mitglied
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.

Java:
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

Top Contributor
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:

Java:
SharedPreferences prefs;
SharedPreferences.Editor editor;

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

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

highscore = prefs.get(..);
 

Tobse

Top Contributor
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

Mitglied
Danke erstmal für eure Antworten. Ich habe stundenlang rumprobiert und mein Code ist jetzt folgender:
Java:
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

Top Contributor
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

Mitglied
Hier ist noch der Code aus der GameView. Ist sehr viel. die wichtigsten Methoden sind onDraw, onTouchEvent und zeit.
Java:
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

Top Contributor
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.
 
Zuletzt bearbeitet:

Robat

Top Contributor
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

Mitglied
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...
Code:
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

Top Contributor
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
 
Zuletzt bearbeitet:

apple_pie1998

Mitglied
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:
Java:
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();
    }

}

Java:
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

Top Contributor
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

Mitglied
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:
Java:
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 :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Android SharedPreferences wenn App auf externem Speicher klappt nicht Android & Cross-Platform Mobile Apps 0
J SharedPreferences für User-Session Android & Cross-Platform Mobile Apps 2
C SharedPreferences und int Android & Cross-Platform Mobile Apps 5
CT9288 Zufällige Zahlengenerierung scheint nicht richtig zu funktionieren Android & Cross-Platform Mobile Apps 5
V Android Wird mein Vorhaben funktionieren? (Apk Datei decompilieren, bearbeiten, compilieren) Android & Cross-Platform Mobile Apps 2
A Commands funktionieren manchmal nicht Android & Cross-Platform Mobile Apps 11
W MoveEvent reagiert nicht Game Android & Cross-Platform Mobile Apps 1
W Reward Ads AdMob wird nicht ausgeliefert. Android & Cross-Platform Mobile Apps 9
W Cookie Manger übermittelt nicht Android & Cross-Platform Mobile Apps 1
J Spinner wird nicht aktualisiert Android & Cross-Platform Mobile Apps 6
M PythonInterpreter funktioniert nicht richtig NoClassDefFoundError Android & Cross-Platform Mobile Apps 1
W Frisch generiertes Projekt Value nicht findbar NavController Drawer Android & Cross-Platform Mobile Apps 12
ImageView wird nicht angezeigt Android & Cross-Platform Mobile Apps 4
W WebView Linkvertise lädt nicht richtig oder bleibt grau Android & Cross-Platform Mobile Apps 10
W AlertDialog Eigenschaften existiert nicht mehr. Android & Cross-Platform Mobile Apps 14
W Wieso gehen Log nicht im Service? Android & Cross-Platform Mobile Apps 20
R Android Do not disturb: Sound wird nicht abgespielt Android & Cross-Platform Mobile Apps 2
O Google Admob Ad wird nicht geladen und App stürzt ab Android & Cross-Platform Mobile Apps 1
I Android ListView (Custom) soll auf Hardwaretasten nicht reagieren. Android & Cross-Platform Mobile Apps 10
M App crasht und ich bekomme es nicht behoben.:( Android & Cross-Platform Mobile Apps 17
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
R Android Visualizer engine kann nicht initialisiert werden Android & Cross-Platform Mobile Apps 3
OSchriever Navigation drawer Strings ändern sich nicht Android & Cross-Platform Mobile Apps 0
W Code läuft unter SDK 27 aber nicht SDK 30 Android & Cross-Platform Mobile Apps 17
N Android Ich kann mit meiner App nicht auf die Datenbank zugreifen Android & Cross-Platform Mobile Apps 4
A GraphView => X- und Y-Achse wird nicht angezeigt Android & Cross-Platform Mobile Apps 5
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
W Android Wieso geht getApplicationContext() bei Toast, aber nicht bei AlertDialog.Builder? Android & Cross-Platform Mobile Apps 36
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
J Download und speichern mit jsch klappt nicht Android & Cross-Platform Mobile Apps 5
J Service starte nicht mehr Android & Cross-Platform Mobile Apps 13
Arif Android Radiobutton wird nicht deaktiviert Android & Cross-Platform Mobile Apps 1
Arif Android Canvas wird nicht gezeichnet? Android & Cross-Platform Mobile Apps 0
J Notification wird nicht angezeigt wenn App nicht offen ist. Android & Cross-Platform Mobile Apps 6
J Firebase und Emulator startet nicht Android & Cross-Platform Mobile Apps 2
L ListView aktuallisiert sich nicht Android & Cross-Platform Mobile Apps 15
J ArrayAdapter zeigt Liste nicht an Android & Cross-Platform Mobile Apps 0
L Android Animationen werden nicht angezeigt Android & Cross-Platform Mobile Apps 0
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
W Preview wird nicht korrekt angezeigt Android & Cross-Platform Mobile Apps 0
B Profilpic wird nach anmeldung nicht angezeigt. Android & Cross-Platform Mobile Apps 2
K Methode wird nicht gefunden Android & Cross-Platform Mobile Apps 1
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
K Log.v geht nicht Android & Cross-Platform Mobile Apps 4
J Kamera - Foto wird nicht gespeichert Android & Cross-Platform Mobile Apps 2
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
L Android Java scheint XML nicht zu finden Android & Cross-Platform Mobile Apps 11
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
B Android osmdroid möchte nicht das es mapnik herunterlädt Android & Cross-Platform Mobile Apps 2
S Android neue Version des Programms wird nicht in Emulator geladen Android & Cross-Platform Mobile Apps 1
B Android Textdatei laden (klappt nicht) Android & Cross-Platform Mobile Apps 4
O Android Switch Widget wird nicht angezeigt Android & Cross-Platform Mobile Apps 1
M Android ListView wird nicht dargestellt Android & Cross-Platform Mobile Apps 2
S Android null pointer (ich verstehs nicht) Android & Cross-Platform Mobile Apps 2
S Android Emulator startet nicht vollständig. Android & Cross-Platform Mobile Apps 0
S Neue Activity lässt sich nicht starten Android & Cross-Platform Mobile Apps 28
M Notification nicht mehr senden nachdem sie geklickt wurde Android & Cross-Platform Mobile Apps 0
D Android Tabs nutzen - PagerTitleStrip haut nicht hin Android & Cross-Platform Mobile Apps 4
K MediaPlayer Soundklasse Start und Stop (stop funktioniert nicht) Android & Cross-Platform Mobile Apps 1
O Android Anfänger: Quellcode nicht gefunden Android & Cross-Platform Mobile Apps 3
B Timer geht nicht Android & Cross-Platform Mobile Apps 2
S Umlaute werden trotz UTF-8 nicht angezeigt? Android & Cross-Platform Mobile Apps 6
S SPLIT funktion bei STRING funktioniert nicht! Android & Cross-Platform Mobile Apps 4
J Android Breaking Point in Eclipse hält nicht an? Android & Cross-Platform Mobile Apps 5
J Android SimpleDateFormat parser funktioniert nicht richtig? Android & Cross-Platform Mobile Apps 4
L Android Apache POI: Datei speichern geht nicht Android & Cross-Platform Mobile Apps 1
Y Erstes kleines Android Programm will nicht so recht... Android & Cross-Platform Mobile Apps 1
S Foto-app hält galerie nicht aktuell Android & Cross-Platform Mobile Apps 9
D Man sieht nicht ob Button gedrückt wurde! Android & Cross-Platform Mobile Apps 10
L Android Multitouch will einfach nicht, was mach ich falsch? Android & Cross-Platform Mobile Apps 1
B AlarmManager triggert nicht jede Stunde Android & Cross-Platform Mobile Apps 7
B Erste Android-App: setContentView(R.layout.main) funktioniert nicht Android & Cross-Platform Mobile Apps 6
N Android EditText.setError() funktioniert nicht nach Rotation Android & Cross-Platform Mobile Apps 1
K OnItemLongClickListener in ListActivity spricht nicht an Android & Cross-Platform Mobile Apps 8
N Android Display nicht löschen bzw. neu laden Android & Cross-Platform Mobile Apps 2
J Handy bootet nicht mehr richtig Android & Cross-Platform Mobile Apps 2
D Android OnClickListener funktioniert auf LinearLayout nicht Android & Cross-Platform Mobile Apps 6
X Android Warum werden Views nicht gefunden? Android & Cross-Platform Mobile Apps 4
D Android App startet nicht Android & Cross-Platform Mobile Apps 24
F Android ArrayList nicht funktional in Android!? Android & Cross-Platform Mobile Apps 6
E Datenbankanfrage findet Tabel nicht Android & Cross-Platform Mobile Apps 3
S Android LogCat Ausgaben in Schleife geht nicht? Android & Cross-Platform Mobile Apps 2
schlingel Android Warum man Apps beenden sollte bzw. es nicht tun sollte Android & Cross-Platform Mobile Apps 4
S Auflösungsanpassung funktioniert nicht Android & Cross-Platform Mobile Apps 2
P trotz invalidate() wird onDraw() nicht aufgerufen Android & Cross-Platform Mobile Apps 15
A Werde aus Fehlermeldung nicht schlau.... :-( Android & Cross-Platform Mobile Apps 2
W Eclipse update - Systemprozess reagiert nicht mehr Android & Cross-Platform Mobile Apps 4
B TableLayout verhält sich nicht wie eine Tabelle Android & Cross-Platform Mobile Apps 3
E LayoutInflater funktioniert nicht Android & Cross-Platform Mobile Apps 2
J Sensor Orientierung -> GLRotation stimmt nicht Android & Cross-Platform Mobile Apps 12
K Android Temperaturconverter, R.id.element wird nicht gefunden Android & Cross-Platform Mobile Apps 20
K Android Alarm Manager (Wakelock? ) geht nicht Android & Cross-Platform Mobile Apps 4
U Seit heute morgen läuft meine OpenGL app nicht mehr Android & Cross-Platform Mobile Apps 2
A onDraw wird nicht aufgerufen Android & Cross-Platform Mobile Apps 14
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9

Ähnliche Java Themen

Neue Themen


Oben