2012-11-19 4 views
1

게임을 저장하고로드하는 방법에 관한 질문이 있습니다. 이 예에서는 Temple Run처럼 게임이 모든 것 (기록, 돈, 잠금 해제 된 아이템)에 자동으로 게임을 저장하는 것처럼 보입니다. PlayStation 1 게임과 비교하여 예를 들어 Abe의 Exodus을 예로 들어 보겠습니다. 자동 저장 /로드 기능은 없지만 아베가 남긴 게임 레벨의 정확한 위치에 게임을 저장할 수 있습니다. 게임을로드하면이 레벨 내에 남아있는 마지막 위치에서 자동으로 게임이 시작됩니다.Android 게임에서 자동 저장 및 자동로드 게임 개념과 내부 대에서 저장. 외장 (A.K.A. SD 카드)

  1. :

    지금, 자동 부하의이 기능을 테스트하고 나는이 만든이 간단한 응용 프로그램에 의해 게임을 저장하기 위해 노력하고있어, 여기에 내가 다음과 같은 성공을 기대 한 순서입니다 앱을 처음으로 열면이 앱이 새로운 앱인 경우 기본적으로 움직일 수있는 스프라이트가 가운데에서 시작됩니다.

  2. 다음으로, 나는 장치를 기울여서 스프라이트를 움직이려고 시도하고 맨 위로 놓지 않았다.
  3. 그런 다음 BACK 키를 사용하고 앱을 닫을 때 키를 사용하여 처리를 마쳐야합니다.
  4. 마지막으로 앱을 다시 열면 스프라이트에 배치 한 좌표가 새로운 시작점이됩니다.

내 프로그램에 버그가 있습니다. 위에 스프라이트 대신에이 좌표를 저장해야하는이 위치는 스프라이트가 다시 열리면 중심으로 돌아갑니다! 나는 Preferencesrender() 메서드를 코드 작업 공간에 직접 입력하여 게임 저장 기능을 테스트했지만 값을 읽는 것만으로 혼란스럽게 보였습니다. 이 게임을 저장 LibGDX에서 Java 용 SQL 라이트을 사용하는 것이 좋습니다

  1. 인가 :

    다음은이 위의 주제에 대한 나의 몇 가지 질문입니까? 하여 삼성 갤럭시 SIII 같은

  2. 안드로이드 스마트 폰은 SD 카드 슬롯이 아니라 구글 넥서스 태블릿 및 주요 문제에 : 정말 안드로이드 태블릿에 외장 드라이브가? 게임을 코딩하지 않고 내부에 저장할 수 있습니까?
  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(); 
} 

} 

시작 :

여기 내 코드입니다.자바

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

} 
+0

두 Java 클래스를 분석하는 데 2 ​​시간이 걸리면 render() 메서드를 살펴보고 마지막 줄에 환경 설정 코드를 넣으십시오. resume()의 재정의를 사용하기 때문에 "Start.java"를 확인하십시오. 그러면 마지막으로 저장된 파일이 자동으로로드됩니다. –

+0

제발, 도와주세요! (T_T) –

답변

2

당신은 저장된 환경 설정 파일에서 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이라고 부름). 도와야합니다.) 그러나 이것은 약간 낭비가 될 것입니다 (그리고 렌더링 스레드에서 불필요한 작업, 특히 입출력 작업은 나쁜 생각입니다).

모든 렌더링에서 다소 과도한 숫자로 flush이며, IO가 렌더링 스레드를 멈 추면 가끔씩 발생하는 문제가 있습니다. 귀하의 앱이 나갈 때 의 기본 설정 개체 인 pause을 사용할 수 있어야합니다. 물론 Preferences 개체에 대한 참조를 유지해야합니다.

이 질문의 마지막에 나오는 질문은 별도의 질문으로 게시해야합니다. 이 작업을 수행하기 전에 http://developer.android.com/guide/topics/data/data-storage.html

+0

"Gdx.app.getPreferences ("내 기본 설정 ")"을 사용하는 경우 "내 기본 설정"을 처음부터 이름으로 지정할 수 있습니까? –

+0

Badlogicgames.com에 따르면 LibGDX의 환경 설정은 2 개의 코드로 구성됩니다 (자동으로 데스크톱 용 XML 파일을 만들고 Android 용 SharedPreferences). 맞습니까? 그리고 Gdx의 일부인 "getPreferences ("내 환경 설정 ")을 보았을 때 assets 폴더에서"my-preferences.txt "또는".file (?) "을 찾거나 변수 이름은 그대로? –

+1

'Gdx.app.getPreferences'에 전달 된 이름은 호스트의 파일 이름을 만드는데 사용됩니다 (데스크탑의 사용자 디렉토리 또는 애플리케이션의 개인 저장소 - 안드로이드의 "assets"디렉토리가 아닙니다) . prefs 객체의 내용은 해당 파일에서 읽고 플러시됩니다. –