2017-09-19 13 views
1

テクスチャを読み込んでスプライトに変換します。下の画像は、典型的なスプライトの様子を示しています。スプライトからスプライトに変化します。ユーザーが表面領域に触れると、これらのスプライトを移動することはありません。現在私はユーザーがそれを触れたかどうかを検出するために四角形の境界を使用しています。テクスチャが矩形でないため、このアプローチはクリーンではありません。その結果、ユーザーは正確に触れることなくドラッグすることができます。問題は、テクスチャ領域を表現するためだけにタッチ領域を作成する方法(非透明ピクセル領域または下の画像で灰色領域を除外する方法)です。libgdxのテクスチャ領域へのタッチ領域を制限する

enter image description here

答えて

2

私は色のピッキングでこれに近づくでしょう。スプライト上のどのピクセルがタッチされたかを最初に判定し、タッチされたピクセルが透明かどうかを確認します。コードthis questionから採取され、ビット(テストしていません)に変更して:

Color pickedColor = null; 
Rectangle spriteBounds = sprite.getBoundingRectangle(); 
if (spriteBounds.contains(Gdx.input.getX(), Gdx.input.getY())) { 
    Texture texture = sprite.getTexture(); 

    int spriteLocalX = (int) (Gdx.input.getX() - sprite.getX()); 
    // we need to "invert" Y, because the screen coordinate origin is top-left 
    int spriteLocalY = (int) ((Gdx.graphics.getHeight() - Gdx.input.getY()) - sprite.getY()); 

    int textureLocalX = sprite.getRegionX() + spriteLocalX; 
    int textureLocalY = sprite.getRegionY() + spriteLocalY; 

    if (!texture.getTextureData().isPrepared()) { 
     texture.getTextureData().prepare(); 
    } 
    Pixmap pixmap = texture.getTextureData().consumePixmap(); 
    pickedColor = new Color(pixmap.getPixel(textureLocalX, textureLocalY)); 
} 

//Check for transparency 
if (pickedColor != null && pickedColor.a != 0) { 
    //The picked pixel is not transparent, the nontransparent texture shape was touched 
} 

を念頭に置いて、これはテストされていないと、おそらく最適化することができます持っています。

+0

お返事ありがとうございます。エリアを表すポリゴンを作成しますか?私が200の仲間に近づくと、これは高価に見えます。 – pats

+0

私が知っている限り、テクスチャ領域からポリゴンを作成する簡単な方法はありません。テクスチャはまだ長方形であり、ポリゴンを作成しないように透明なピクセルを確認する必要があります。曲線。実際にスプライトの四角形(最初のif文)をタッチし、スプライトが1つ打たれるとすぐに終了することができる(最上部のパズルピース)場合にのみ、ピクセルカラーが計算されることに注意してください。だから5つ以上のスプライトについて計算が行われるケースがあれば、私は驚くだろう。 – Johan

+0

これを最適化する方法の1つは、毎回pixmapsを再作成しないように、すべてのピックスマップをあらかじめ保存することです(ある種の名前/ IDでスプライトに接続する)。あなたがスプライトを移動できるので、localXとlocalYを計算することは避けられません。 – Johan

関連する問題