2013-03-13 10 views
10

私はscene2dを使用しています。ここに私のコードは:Libgdx - 塗りつぶし矩形をscene2dの適切な場所に描画する方法は?

group.addActor(new Actor() { 
     @Override 
     public Actor hit(float arg0, float arg1) {return null;} 
     @Override 
     public void draw(SpriteBatch batch, float arg1) { 
      batch.end(); 
      shapeRenderer.begin(ShapeType.FilledRectangle); 
      shapeRenderer.setColor(Color.RED); 
      shapeRenderer.filledRect(0, 0, 300, 20); 
      shapeRenderer.end(); 
      batch.begin(); 
     } 
    }); 

問題は、画面(X = 0、Y = 0)に、この長方形の相対を描くことであるが、私は私のグループに対して描画することを必要とします。私はと他のエンティティ描くなら:

batch.draw(texture, 0, 0, width, height); 

をそれが正しく(X = 0、Y = 0)の相対私のグループ(グループの左下隅から0,0ピクセル)で描画します。

任意の提案をどのように私はscene2dの描画形状を実現することができますか?そして、なぜ誰かがこの2つの呼び出しが異なる動作をする理由を説明できますか?

答えて

16

ShapeRendererは、独自の変換行列と射影行列を有します。これらはシーン012dが使用するSpriteBatchのものとは別です。 Actor.draw()が呼び出されたときにscene2dが使用しているものと一致するようにShapeRendererの行列を更新すると、必要な結果が得られます。

+1

私は最近、自分自身でこれを行う必要がありました。私は、ShapeRendererの変換行列と投影行列をdraw()メソッドに渡されるSpriteBatchから設定しました。非常に効率的ではないように見えますが、うまくいきます。 – locka

2

アクタのローカル座標をスクリーン座標に変換する必要があります。あなたの舞台と仮定すると、フルスクリーンで、あなただけのActor.localToStageCoordinatesを使用することができます。

vecがプライベート Vector2dある
vec.set(getX(), getY()); 
this.localToStageCoordinates(/* in/out */ vec); 
shapeRenderer.filledRect(vec.x, vec.y, getWidth(), getHeight()); 

(あなたが各レンダリングコールに新しいものを割り当てる必要はありません)。

また、これはあなたのShapeRendererは(デフォルト)、フルスクリーンにマップになるように定義されていることを想定しています。また

、あなたは離れてShapeRendererから、バックSpriteBatchに切り替えた場合、batchはすでに俳優座標に調整されている(したがって、あなたがbatch.draw(...)と直接getX()getY()を使用することができます。

+0

1)Actorには.lovaltoStageCoordingatesはありません.toLocalCoordinatesのみです。 2)と私はそれを使用する方法を理解していない..(ProgressBarはグループです): 'batch.end(); \t \t \t \t vec.set(ProgressBar.this.x、ProgressBar.this.y)。 \t \t \t \t this.toLocalCoordinates(VEC)。 \t \t \t \t shapeRenderer.begin(形状タイプ。FilledRectangle); \t \t \t \t shapeRenderer.setColor(Color.BLACK); \t \t \t \t shapeRenderer.filledRect(vec.x + 11、vec.y + 11、barMaxWidth、20); \t \t \t \t shapeRenderer.end(); '。私は 'vec.set()'に何を置く必要があるのか​​分かりません。 – Aleksandrs

+0

javadocの理解:「ステージの座標内の指定された点をアクターのローカル座標系に変換します。」例えば、私はx = 0を置く。 (左下隅にあります)そして、私が.toLocalCoordinates()を呼び出した後、それらを再計算し、左下のActorコーナーに置く必要があります。 – Aleksandrs

+0

私はランダムにexに設定します。 vec.set(0、800);私はプログレスバーの束を水平に反転させました。私のページをスクロールすると、プログレスバーは別の面に飛びます。 FYI:私は、ステージ - >グループ - >テーブル - >グループ - >アクター – Aleksandrs

6

ロッドハイドが言及したように注意してください。。

public class myActor extends Actor{ 

private ShapeRenderer shapeRenderer; 
static private boolean projectionMatrixSet; 

public myActor(){ 
    shapeRenderer = new ShapeRenderer(); 
    projectionMatrixSet = false; 
} 

@Override 
    public void draw(SpriteBatch batch, float alpha){ 
     batch.end(); 
     if(!projectionMatrixSet){ 
      shapeRenderer.setProjectionMatrix(batch.getProjectionMatrix()); 
     } 
     shapeRenderer.begin(ShapeType.Filled); 
     shapeRenderer.setColor(Color.RED); 
     shapeRenderer.rect(0, 0, 50, 50); 
     shapeRenderer.end(); 
     batch.begin(); 

    } 
} 
:、ShapeRendererは、独自の変換行列と投影行列を持つ ですから、最初SpriteBatchの射影行列を取得する必要があります 私はそれを行うためのエレガントな方法がある場合、私はこのようにそれをやったかわかりません
2

私にとって最適な解決策です。なぜなら、ShapeRendererを使用すると、カメラの移動/ズームに反応しないからです。

public class Rectangle extends Actor { 

    private Texture texture; 

    public Rectangle(float x, float y, float width, float height, Color color) { 
     createTexture((int)width, (int)height, color); 

     setX(x); 
     setY(y); 
     setWidth(width); 
     setHeight(height); 
    } 

    private void createTexture(int width, int height, Color color) { 
     Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888); 
     pixmap.setColor(color); 
     pixmap.fillRectangle(0, 0, width, height); 
     texture = new Texture(pixmap); 
     pixmap.dispose(); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     Color color = getColor(); 
     batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
     batch.draw(texture, getX(), getY(), getWidth(), getHeight()); 
    } 
} 
関連する問題