2012-11-19 3 views
1

J'ai une question concernant comment sauvegarder et charger le jeu automatiquement. Dans cet exemple, comme Temple Run, il sauvegardait automatiquement le jeu sur tout (les records, l'argent gagné, et les goodies débloqués) aussi simple que cela puisse paraître. Par exemple, comparé au jeu PlayStation 1, disons Abe's Exodus par exemple, il n'a pas de fonction de sauvegarde/chargement automatique, mais il peut sauvegarder le jeu sur l'emplacement exact de la zone dans le niveau du jeu où Abe est parti et Lorsque vous chargez le jeu, il démarre automatiquement le jeu sur le dernier emplacement restant dans ce niveau.Auto Save et Auto Load Game Concept sur les jeux Android et l'économie sur le Vs interne. Externe (carte SD A.K.A.)

Maintenant, je suis en train de tester cette fonction de la charge automatique et enregistrer jeu par cette simple application que je l'ai fait, voici la séquence que j'ai attendre pour réussir ce qui suit:

  1. Ouvrez l'application pour la première fois et si cette application est nouvelle, le sprite mobile commencera au centre par défaut.
  2. Ensuite, j'ai essayé de déplacer le sprite en inclinant l'appareil et je ne l'ai pas placé en haut.
  3. Puis, quand je ferme l'application en utilisant le RETOUR clé et non la HOME touche pour fermer l'application par élimination.
  4. Enfin, lorsque je rouvre l'application, chaque fois que cette coordonnée je l'ai placée sur l'image-objet sera le nouveau point de départ.

Mon programme contient des bogues. Au lieu de l'image-objet en haut et cet emplacement est censé sauver cette coordonnée, l'image-objet retourne au centre une fois que j'ai rouvert! J'ai essayé le mot-clé Préférences dans la méthode render() sur l'espace de travail de code directement pour tester la capacité du jeu de sauvegarde mais confus car il semble qu'il ne lit que la valeur.

Voici mes quelques questions sur ce sujet ci-dessus:

  1. Est-ce une bonne idée d'utiliser le SQL Lite pour Java dans LibGDX pour sauver le jeu?
  2. smartphones Android comme le Samsung Galaxy la SIII a la fente pour carte SD, mais pas dans le Google Nexus Tablet et la question principale est: est-il vraiment un lecteur externe dans les tablettes Android? Puis-je sauvegarder le jeu sur interne au lieu de le coder?
  3. L'utilisation des préférences est la seule façon de sauvegarder automatiquement tout (caractères, enregistrements, éléments, paramètres, niveaux, etc.) et de charger automatiquement tout uniquement après avoir fermé l'application et l'avoir rouvert?

J'espère que vous pouvez m'aider.

Voici mon code:

Save_Load_Test.java

package com.test.save_and_load_test; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.Preferences; 
import com.badlogic.gdx.Screen; 
import com.badlogic.gdx.Input.Keys; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.Texture.TextureFilter; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.math.Rectangle; 
import com.badlogic.gdx.utils.GdxRuntimeException; 

