2015-07-16 3 views
0

Eh bien, en essayant de programmer un jeu simple sur Android, je suis confronté au problème de la sauvegarde des données. Je suis allé sur la route de l'utilisation de paires de valeurs clés simples en utilisant des préférences partagées, principalement parce que je n'enregistre que 10 - 15 entiers simples. Mais je ne peux pas le sauvegarder dans l'activité principale. parce que je ne peux pas sembler l'appeler Surface créée (dans le panneau de jeu). J'ai aussi essayé d'avoir la fonction d'enregistrer des données dans le panneau de jeu mais il ne peut pas être créé dans une méthode statique. Lequel est le panneau de jeu. Donc, il semble que je ne sais pas où le mettre.Où dois-je enregistrer des données en utilisant les Préférences partagées dans la boucle de jeu sous Android?

Voici le code GamePanel:

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { 

    private MainThread thread; 
    private UserObject player = new UserObject(); 
    private MainActivity activity = new MainActivity(); 
    private loadImage background; 
    private loadImage house; 
    private loadImage constructionWorker; 
    private loadImage houseUpgrade; 
    private loadImage bob; 
    private loadImage workGroup; 
    private loadImage bank; 
    private loadImage factory; 
    private loadImage superTapping; 
    private loadImage unlockStore; 
    private loadImage store; 
    int screenWidth = this.getResources().getDisplayMetrics().widthPixels; 
    int screenHeight = this.getResources().getDisplayMetrics().heightPixels; 

    Bitmap buttonVars = BitmapFactory.decodeResource(getResources(), R.drawable.house_upgrade); 
    int buttonWidth = buttonVars.getWidth(); 
    int buttonHeight = buttonVars.getHeight(); 

    Bitmap houseVars = BitmapFactory.decodeResource(getResources(), R.drawable.house_upgrade); 
    int houseWidth = houseVars.getWidth(); 
    int houseHeight = houseVars.getHeight(); 

    public GamePanel(Context context) { 
     super(context); 

     //add the callback to the surface holder to intercept events 
     getHolder().addCallback(this); 

     //make gamePanel focusable so it can handle events 
     setFocusable(true); 
    } 

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

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

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     //we can safely start the game loop 
     activity.getData() 
     thread = new MainThread(getHolder(), this); 
     thread.setRunning(true); 
     thread.start(); 

     //Create Bitmaps 
     background = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.blue_background), 0, 0); 
     house = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.crap_shack), ((screenWidth/2) - houseWidth), (houseHeight * 2)); 
     houseUpgrade = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.house_upgrade), 0, (screenHeight - buttonHeight)); 
     constructionWorker = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.construction_worker), ((screenWidth/2) - (buttonWidth/2)), (screenHeight - buttonHeight)); 
     bob = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.bob), (screenWidth - buttonWidth), (screenHeight - buttonHeight)); 
     workGroup = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.work_group), 0, (screenHeight - (buttonHeight * 3))); 
     bank = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.bank), ((screenWidth/2) - (buttonWidth/2)), (screenHeight - (buttonHeight * 3))); 
     factory = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.factory), (screenWidth - buttonWidth), (screenHeight - (buttonHeight * 3))); 
     superTapping = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.super_tapping), 0, (screenHeight - (buttonHeight * 5))); 
     unlockStore = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.unlock_store), ((screenWidth/2) - (buttonWidth/2)), (screenHeight - (buttonHeight * 5))); 
     store = new loadImage(BitmapFactory.decodeResource(getResources(), R.drawable.store), (screenWidth - buttonWidth), (screenHeight - (buttonHeight * 5))); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      //handle house 
      house.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (house.touched) { 
       player.money += player.MPC; 
       house.setTouched(false); 
      } 

      //handle houseUpgrade 
      houseUpgrade.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (houseUpgrade.touched && player.money >= player.houseUpgradeCost) { 
       player.money -= player.houseUpgradeCost; 
       player.MPC += 1; 
       player.houseUpgradeCost += 250; 
       houseUpgrade.setTouched(false); 
      } 

      //handle ConstructionWorker 
      constructionWorker.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (constructionWorker.touched && player.money >= player.constructionWorkerCost) { 
       player.money -= player.constructionWorkerCost; 
       player.MPS += 1; 
       player.constructionWorkerCost += 25; 
       constructionWorker.setTouched(false); 
      } 

      //handle bob 
      bob.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (bob.touched && player.money >= player.bobCost) { 
       player.money -= player.bobCost; 
       player.MPS += 5; 
       player.bobCost += 200; 
       bob.setTouched(false); 
      } 

      //handle workGroup 
      workGroup.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (workGroup.touched && player.money >= player.workGroupCost) { 
       player.money -= player.workGroupCost; 
       player.MPS += 50; 
       player.workGroupCost += 1250; 
       workGroup.setTouched(false); 
      } 

      //handle bank 
      bank.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (bank.touched && player.money >= player.bankCost) { 
       player.money -= player.bankCost; 
       player.MPS += 250; 
       player.bankCost += 5000; 
       bank.setTouched(false); 
      } 

      //handle Factory 
      factory.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (factory.touched && player.money >= player.factoryCost) { 
       player.money -= player.factoryCost; 
       player.MPS += 1000; 
       player.factoryCost += 25000; 
       factory.setTouched(false); 
      } 

      //handle superTapping 
      superTapping.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (superTapping.touched && player.money >= player.superTappingCost) { 
       player.money -= player.superTappingCost; 
       player.MPC += 25; 
       player.superTappingCost += 7500; 
       superTapping.setTouched(false); 
      } 

      //handle unlockStore 
      unlockStore.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (unlockStore.touched && player.money >= player.unlockStoreCost && !player.storeUnlocked) { 
       player.money -= player.unlockStoreCost; 
       player.storeUnlocked = true; 
       unlockStore.setTouched(false); 
      } 

      //handle store 
      store.handleActionDown((int) event.getX(), (int) event.getY()); 
      if (store.touched && player.storeUnlocked) { 

      } 
     } 

     if (event.getAction() == MotionEvent.ACTION_UP) { 
      house.setTouched(false); 
      houseUpgrade.setTouched(false); 
      constructionWorker.setTouched(false); 
      bob.setTouched(false); 
      workGroup.setTouched(false); 
      bank.setTouched(false); 
      factory.setTouched(false); 
      superTapping.setTouched(false); 
      unlockStore.setTouched(false); 
     } 

     return super.onTouchEvent(event); 
    } 

    public void draw(Canvas canvas) { 

     //Draws to canvas 
     background.draw(canvas); 
     house.draw(canvas); 
     houseUpgrade.draw(canvas); 
     constructionWorker.draw(canvas); 
     bob.draw(canvas); 
     workGroup.draw(canvas); 
     bank.draw(canvas); 
     factory.draw(canvas); 
     superTapping.draw(canvas); 
     unlockStore.draw(canvas); 
     if (player.storeUnlocked) { 
      store.draw(canvas); 
     } 

     writeText(canvas, "Money: $" + player.money, Paint.Align.CENTER, Color.BLACK, 25, (screenWidth/2), 50); 
     writeText(canvas, "MPS: " + player.MPS, Paint.Align.CENTER, Color.BLACK, 25, (screenWidth/2), 75); 
     writeText(canvas, "MPC: " + player.MPC, Paint.Align.CENTER, Color.BLACK, 25, (screenWidth/2), 100); 
     writeText(canvas, "Cost: $" + player.houseUpgradeCost, null, Color.BLACK, 15, 0, (screenHeight - buttonHeight)); 
     writeText(canvas, "Cost: $" + player.constructionWorkerCost, Paint.Align.CENTER, Color.BLACK, 15, (screenWidth/2), (screenHeight - buttonHeight)); 
     writeText(canvas, "Cost: $" + player.bobCost, Paint.Align.LEFT, Color.BLACK, 15, screenWidth, (screenHeight - buttonHeight)); 
     writeText(canvas, "Cost: $" + player.workGroupCost, null, Color.BLACK, 15, 0, ((screenHeight - (buttonHeight * 3)))); 
     writeText(canvas, "Cost: $" + player.bankCost, Paint.Align.CENTER, Color.BLACK, 15, (screenWidth/2), ((screenHeight - (buttonHeight * 3)))); 
     writeText(canvas, "Cost: $" + player.factoryCost, Paint.Align.LEFT, Color.BLACK, 15, (screenWidth), ((screenHeight - (buttonHeight * 3)))); 
     writeText(canvas, "Cost: $" + player.superTappingCost, null, Color.BLACK, 15, 0, ((screenHeight - (buttonHeight * 5)))); 
     writeText(canvas, "Cost: $" + player.unlockStoreCost, Paint.Align.CENTER, Color.BLACK, 15, (screenWidth/2), ((screenHeight - (buttonHeight * 5)))); 
    } 

    private void writeText(Canvas canvas, String text, Paint.Align align, int color, int textSize, int x, int y) { 

     //Sets default align if null 
     if (align == null) { 
      align = Paint.Align.RIGHT; 
     } 

     //Sets paint using values 
     Paint paint = new Paint(); 
     paint.setTextAlign(align); 
     paint.setColor(color); 
     paint.setTextSize(textSize); 

     canvas.drawText(text, x, y, paint); 

    } 
} 

