12

私は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 つの呼び出しが異なる理由を誰かが説明できますか?

4

5 に答える 5

19

ShapeRendererには、独自の変換マトリックスと射影マトリックスがあります。これらは、scene2dステージが使用するSpriteBatch内のものとは別のものです。Actor.draw()が呼び出されたときに scene2d が使用しているものと一致するように ShapeRenderer のマトリックスを更新すると、必要な結果が得られるはずです。

于 2013-03-13T22:16:39.850 に答える
14

Rod Hyde が言及しているように、ShapeRenderer には独自の変換マトリックスと投影マトリックスがあります。そのため、最初に SpriteBatch の射影 Matrix を取得する必要があります。エレガントな方法があるかどうかはわかりませんが、次のようにしました。

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();
    }
}
于 2014-08-16T09:27:24.317 に答える
7

私にとって最良の解決策。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());
    }
}
于 2016-01-08T02:37:23.183 に答える
3

アクターのローカル座標をスクリーン座標に変換する必要があります。ステージがフルスクリーンであると仮定すると、単にActor.localToStageCoordinatesを使用できます。

vec.set(getX(), getY());
this.localToStageCoordinates(/* in/out */ vec);
shapeRenderer.filledRect(vec.x, vec.y, getWidth(), getHeight());

vecプライベートはどこにありVector2dますか (レンダー呼び出しごとに新しいものを割り当てたくありません)。

ShapeRendererまた、これは、フルスクリーンにマップされるように定義されていることも前提としています(これがデフォルトです)。

また、 から に切り替えてShapeRendererに戻す場合SpriteBatch、 はすでにアクター座標に調整されていることに注意してください(したがって、 と を で直接batch使用できます) 。getX()getY()batch.draw(...)

于 2013-03-13T22:20:19.443 に答える