public class Save_and_Load_Test implements Screen 
{ 

private OrthographicCamera camera; 
private Texture texture; 
private Texture background; 
private SpriteBatch batch; 
private Rectangle pos; 
private Rectangle BG_pos; 
private float w = 720; 
private float h = 1280; 

Start game; 

public Save_and_Load_Test(Start game) 
{ 
    this.game = game; 
} 

@Override 
public void render(float delta) 
{ 
    // TODO render() 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    batch.setProjectionMatrix(camera.combined); 
    batch.begin(); 

     batch.draw(background, BG_pos.x, BG_pos.y); 
     batch.draw(texture, pos.x, pos.y); 

    batch.end(); 

    if(Gdx.input.getAccelerometerX() >= 1 && pos.x >= 0) 
    { 
     pos.x -= 20; 
    } 

    if(Gdx.input.getAccelerometerX() <= -1 && pos.x <= (720 - pos.width)) 
    { 
     pos.x += 20; 
    } 

    if(Gdx.input.getAccelerometerY() >= 1 && pos.y >=0) 
    { 
     pos.y -= 20; 
    } 

    if(Gdx.input.getAccelerometerY() <= -1 && pos.y <= (1280 - pos.height)) 
    { 
     pos.y += 20; 
    } 

    if(Gdx.input.isKeyPressed(Keys.RIGHT) && pos.x <= (720 - pos.width - 35)) 
    { 
     pos.x += 20; 
    } 

    if(Gdx.input.isKeyPressed(Keys.LEFT) && pos.x >=0) 
    { 
     pos.x -= 20; 
    } 

    if(Gdx.input.isKeyPressed(Keys.UP) && pos.y <= (1280 - pos.height - 35)) 
    { 
     pos.y += 20; 
    } 

    if(Gdx.input.isKeyPressed(Keys.DOWN) && pos.y >= 0) 
    { 
     pos.y -= 20; 
    } 

    Preferences prefs = Gdx.app.getPreferences("my-preferences"); 

    prefs.putFloat("X", pos.x); 
    prefs.putFloat("Y", pos.y); 
    prefs.flush(); 
} 

@Override 
public void resize(int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void show() 
{ 
    // TODO show() 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, w, h); 

    texture = new Texture(Gdx.files.internal("Jeff_the_Happy_Clown.png")); 
    background = new Texture(Gdx.files.internal("babe_BG.png")); 

    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
    background.setFilter(TextureFilter.Linear, TextureFilter.Linear); 

    batch = new SpriteBatch(); 

    pos = new Rectangle(); 
    pos.width = 100; 
    pos.height = 100; 
    pos.x = (w/2) - (pos.width/2); 
    pos.y = (h/2) - (pos.height/2); 

    BG_pos = new Rectangle(); 
    BG_pos.width = background.getWidth(); 
    BG_pos.height = background.getHeight(); 
    BG_pos.x = (w/2) - (BG_pos.width/2); 
    BG_pos.y = (h/2) - (BG_pos.height/2); 
} 

@Override 
public void hide() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void pause() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void resume() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void dispose() 
{ 
    // TODO dispose 
    batch.dispose(); 
    texture.dispose(); 
} 

} 

Démarrer.java

package com.test.save_and_load_test; 

import com.badlogic.gdx.Game; 

public class Start extends Game 
{ 

@Override 
public void create() 
{ 
    setScreen(new Save_and_Load_Test(this)); 
} 

@Override 
public void resume() 
{ 
    // Is this method involved for loading the last file game saved? 
} 

} 
+0

Si ces deux classes java sont longues à analyser, je suggère de regarder la méthode render(), j'ai mis le code de préférence à la dernière ligne; et, vérifiez le "Start.java" parce que j'utilise le remplacement du resume(). Cela chargera automatiquement le dernier fichier enregistré. –

+0

S'il vous plaît, aidez-moi! (T_T) –

Répondre

2

Vous devez initialiser pos dans les méthodes resume et show à partir du fichier de préférences enregistrées. Quelque chose comme:

Preferences prefs = Gdx.app.getPreferences("my-preferences"); 
pos.x = prefs.getFloat("X", 99.0f); // XXX use a better default 
pos.y = prefs.getFloat("Y", 99.0f); // XXX use a better default 

Si vous calculez les valeurs par défaut raisonnables, vous ne serez pas à vous soucier de l'affaire initiale.

Techniquement, vous pouvez simplement le faire en haut de render (dans le cas habituel, vous allez juste relire les valeurs que vous venez de sauvegarder sur le rendu précédent, mais dans le cas où c'est le premier appel render devrait aider). Mais cela semble un peu inutile (et faire des choses inutiles sur le thread de rendu, en particulier IO, est une mauvaise idée).

Il est un peu excessif à flush sur chaque rendu, et conduira à un hoquet occasionnel lorsque l'IO bloque votre thread de rendu. Vous devriez pouvoir seulement flush l'objet de préférences dans pause, pendant que votre application est sur le point de sortir. (Vous devrez garder une référence à l'objet Preferences sur votre instance, bien sûr.)

Vos autres questions à la fin de cette question devraient être posées séparément. Avant de faire cela, veuillez vous assurer de lire http://developer.android.com/guide/topics/data/data-storage.html

+0

Si j'utilise "Gdx.app.getPreferences (" my-preferences ")", "my-preferences" peut être donné comme un nom, n'est-ce pas? –

+0

Selon Badlogicgames.com, Préférences de LibGDX sera un deux en un code (automatiquement un fichier XML pour le bureau et SharedPreferences pour Android), non? Et, quand j'ai vu la partie du Gdx, le "getPreferences (" my-preferences ")", est-ce qu'il cherche "my-preferences.txt" ou ".file (?)" Dans le dossier des assets ou donne comme un nom de variable tel quel? –

+1

Le nom passé à 'Gdx.app.getPreferences' est utilisé pour créer un nom de fichier sur l'hôte (dans le répertoire de l'utilisateur sur le bureau, ou dans le stockage privé de l'application - pas tout à fait le répertoire" assets "sur Android) . Le contenu de l'objet prefs sera lu et vidé dans ce fichier. –

Questions connexes