2015-02-23 4 views
0

У меня возникла проблема с libgdx и с использованием настроек. Предпочтения должны сохранять «значение» float, и это тоже происходит, но когда я убиваю свое приложение из диспетчера задач Android или перезапускаю систему Android, float возвращается к своему значению по умолчанию. Я прочитал, что это может быть вызвано статическим значением float, но я не могу удалить статику из float, потому что я использую float с моим классом GestureDetector. Могу ли я создать новый float для класса GestureDetector и ссылочного значения «float» для уменьшения при уменьшении нового поплавка или чего-то еще?Настройки Libgdx не сохраняются должным образом

Вот мой основной код:

public class WorldScreen implements Screen{ 

Preferences prefs; 

private Texture bgCity; 
private Texture bgLoop; 
private Texture bgEnd; 
private Texture bgFade; 
private Texture hud; 

public static OrthographicCamera camera; 
SpriteBatch batch; 

Rectangle player; 
Rectangle background; 
Rectangle backgroundloop; 

public float time = 100; 
public float camx = 0; 
public float camy = 0; 
public static float score = 384400000f; 
public static float value = 384400000f; 
BitmapFont font; 
GestureListenerC controller; 

private Music startmusic; 
private static Music loopmusic; 
private Music endMusic; 

public static boolean ending = false; 

private int endint; 
private String endstring = ""; 

public WorldScreen(final JetpackGame aa) { 

} 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    value += GestureListenerC.implementvalue; 
    camx = camera.viewportWidth/2f; 
    camy = camera.viewportHeight/2f; 

    controller.update(); 
    camera.update(); 

    batch.setProjectionMatrix(camera.combined); 
    batch.begin(); 

    batch.draw(bgCity, background.x, background.y); 
    batch.draw(bgLoop, backgroundloop.x, backgroundloop.y); 
    batch.draw(bgEnd, 0, 5360); 

    if(!ending){ 
    if(camera.position.y >= 5360) camera.position.y = 4096; 
    } 

    if(value <= 0) ending = true; 
    //ENDING 
    if(ending){ 
     time += 0.1f * Gdx.graphics.getDeltaTime(); 
     startmusic.stop(); 
     loopmusic.stop(); 
     if(time <= 102.75f){ 
      camera.position.y += 0.15f * time; 
      if(camera.position.y >= 5360) camera.position.y = 4096; 
     } 
     if(time >= 102.75f) { 
      if (camera.position.y >= 4090 && camera.position.y <= 6666) 
       camera.position.y += 0.15f * time; 
     } 
     endMusic.play(); 
     font.setScale(2.0f); 
     font.draw(batch, "You already finished the game xD", 0,1200); 
     if(time >= 103.2f)endMusic.stop(); 

    } 


    Matrix4 normalProjection = new Matrix4().setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    batch.setProjectionMatrix(normalProjection); 

    batch.draw(hud, 0, 85, Gdx.graphics.getWidth(), 1200); 

    font.setScale(3.5f); 
    if(time <=102.5f) { 
     font.draw(batch, ">Meters to the moon", 10, 1260); 
     font.draw(batch, ">" + (int)value + "m", 10, 1190); 
    } 
    //font.draw(batch,""+time, 100, 100); 
    //font.draw(batch,""+value, 100,120); 
    if(time >= 103) { 
     font.setScale(3.0f); 
     font.draw(batch, ">"+endstring, 10,1200); 
    } 

    if(time >= 104) 
    batch.draw(bgFade, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

    batch.end(); 

    if(value < 0) value = 0; 

    if(!startmusic.isPlaying()) { 
     loopmusic.setLooping(true); 
     loopmusic.play(); 
    } 

    //RANDOM ENDING GENERATOR 
    switch(endint){ 
     case 1: endstring = "Now do it again faster!"; 
      break; 
     case 2: endstring = "What are you doing with your life?!"; 
      break; 
     case 3: endstring = "Do you want a cookie?"; 
      break; 
     case 4: endstring = "How many hours did you waste?"; 
      break; 
     case 5: endstring = "So you have no life?"; 
      break; 
     case 6: endstring = "Now get out of your room and go outside!"; 
      break; 
     } 

} 
@Override 
public void resize(int width, int height) { 

} 

@Override 
public void show() { 

    Random rand = new Random(); 
    endint = rand.nextInt(6); 

    font = new BitmapFont(); 
    font.setColor(Color.GREEN); 

    Preferences prefs = Gdx.app.getPreferences("My Preferences"); 
    float value = prefs.getFloat("Value", 384400000f); 

    controller = new GestureListenerC(); 
    GestureDetector gestureDetector = new GestureDetector(20, 0.5f, 2, 0.15f, controller); 
    Gdx.input.setInputProcessor(gestureDetector); 

    loopmusic = Gdx.audio.newMusic(Gdx.files.internal("audio/AmbientLoop.ogg")); 
    startmusic = Gdx.audio.newMusic(Gdx.files.internal("audio/AmbientStart.ogg")); 
    endMusic = Gdx.audio.newMusic(Gdx.files.internal("audio/Moon.ogg")); 
    endMusic.setLooping(false); 
    startmusic.play(); 

    bgCity = new Texture(Gdx.files.internal("img/city_BG.png")); 
    bgLoop = new Texture(Gdx.files.internal("img/loopBG.png")); 
    bgEnd = new Texture(Gdx.files.internal("img/endBG.png")); 
    bgFade = new Texture(Gdx.files.internal("img/fade.png")); 
    hud = new Texture(Gdx.files.internal("img/Hud.png")); 

    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, 480,854); 
    batch = new SpriteBatch(); 

