1

私は新しく、この質問に打ち負かされることはわかっていますが、答えが得られればそれだけの価値があります。ユーザーが最初のラウンドに勝ったときに、すべてのコードを調べてすべての値をリセットするのではなく、スコアを保存してアクティビティを再開したいというゲームがあります。アクティビティの再開時にスコアがリセットされないようにするにはどうすればよいですか。今のところ例はありません。

 public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
// SET UP SPINS
private TextView spins;
private Button spin;

// SET UP CONTROLS
private TextView score;
private ProgressBar progressBar;
private static final int SHOW_BONUSACTIVITY = 1;
    int nextspin = 0;
int alert;
int total = 0;
int totalspins = 14;
public int gamescore = 0;
public int currentgamescore = 0;

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.play_layout);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ここで、新しいゲームが初めてかどうか、またはここで使用するために保存されたハイスコアがあったかどうかを確認します。

if (GameState.INSTANCE.getScore() != 0){
        gamescore = GameState.INSTANCE.getScore();}

ユーザーが勝った場合、ボーナスゲームに送られ、ゲームを終了して新しいゲームを開始する必要があるかどうかを確認します。

   @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case (SHOW_BONUSACTIVITY): {
        if (resultCode == Activity.RESULT_OK) {
            int bonus = data.getIntExtra("money", 0);
            gamescore=(gamescore + bonus);
            score.setText(String.valueOf("SCORE: " + gamescore));
            if (bigwin == true){

ここに、ゲームスコアを保存して、最初のレベルで勝った場合に新しいアクティビティに取り入れます。

                GameState.INSTANCE.addScore(gamescore);
                Intent intent = new Intent(
                MainActivity.this,
                com.bigdaddyapp.android.blingo.MainActivity.class);
                startActivity(intent);  


            }
            }
        }
    }
    }

次のコードは列挙型アクティビティです

public enum GameState {
INSTANCE;

  private int score;
  private GameState(){
    score = 0;
  }

  public int getScore(){
    return score;
  }
  public void addScore(int score){
    this.score += score;
  }

}
4

3 に答える 3

3

SharedPreferencesをシンプルな永続ストレージメカニズムとして使用して、スコアやライフなどを保存できます。レベルが超えたら、putInt()を使用してスコアを保存し、スコアを取得する場合はgetInt()を使用します。

于 2012-06-30T16:00:07.833 に答える
2

値を永続的に保存する代わりに (Shared Preferences または SQLite Database を使用)、値をメモリに保存することもできますが、よりグローバルなコンテキストで保存できます。このようにして、Activity を再作成しても状態を維持できますが、アプリケーションを閉じると、アプリケーションはその状態を忘れてしまいます。

これは、特定のケースで必要なものではないかもしれませんが、より良いオプションである場合もあります。


Singleton を使用すると、アプリケーションの状態をよりグローバルに保存し、コードの任意の時点で取得できます。例は次のとおりです。

public enum GameState{
  INSTANCE;

  private int score;
  private GameState(){
    score = 0;
  }

  public int getScore(){
    return score;
  }
  public void addScore(int score){
    this.score += score;
  }

}

次のように書くだけで使用できます。

GameState.INSTANCE.addScore(20);
GameState.INSTANCE.getScore();

シングルトンを実装するには複数の方法があります。私の例では、Joshua Bloch が著書「Effective Java - Second Edition」で説明しているアプローチを使用しました。詳細については、ウィキペディアを参照してください。


拡張android.app.Applicationは別のオプションですが、シングルトンの使用ほど推奨されていません。JavaDocから:

グローバルなアプリケーションの状態を維持する必要がある人のための基本クラス。AndroidManifest.xml のタグでその名前を指定することにより、独自の実装を提供できます。これにより、アプリケーション/パッケージのプロセスが作成されるときに、そのクラスがインスタンス化されます。

これを行う方法に関するチュートリアルは、こちら(およびリンクされた回答) にあります。

于 2012-06-30T16:15:20.723 に答える
0

ゲームを終了するには、次の操作を行います。

  SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putInt("gamevariable", gamevariable);

  editor.commit();

次に、onCreate メソッドで変数を取得し、必要に応じて使用します。

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
myvariable = settings.getInt("gamevariable", false);

別の方法として、標準のシリアル化を使用します。これは、より複雑ですが簡単なオプションです。

最初に、後で読み取ることができる .ser ファイルに整数を書き込み、プロジェクト ディレクトリに保存します。

OutputStream os = new FileOutputStream("myinteger.ser");
ObjectOutput oo = new ObjectOutputStream(os);
oo.writeObject(myinteger);
oo.close();

次にアクティビティをロードするときに整数を変数に読み戻します。

InputStream is = new FileInputStream("myinteger.ser");
ObjectInput oi = new ObjectInputStream(is);
int myinteger = (int) oi.readObject();
oi.close();
于 2012-06-30T16:22:20.250 に答える