Voici la principale activité réelle où je suis en train de sauvegarder les données.

public class MainActivity extends Activity { 

    private UserObject player = new UserObject(); 

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

     //Sets window settings FULLSCREEN, NO TITLE, NO ACTION BAR. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(new GamePanel(this)); 
    } 

    public void saveData() { 
     SharedPreferences sharedPreferences = getSharedPreferences("houseTapper_dataSaveFile", MODE_PRIVATE); 
     SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit(); 
     sharedPreferencesEditor.putInt("money", player.money); 
     sharedPreferencesEditor.putInt("MPS", player.MPS); 
     sharedPreferencesEditor.putInt("MPC", player.MPC); 
     sharedPreferencesEditor.putInt("houseUpgradeCost", player.houseUpgradeCost); 
     sharedPreferencesEditor.putInt("constructionWorkerCost", player.constructionWorkerCost); 
     sharedPreferencesEditor.putInt("bobCost", player.bobCost); 
     sharedPreferencesEditor.putInt("workGroupCost", player.workGroupCost); 
     sharedPreferencesEditor.putInt("bankCost", player.bankCost); 
     sharedPreferencesEditor.putInt("factoryCost", player.factoryCost); 
     sharedPreferencesEditor.putInt("superTappingCost", player.superTappingCost); 
     sharedPreferencesEditor.putBoolean("storeUnlocked", player.storeUnlocked); 
     sharedPreferencesEditor.apply(); 
    } 

    public void getData() { 
     SharedPreferences sharedPreferences = getSharedPreferences("houseTapper_dataSaveFile", MODE_PRIVATE); 
     player.money = sharedPreferences.getInt("money", 0); 
     player.MPS = sharedPreferences.getInt("MPS", 0); 
     player.MPC = sharedPreferences.getInt("MPC", 0); 
     player.houseUpgradeCost = sharedPreferences.getInt("houseUpgradeCost", 0); 
     player.constructionWorkerCost = sharedPreferences.getInt("constructionWorkerCost", 0); 
     player.bobCost = sharedPreferences.getInt("bobCost", 0); 
     player.workGroupCost = sharedPreferences.getInt("workGroupCost", 0); 
     player.bankCost = sharedPreferences.getInt("bankCost", 0); 
     player.factoryCost = sharedPreferences.getInt("factoryCost", 0); 
     player.superTappingCost = sharedPreferences.getInt("superTappingCost", 0); 
     player.storeUnlocked = sharedPreferences.getBoolean("storeUnlocked", false); 
    } 
} 

