gpt4 book ai didi

java - Android 游戏上的自动保存和自动加载游戏概念以及内部保存与保存。外部(又称 SD 卡)

转载 作者:行者123 更新时间:2023-11-30 04:36:14 27 4
gpt4 key购买 nike

我有一个关于如何自动保存和加载游戏的问题。在这个例子中,就像Temple Run一样,它会自动保存游戏的所有内容(记录、获得的金钱和解锁的元素),就像看起来一样简单。与 PlayStation 1 游戏相比,以《Abe's Exodus》为例,它没有自动保存/加载功能,但可以将游戏保存在关卡内区域的确切位置。 Abe 离开的游戏,当您加载游戏时,它会自动从该关卡中剩下的最后一个位置开始游戏。

现在,我正在尝试通过我制作的这个简单的应用程序来测试自动加载和保存游戏的功能,以下是我期望成功执行以下操作的顺序:

  1. 首次打开应用程序,如果此应用程序是新应用程序,则可移动 Sprite 将默认从中心开始。
  2. 接下来,我尝试通过倾斜设备来移动 Sprite ,并将其放置在顶部。
  3. 然后,当我使用 BACK 键而不是 HOME 键关闭应用程序时,通过处置来关闭应用程序。
  4. 最后,当我重新打开应用程序时,无论何时我将其放置在 Sprite 上的坐标都将成为新的起点。

我的程序有一些错误。一旦我重新打开, Sprite 就会回到中心,而不是顶部的 Sprite ,这个位置应该保存这个坐标!我直接在代码工作区中尝试了 render() 方法中的关键字 Preferences 来测试保存游戏的功能,但令人困惑,因为它似乎只读取值。

这是我关于上述主题的几个问题:

  1. 在 LibGDX 中使用SQL Lite for Java 来保存游戏是个好主意吗?
  2. Android 智能手机(例如 Samsung Galaxy SIII)具有 SD 卡插槽,但 Google Nexus 平板电脑 中没有,主要问题是:是否真的有外部驱动器安卓平板电脑?我可以通过内部编码来保存游戏吗?
  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?
}

}

最佳答案

您应该在保存的首选项文件中的 resumeshow 方法中初始化 pos。像这样的东西:

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,是一个坏主意)。

在每次渲染时刷新有点过多,并且当 IO 停止渲染线程时会导致偶尔出现问题。当您的应用程序即将退出时,您应该能够在暂停刷新首选项对象。 (当然,您必须在您的实例上保留对 Preferences 对象的引用。)

本问题末尾的其他问题应作为单独的问题发布。在此之前,请务必阅读 http://developer.android.com/guide/topics/data/data-storage.html

关于java - Android 游戏上的自动保存和自动加载游戏概念以及内部保存与保存。外部(又称 SD 卡),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13446699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com