ゲームを自動的に保存およびロードする方法について質問があります。この例では、Temple Runのように、すべて (記録、獲得したお金、およびロック解除されたグッズ) でゲームを自動的に保存しているように見えます。PlayStation 1 ゲームと比較すると、たとえばAbe's Exodusでは、自動保存/ロード機能はありませんが、ゲームのレベル内で Abe が去った場所の正確な場所にゲームを保存できます。ゲームをロードすると、このレベル内に残された最後の場所でゲームが自動的に開始されます。
今、私が作ったこの簡単なアプリでゲームの自動ロードと保存のこの機能をテストしようとしています。これは、次の成功を期待しているシーケンスです:
- アプリを初めて開くと、このアプリが新しい場合、可動スプライトはデフォルトで中央から開始されます。
- 次に、デバイスを傾けてスプライトを動かしてみました。
- 次に、HOMEキーではなくBACKキーを使用してアプリを閉じると、破棄してアプリを閉じます。
- 最後に、アプリを再度開くと、スプライトに配置した座標が新しい開始点になります。
私のプログラムにはいくつかのバグがあります。上部のスプライトの代わりに、この場所はこの座標を保存するはずですが、もう一度開くと、スプライトは中央に戻ります! render()メソッドのキーワードPreferencesをコード ワークスペースで直接試して、セーブ ゲーム機能をテストしましたが、値を読み取るだけのように見えて混乱しました。
上記のトピックに関する私のいくつかの質問は次のとおりです。
- LibGDX でSQL Lite for Javaを使用してゲームを保存するのは良い考えですか?
- Samsung Galaxy SIIIのような Android スマートフォンには SD カード スロットがありますが、Google Nexus タブレットにはありません。主な問題は、Android タブレットに外付けドライブが本当にあるのでしょうか? コーディングする代わりにゲームを内部に保存できますか?
- 環境設定を使用して、すべて (キャラクター、レコード、アイテム、設定、レベルなど) を自動的に保存し、アプリを閉じて再度開いた場合にのみすべてを自動的にロードする唯一の方法ですか?
あなたが私を助けてくれることを願っています。
これが私のコードです:
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?
}
}