finnaly ici est le mainThread

public class MainThread extends Thread { 

    private UserObject player = new UserObject(); 
    private int FPS = 30; 
    private SurfaceHolder surfaceHolder; 
    private GamePanel gamePanel; 
    private boolean running; 
    public static Canvas canvas; 
    //Game variables 

    public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel) { 
     super(); 
     this.surfaceHolder = surfaceHolder; 
     this.gamePanel = gamePanel; 
    } 

    @Override 
    public void run() { 
     long startTime; 
     long timeMillis; 
     long waitTime; 
     long targetTime = 1000/FPS; 
     int frames = 0; 

     while(running) { 
      startTime = System.nanoTime(); 
      canvas = null; 

      if (frames == 30) { 
       frames = 0; 
       player.money += player.MPS; 
      } 

      //try locking the canvas for pixel editing 
      try { 
       canvas = this.surfaceHolder.lockCanvas(); 
       synchronized (surfaceHolder) { 
        this.gamePanel.draw(canvas); 
       } 
      } catch (Exception e) { 
      } 
      finally{ 
       if(canvas!=null) 
       { 
        try { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
        catch(Exception e){e.printStackTrace();} 
       } 
      } 

      timeMillis = (System.nanoTime() - startTime)/1000000; 
      waitTime = targetTime-timeMillis; 
      frames++; 

      try { 
       this.sleep(waitTime); 
      } catch(Exception e) {} 
     } 
    } 
    public void setRunning(boolean b) 
    { 
     running=b; 
    } 
} 

