2016-03-22 19 views
11

Ich entwickle ein Spiel mit libgdx und ich möchte eine glatte Linie mit Shape Renderer zeichnen.Zeichnen Sie eine glatte Linie

 shaperenderer.begin(ShapeType.Line); 
     shaperenderer.line(fisrstVec2,secondVec2); 
     shaperenderer.end(); 

Ich habe versucht Multi Sample anti aliasing von libgdx blog. Ich bin auch durch Anti aliased filed shape in libgdx gegangen, aber leider ist diese Zeile nicht in der neuesten Version von libgdx.

Gdx.gl.glEnable(GL10.GL_LINE_SMOOTH); 
    Gdx.gl.glEnable(GL10.GL_POINT_SMOOTH); 
+2

Sind Sie runnig dies auf Android-Gerät oder Desktop? –

+3

Ich führe dies in Android-Geräten. –

+10

'GL_LINE_SMOOTH' ist veraltet (von OpenGL ES 1.0, das LibGDX nicht mehr unterstützt). Sie sollten Multisampling aktivieren, indem Sie 'numSamples' in der ApplicationConfiguration setzen, die Sie von der Launcher-Klasse an Ihr Spiel übergeben. Wenn das nicht funktioniert, testen Sie möglicherweise auf einer GPU, die es nicht unterstützt. Es ist auch möglich, glatte Linien ohne Anti-Aliasing zu erhalten, indem Sie lange, dünne Rechteck-Sprites zeichnen, die an den Seiten etwas Polsterung aufweisen. – Tenfour04

Antwort

1

aktivieren anti-Realisie- rung in der Konfiguration:

Für Desktop:

LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); 
    config.samples = 2; 
    new LwjglApplication(new MyGdxGame(Helper.arrayList(arg)), config); 

Für Android:

AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
    config.numSamples = 2; 
    initialize(new MyGdxGame(null), config); 

Oder Sie könnten eine weiße pixmap von erstellen 1x1 und benutze es um ein spr ite und die Grenze ziehen, dass Sprite verwenden, ich persönlich bevorzugen diese Methode istead von ShapeRenderer (beachten Sie, dass es keine Rotation in dieser Methode):

/** 
* draws a line on the given axis between given points 
* 
* @param batch  spriteBatch 
* @param axis  axis of the line, vertical or horizontal 
* @param x   x position of the start of the line 
* @param y   y position of the start of the line 
* @param widthHeight width or height of the line according to the axis 
* @param thickness thickness of the line 
* @param color  color of the line, if the color is null, color will not be changed. 
*/ 
public static void line(SpriteBatch batch, Axis axis, float x, float y, float widthHeight, float thickness, Color color, float alpha) { 
    if (color != null) sprite.setColor(color); 
    sprite.setAlpha(alpha); 
    if (axis == Axis.vertical) { 
     sprite.setSize(thickness, widthHeight); 
    } else if (axis == Axis.horizontal) { 
     sprite.setSize(widthHeight, 1); 
    } 
    sprite.setPosition(x,y); 
    sprite.draw(batch); 
    sprite.setAlpha(1); 
} 

Mit einigen Änderungen an der bisherigen Methode, können Sie kommen Mit dieser Methode zeichnen Sie eine Linie mit Rotation.

public static void rotationLine(SpriteBatch batch, float x1, float y1, float x2, float y2, float thickness, Color color, float alpha) { 
    // set color and alpha 
    if (color != null) sprite.setColor(color); 
    sprite.setAlpha(alpha); 
    // set origin and rotation 
    sprite.setOrigin(0,0); 
    sprite.setRotation(getDegree(x2,y2, x1, y1)); 
    // set position and dimension 
    sprite.setSize(distance(x1,y1,x2,y2),thickness); 
    sprite.setPosition(x1, y1); 
    // draw 
    sprite.draw(batch); 
    // reset rotation 
    sprite.rotate(0); 
} 

public static float getDegree(float x, float y, float originX, float originY) { 
    float angle = (float) Math.toDegrees(Math.atan2(y - originY, x - originX)); 
    while (angle < 0 || angle > 360) 
     if (angle < 0) angle += 360; 
     else if (angle > 360) angle -= 360; 
    return angle; 
} 

public static float distance(float x, float y, float x2, float y2) { 
    return (float) Math.sqrt(Math.pow((x2 - x), 2) + Math.pow((y2 - y), 2)); 
} 
+0

Ihre gedrehte Methode funktioniert nur, wenn Sie Multisampling aktivieren. –

+0

@GuilhermeCamposHazan Ist Multi-Sampling nicht standardmäßig aktiviert? – ossobuko

+0

Nein, es ist optional. Der Standardwert ist samples = 0. –

Verwandte Themen