2013-03-18 74 views
0

我是新來libgdx,我試圖做一個精靈的舉動,而相機如下。我可以讓精靈完美地移動,直到我將相機連接到它。當我點擊時,精靈將移動到它感覺的任何地方(看起來),並且相機將正確地跟隨。我嘗試了一些不同的東西,但在這一點上它只是猜測和檢查。雪碧不能正常移動。 libgdx

public class MyGdxGame implements ApplicationListener { 
OrthographicCamera mCamera; 
SpriteBatch mBatch; 
Texture mTexture, mMap; 
Sprite sprite; 
float touchX, touchY; 
float spriteX, spriteY, speed = 5; 

@Override 
public void create() { 
    float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320; 

    mBatch = new SpriteBatch(); 
    mTexture = new Texture(Gdx.files.internal("data/logo.png")); 
    mMap = new Texture(Gdx.files.internal("data/sc_map.png")); 
    mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); 
    mCamera.setToOrtho(false, CAMERA_WIDTH, CAMERA_HEIGHT); 
} 

@Override 
public void dispose() { 

} 

@Override 
public void render() { 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    mBatch.setProjectionMatrix(mCamera.combined); 
    mCamera.update(); 
    mBatch.begin(); 
    updateInput(); 
    drawD(); 
    mBatch.end(); 

} 

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

@Override 
public void pause() { 
} 

@Override 
public void resume() { 
} 

public void drawD() { 
    mCamera.position.set(spriteX, spriteY, 0); 
    mBatch.draw(mMap, 0, 0); 
    mBatch.draw(mTexture, spriteX, spriteY); 

} 

public void updateInput() { 

    if (Gdx.input.justTouched()) { 

     touchX = Gdx.input.getX(); 
     touchY = Gdx.input.getY(); 

    } 
    if (touchX != spriteX) { 

     if (spriteX < touchX) { 
      spriteX += speed; 
     } 
     if (spriteX > touchX) { 
      spriteX -= speed; 
     } 
    } 
    if (touchY != spriteY) { 
     if (spriteY > Gdx.graphics.getHeight() - touchY) { 
      spriteY -= 10; 
     } 
     if (spriteY < Gdx.graphics.getHeight() - touchY) { 
      spriteY += 10; 
     } 
    } 

} 

}

+0

你能描述更詳細的你是什麼意思遵循「? – Jyro117 2013-03-18 03:18:02

+0

當用戶點擊/觸摸時,我想獲取x和y座標並讓精靈在那裏移動。相機應隨之移動,因此精靈將始終位於相機的中心。類似於Diablo這樣的遊戲。 – user2180581 2013-03-18 06:17:42

+0

當我有機會的時候,我會發佈一個真實的答案(如果有人不打我的話)。你可以按照自己想要的一種方式在屏幕中心繪製角色,固定相機,然後沿相反方向移動地圖/敵人/物體等,而不是移動角色。這給人物移動的幻覺,但保持他們在屏幕的中心。 – Jyro117 2013-03-18 13:03:55

回答

2

既然你已經花了很多時間體面的數額,並試圖得到它的工作,我給你一點點推進更接近你在找什麼。查看我所做的更改,下面我將概述我所做的工作,以幫助您更好地理解代碼。

  • 正視相機,當您設置相機0,0是屏幕的中心。寬度和高度是你在構造函數中指定的。所以頂邊是x,160,底邊是x,-160。左邊緣是-240,y,右邊緣是240,y。
  • drawD()請注意,我畫的圖像中間的精靈,它是不動的。相反,我將地圖向相反的方向移動(y倒轉)。
  • updateInput()通知我通過在一個增量值(這是在幀之間以秒的時間),這允許你平滑地移動的東西。速度爲120,所以這會以120 /秒的速度順利移動你的角色。
  • if條件基本上是一個簡單的方法來比較浮點值,因此停止,當它足夠接近。這可以防止它過度拍攝目標位置,然後來回彈跳,因爲它可能無法達到確切的值。
  • 我爲你添加加載的紋理處置電話,這些都是因爲你不想填補你的記憶是重要的。

我希望這有助於讓你開始在正確的方向。製作遊戲需要很多工作,需要時間,所以請耐心等待,隨時準備學習!

基於您的評論,我相信你在找什麼東西接近這個:由「我試圖讓,而相機精靈移動

public class MyGdxGame implements ApplicationListener { 
    OrthographicCamera mCamera; 
    SpriteBatch mBatch; 
    Texture mTexture, mMap; 
    float touchX, touchY; 
    float spriteX, spriteY, speed = 120; 

    final float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320; 

    @Override public void create() { 
     mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); 

     mBatch = new SpriteBatch(); 
     mTexture = new Texture(Gdx.files.internal("data/logo.png")); 
     mMap = new Texture(Gdx.files.internal("data/sc_map.png")); 
    } 

    @Override public void dispose() { 
     mTexture.dispose(); 
     mMap.dispose(); 
    } 

    @Override public void render() { 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     updateInput(Gdx.graphics.getDeltaTime()); 
     mCamera.update(); 
     mBatch.setProjectionMatrix(mCamera.combined); 
     mBatch.begin(); 
     drawD(); 
     mBatch.end(); 
    } 

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

    @Override public void pause() {} 

    @Override public void resume() {} 

    public void drawD() { 
     mBatch.draw(mMap, -spriteX - (mMap.getWidth()/2), spriteY - (mMap.getHeight()/2)); 
     mBatch.draw(mTexture, -32, -32, 64, 64); 
    } 

    public void updateInput(final float delta) { 
     if (Gdx.input.justTouched()) { 
      touchX = Gdx.input.getX() - (Gdx.graphics.getWidth()/2); 
      touchY = Gdx.input.getY() - (Gdx.graphics.getHeight()/2); 
     } 
     final float dv = delta * speed; 
     if (Math.abs(touchX - spriteX) > 1) { 
      if (spriteX < touchX) { 
       spriteX += dv; 
      } 
      if (spriteX > touchX) { 
       spriteX -= dv; 
      } 
     } 
     if (Math.abs(touchY - spriteY) > 1) { 
      if (spriteY > touchY) { 
       spriteY -= dv; 
      } 
      if (spriteY < touchY) { 
       spriteY += dv; 
      } 
     } 
    } 
} 
+0

非常感謝,我在此工作了很長時間。但這是完美的。最後一個後續問題,如果你不介意,但......當我做其他東西像對象/牆壁時,我必須手動移動它們還是有辦法將它們「附加」到地圖上?再次感謝! – user2180581 2013-03-19 02:35:18

+0

我最好的建議是查看LibGDX中的Scene2d框架設置。我承認這是一個相當複雜的系統,但它會告訴你只有一種方法來組織「對象組」。 – Jyro117 2013-03-19 02:50:00