J'ai quitté les classes LoadImage et userObject. Parce qu'ils sont sans importance.

+0

Avez-vous essayé OnPause? Habituellement, le meilleur endroit pour enregistrer des données dans une application Android. – doubleA

Répondre

1

Qu'est-ce que la sauvegarde/chargement a à voir avec une activité? Rien, vous avez probablement commencé avec ça, mais ça n'a aucune raison d'y rester.

persistance Donc séparée vers propre classe, vous pouvez appeler partout où vous avez un Context:

public final class Persistence { 
    private final SharedPreferences sharedPreferences; 

    public Persistence(Context context) { 
     sharedPreferences = context.getSharedPreferences("houseTapper_dataSaveFile", MODE_PRIVATE); 
    } 

    public void saveData(Player player) { 
     SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit(); 
     sharedPreferencesEditor.putInt("money", player.money); 
     sharedPreferencesEditor.putInt("MPS", player.MPS); 
     sharedPreferencesEditor.putInt("MPC", player.MPC); 
     // etc... 
     sharedPreferencesEditor.apply(); 
    } 

    public void getData(Player player) { 
     player.money = sharedPreferences.getInt("money", 0); 
     player.MPS = sharedPreferences.getInt("MPS", 0); 
     player.MPC = sharedPreferences.getInt("MPC", 0); 
     // etc... 
    }  
} 

Utilisation:

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { 
    private final Persistence persistence = new Persistence(getContext()); 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     //we can safely start the game loop 
     persistence.getData(player); 


} 
+0

Comment utilisez-vous la variable "sharedPrefrences" même si elle a été créée dans une persistance publique. Vous l'appelez dans un nouveau void public saveData(), et getData() comment est-ce? Ce n'est pas global pour cette classe. –

+0

J'ai mis cela dans le constructeur de Persistence (persistance publique), et assigné à un champ, qui est disponible pour toutes les méthodes non statiques de la classe. – weston

1

Utilisez getActivity() au lieu de new MainActivity().

Activity activity = getActivity(); 
+0

Vous êtes un génie! Merci Mec: D –