    background = new Rectangle(); 
    background.x = 0; 
    background.y = 0; 
    background.width = 479; 
    background.height = 4096; 

    backgroundloop = new Rectangle(); 
    backgroundloop.x = 0; 
    backgroundloop.y = 4096; 
    backgroundloop.width = 512; 
    backgroundloop.height = 1024; 
} 

@Override 
public void hide() { 

} 

@Override 
public void pause() { 

} 

@Override 
public void resume() { 

} 

@Override 
public void dispose() { 
    prefs.putFloat("Value", value); 
    prefs.flush(); 
    batch.dispose(); 
    font.dispose(); 
    bgCity.dispose(); 
    bgLoop.dispose(); 
    bgEnd.dispose(); 
    bgFade.dispose(); 
    hud.dispose(); 
    loopmusic.dispose(); 
    startmusic.dispose(); 
    endMusic.dispose(); 
} 

} 

А вот мой GestureDetector класс:

public class GestureListenerC implements GestureListener{ 

public static float velX, velY; 
public static boolean flinging = false; 
float initialScale = 1; 
public static float implementvalue = 0; 

public boolean touchDown (float x, float y, int pointer, int button) { 
    flinging = false; 
    initialScale = WorldScreen.camera.zoom; 
    return false; 
} 

@Override 
public boolean tap (float x, float y, int count, int button) { 
    //Gdx.app.log("GestureDetectorTest", "tap at " + x + ", " + y + ", count: " + count); 
    return false; 
} 

@Override 
public boolean longPress (float x, float y) { 
    //Gdx.app.log("GestureDetectorTest", "long press at " + x + ", " + y); 
    return false; 
} 

@Override 
public boolean fling (float velocityX, float velocityY, int button) { 
    //Gdx.app.log("GestureDetectorTest", "fling " + velocityX + ", " + velocityY); 
    flinging = true; 
    velY = WorldScreen.camera.zoom * velocityY * 0.5f; 
    //if(WorldScreen.value <= 0)WorldScreen.value = 0; 
    return false; 
} 

@Override 
public boolean pan (float x, float y, float deltaX, float deltaY) { 
    // Gdx.app.log("GestureDetectorTest", "pan at " + x + ", " + y); 
    if(deltaY >= 0) { 
     if (!WorldScreen.ending) { 
      //if (WorldScreen.value != 0) { 
       WorldScreen.camera.position.add(0, Math.abs(deltaY * WorldScreen.camera.zoom), 0); 
       WorldScreen.value -= Math.abs(1 * deltaY); 
      //} 
      if (WorldScreen.camera.position.y <= 0) WorldScreen.camera.position.y = 0; 
     } 
    } 
    //if(WorldScreen.value <= 0)WorldScreen.value = 0; 
    return false; 
} 

@Override 
public boolean panStop (float x, float y, int pointer, int button) { 
    //Gdx.app.log("GestureDetectorTest", "pan stop at " + x + ", " + y); 
    return false; 
} 

@Override 
public boolean zoom (float originalDistance, float currentDistance) { 

    return false; 
} 

@Override 
public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer) { 
    return false; 
} 

public void update() { 
    if(!WorldScreen.ending){ 
     if (flinging) { 

      //if(WorldScreen.value != 0){ 
       velY *= 0.98f; 
       if(velY >= 0) { 
        WorldScreen.value -= 100.5f * velY; 
        WorldScreen.camera.position.add(0, velY * Gdx.graphics.getDeltaTime(), 0); 
       } 

       if (velY < 0.01f) velY = 0; 
     //} 
     //if(WorldScreen.camera.position.y <= 480){ WorldScreen.camera.position.y = 480; WorldScreen.value = 384400000;} 
    } 
     } 
    //if(WorldScreen.value <= 0)WorldScreen.value = 0; 
} 
} 
+1

Слишком много кода ... В любом случае, если вы только очищаете prefs от метода dispose, это ваша проблема. Dispose не гарантируется на Android. Вместо этого используйте метод паузы. – Tenfour04

+0

Если я перемещаю флеш из метода dispose в метод паузы, приложение падает, когда я пытаюсь его закрыть. (Я получаю сообщение об ошибке и т. Д.) И сохранение вообще не работает. – VVahla

+1

Какое сообщение об ошибке? – Tenfour04

ответ

0

Если вы разрабатываете для андроида, то Вы можете переключиться на андроид 'SharedPreferences'

+0

Прививки Libgdx в любом случае проходят через класс SharedPreferences от Android. – Tenfour04

+0

Как я могу это сделать? Будет ли это работать, если я просто изменю имя Preferences на SharedPreferences? – VVahla

+0

Моя точка зрения, это не поможет. Используя настройки Libgdx, вы уже косвенно используете SharedPreferences от Android. – Tenfour04