2016-07-30 8 views
0

libgdxで2dプラットフォームをプログラミングしています。プレーヤーがボタンをクリックしてレベルを読み込むメニュー画面を作ろうとしています。クリック座標にはgdx.input、ボタン座標にはTextureRegion.getRegionX()を使用します。彼らは一緒に同期しないと私はそのcamera.unprojectを読んでこの問題を解決する必要があります。私はそれを正当に使用しましたが、コードはまだ一致しません。 camera.unprojectはxとyをスクリーンの中心として0,0を設定しているようですが、batch.draw(これはTextureRegionを画面に描画するメソッドです)は左下隅をxとyの0として使用しているようですここで、0Java libgdx camera.unproject()はbatch.draw()と同期していません

は、コードですが、私は私が関連するとは思わなかった何かを左:

public class LevelScreen implements Screen { 

private TextureRegion level_bg; 
private SpriteBatch batch; 
private Camera camera; 
private TextureAtlas textureAtlas; 
private TextureRegion lockselectbg[]=new TextureRegion[10]; 

public LevelScreen(){    
} 

@Override 
public void show() { 

    batch=new SpriteBatch(); 
    camera = new OrthographicCamera(500,700); 

    LevelStatus.put(); 
    LevelStatus.get();  
    textureAtlas=new TextureAtlas(Gdx.files.internal("levelatlas.pack")); 
    Array<AtlasRegion> atlasArrays = new Array<AtlasRegion>(textureAtlas.getRegions());  
    level_bg = atlasArrays.get(0); 

    lockselectbg[0] = atlasArrays.get(21); 
    } 

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(159/255.0f,220/255.0f,235/255.0f,0xff/255.0f); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    batch.setProjectionMatrix(camera.combined); 

    batch.begin();  
    batch.draw(level_bg, -500/2,-348/2); 
    batch.draw(lockselectbg[0], -180,0); 
    batch.end(); 

    if(Gdx.input.isTouched()){ 
     Vector3 tmp = new Vector3(Gdx.input.getX(),Gdx.input.getY(), 0); 
     camera.unproject(tmp); 
     Rectangle textureBounds = new Rectangle(lockselectbg[0].getRegionX(), lockselectbg[0].getRegionY(), lockselectbg[0].getRegionWidth(), lockselectbg[0].getRegionHeight()); 
     if(textureBounds.contains(tmp.x, tmp.y)) { 
      System.out.println("It worked"); 
     } 
    } 
} 

@Override 
public void dispose() { 
    textureAtlas.dispose(); 
    batch.dispose(); 

} 

答えて

0

Camera#unprojectは、タッチが世界座標に座標変換されます。彼らはテクスチャ上の領域の位置とは何の関係もありません。これはTextureRegionです。あなたは実際に世界(読み:ゲームロジック)座標と資産座標を比較しています。それらの2つは完全に無関係です。

画面上の画像がタッチされているかどうかを確認するには、batch.drawコールで使用した画像の場所とサイズとタッチ座標を比較します。たとえば:

float x = -180f; 
float y = 0f; 
float width = 200f; 
float height = 150f; 
... 
batch.draw(region, x, y, width, height); 
... 
camera.unproject(tmp.set(Gdx.input.getX(),Gdx.input.getY(), 0)); 
boolean touched = tmp.x >= x && tmp.y >= y && tmp.x < (x + width) && tmp.y < (y + height); 
if (touched) 
    System.out.println("It worked"); 

ところで、あなたはこの記事を参照することもできます。http://blog.xoppa.com/pixelsだけでなく、あなたは資産規模であなたのロジックをカップリングしているため。

+0

これも機能しませんでした。それは前と同じことをしているようですが、実際に私が持っていたものとあなたが持っていたものとの違いは実際には分かりません。 – foopydoop

+0

あなたは実際にその答えを読んだことがありますか?正確には見えないものは何ですか? – Xoppa

+0

私のプロジェクトであなたのコードを使用しましたが、私は同じ結果を得ました。あなたの答えでは、Gdx.Inputの座標をcamera.unprojectを使って変換します。これは同じことですが、唯一の違いはRectangleと.containsをボタン座標に使用していますが、ブール値を使用する点です。 – foopydoop

関連する問題