Libgdx - How to draw filled rectangle in the right place in scene2d?

前端 未结 5 1989
忘了有多久
忘了有多久 2021-01-02 02:23

I am using scene2d. Here is my code:

group.addActor(new Actor() {

    @Override
    public Actor hit(float arg0, flo         


        
相关标签:
5条回答
  • 2021-01-02 02:48

    The best solution for me. Cause when you using ShapeRenderer it's doesn't react on moving/zooming camera.

    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());
        }
    }
    
    0 讨论(0)
  • 2021-01-02 02:54

    ShapeRenderer has its own transform matrix and projection matrix. These are separate to those in the SpriteBatch that the scene2d Stage uses. If you update the ShapeRenderer's matrices to match those that scene2d is using when Actor.draw() is called then you should get the results that you want.

    0 讨论(0)
  • 2021-01-02 02:56

    You need to convert the Actor's local coordinates into screen coordinates. Assuming your stage is full-screen, you can just use Actor.localToStageCoordinates:

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

    Where vec is a private Vector2d (you don't want to allocate a new one on each render call).

    This is also assuming that your ShapeRenderer is defined to be map to the full screen (which is the default).

    Also, if you switch away from the ShapeRenderer and back to the SpriteBatch, note that the batch is already adjusted to Actor coordinates (and thus you can use getX() and getY() directly with batch.draw(...).

    0 讨论(0)
  • 2021-01-02 03:01

    As Rod Hyde mentions, ShapeRenderer has its own transform matrix and projection matrix. So you would have to get the SpriteBatch's projection Matrix first. I am not sure if there is an elegant way to do it, I did it like this:

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-02 03:03

    If your are using the ShapeRenderer don't forget using setProjectionMatrix() and setTransformMatrix() methods...

    A sample of draw circle inside an Actor on draw method :

    @Override public void draw(Batch batch, float parentAlpha) {
    
        batch.end();
    
        if (shapeRenderer == null) {
            shapeRenderer = new ShapeRenderer();
        }
    
        Gdx.gl.glEnable(GL20.GL_BLEND);
        shapeRenderer.setProjectionMatrix(batch.getProjectionMatrix());
        shapeRenderer.setTransformMatrix(batch.getTransformMatrix());
        shapeRenderer.setColor(mColor.r, mColor.g, mColor.b, mColor.a * parentAlpha);
    
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.circle(getX() + getWidth()/2 , getY() + getHeight()/2 , Math.min(getWidth(),getHeight())/2 );
        shapeRenderer.end();
        Gdx.gl.glDisable(GL20.GL_BLEND);
    
        batch.begin();
    }
    
    0 讨论(0)
提交回复
热议问题