画一条流畅的线
Draw a smooth line
我正在使用 libgdx 开发游戏,我想使用形状渲染器绘制一条平滑的线。
shaperenderer.begin(ShapeType.Line);
shaperenderer.line(fisrstVec2,secondVec2);
shaperenderer.end();
我已经尝试 Multi Sample anti aliasing 来自 libgdx 博客。
我也经历过Anti aliased filed shape in libgdx
但不幸的是,这些行不在 libgdx 的最新版本中。
Gdx.gl.glEnable(GL10.GL_LINE_SMOOTH);
Gdx.gl.glEnable(GL10.GL_POINT_SMOOTH);
在配置中启用抗锯齿:
对于桌面:
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.samples = 2;
new LwjglApplication(new MyGdxGame(Helper.arrayList(arg)), config);
对于Android:
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.numSamples = 2;
initialize(new MyGdxGame(null), config);
或者你可以创建一个 1x1 的白色像素图并用它来创建一个 sprite 并使用该 sprite 绘制线条,我个人更喜欢这种方法而不是 ShapeRenderer(注意没有旋转此方法):
/**
* 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);
}
对之前的方法稍加修改,就可以想出这个方法来画一条带旋转的线
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));
}
我正在使用 libgdx 开发游戏,我想使用形状渲染器绘制一条平滑的线。
shaperenderer.begin(ShapeType.Line);
shaperenderer.line(fisrstVec2,secondVec2);
shaperenderer.end();
我已经尝试 Multi Sample anti aliasing 来自 libgdx 博客。 我也经历过Anti aliased filed shape in libgdx 但不幸的是,这些行不在 libgdx 的最新版本中。
Gdx.gl.glEnable(GL10.GL_LINE_SMOOTH);
Gdx.gl.glEnable(GL10.GL_POINT_SMOOTH);
在配置中启用抗锯齿:
对于桌面:
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.samples = 2;
new LwjglApplication(new MyGdxGame(Helper.arrayList(arg)), config);
对于Android:
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.numSamples = 2;
initialize(new MyGdxGame(null), config);
或者你可以创建一个 1x1 的白色像素图并用它来创建一个 sprite 并使用该 sprite 绘制线条,我个人更喜欢这种方法而不是 ShapeRenderer(注意没有旋转此方法):
/**
* 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);
}
对之前的方法稍加修改,就可以想出这个方法来画一条带旋转的线
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));
}