- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于如何自动保存和加载游戏的问题。在这个例子中,就像Temple Run一样,它会自动保存游戏的所有内容(记录、获得的金钱和解锁的元素),就像看起来一样简单。与 PlayStation 1 游戏相比,以《Abe's Exodus》为例,它没有自动保存/加载功能,但可以将游戏保存在关卡内区域的确切位置。 Abe 离开的游戏,当您加载游戏时,它会自动从该关卡中剩下的最后一个位置开始游戏。
现在,我正在尝试通过我制作的这个简单的应用程序来测试自动加载和保存游戏的功能,以下是我期望成功执行以下操作的顺序:
我的程序有一些错误。一旦我重新打开, Sprite 就会回到中心,而不是顶部的 Sprite ,这个位置应该保存这个坐标!我直接在代码工作区中尝试了 render() 方法中的关键字 Preferences 来测试保存游戏的功能,但令人困惑,因为它似乎只读取值。
这是我关于上述主题的几个问题:
希望你能帮助我。
这是我的代码:
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?
}
}
最佳答案
您应该在保存的首选项文件中的 resume
和 show
方法中初始化 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/
我正在使用 Tkinter 制作 GUI,需要知道哪个框架位于顶部,以便其中一个较低的框架不会进入其循环之一并更改一些设置。 我已经尝试过 self.tk.eval('frame stackorder
我有一个关于如何自动保存和加载游戏的问题。在这个例子中,就像Temple Run一样,它会自动保存游戏的所有内容(记录、获得的金钱和解锁的元素),就像看起来一样简单。与 PlayStation 1 游
我是一名优秀的程序员,十分优秀!