1

ゲームを自動的に保存およびロードする方法について質問があります。この例では、Temple Runのように、すべて (記録、獲得したお金、およびロック解除されたグッズ) でゲームを自動的に保存しているように見えます。PlayStation 1 ゲームと比較すると、たとえばAbe's Exodusでは、自動保存/ロード機能はありませんが、ゲームのレベル内で Abe が去った場所の正確な場所にゲームを保存できます。ゲームをロードすると、このレベル内に残された最後の場所でゲームが自動的に開始されます。

今、私が作ったこの簡単なアプリでゲームの自動ロードと保存のこの機能をテストしようとしています。これは、次の成功を期待しているシーケンスです:

  1. アプリを初めて開くと、このアプリが新しい場合、可動スプライトはデフォルトで中央から開始されます。
  2. 次に、デバイスを傾けてスプライトを動かしてみました。
  3. 次に、HOMEキーではなくBACKキーを使用してアプリを閉じると、破棄してアプリを閉じます。
  4. 最後に、アプリを再度開くと、スプライトに配置した座標が新しい開始点になります。

私のプログラムにはいくつかのバグがあります。上部のスプライトの代わりに、この場所はこの座標を保存するはずですが、もう一度開くと、スプライトは中央に戻ります! render()メソッドのキーワードPreferencesをコード ワークスペースで直接試して、セーブ ゲーム機能をテストしましたが、値を読み取るだけのように見えて混乱しました。

上記のトピックに関する私のいくつかの質問は次のとおりです。

  1. LibGDX でSQL Lite for Javaを使用してゲームを保存するのは良い考えですか?
  2. Samsung Galaxy SIIIのような Android スマートフォンには SD カード スロットがありますが、Google Nexus タブレットにはありません。主な問題は、Android タブレットに外付けドライブが本当にあるのでしょうか? コーディングする代わりにゲームを内部に保存できますか?
  3. 環境設定を使用して、すべて (キャラクター、レコード、アイテム、設定、レベルなど) を自動的に保存し、アプリを閉じて再度開いた場合にのみすべてを自動的にロードする唯一の方法ですか?

あなたが私を助けてくれることを願っています。

これが私のコードです:

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

}

Start.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?
}

}
4

1 に答える 1

2

保存されたプリファレンス ファイルから メソッドとメソッドを初期化する必要がposあります。何かのようなもの:resumeshow

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

合理的なデフォルト値を計算すれば、最初のケースについて心配する必要はありません。

技術的には、これを一番上で行うことができますrender(通常は、前のレンダリングで保存した値を再読み込みするだけですが、これが最初のrender呼び出しである場合には役立つはずです)。しかし、それは少し無駄に思えます (レンダリング スレッド、特に IO で不必要なことをするのは悪い考えです)。

これは、レンダリングごとに少し過剰flushであり、IO がレンダリング スレッドを停止させたときに時折問題が発生します。あなたのアプリはまもなくリリースされるのでflush、 の環境設定オブジェクトだけを使用できるはずです。(もちろん、インスタンス上pauseのオブジェクトへの参照を保持する必要があります。)Preferences

この質問の最後にあるその他の質問は、別の質問として投稿する必要があります。その前に、必ずhttp://developer.android.com/guide/topics/data/data-storage.htmlをお読みください。

于 2012-11-22T04:20:20.117 に答える