我必须在Andengine中绘制曲线或矩形。如果有人知道,请告诉我。
答案 0 :(得分:2)
好的,所以Rectangle类绘制Rectangles,Line类绘制线条。
Rectangle rect = new Rectangle(float pX, float pY, float pWidth, float pHeight, VertexBufferObjectManager pVertexBufferObjectManager)
您可以在此处设置位置,宽度和高度。把顶点缓冲区对象管理器也放在那里,你很高兴。
Bezier曲线更难做,因为没有Curve类和BezierCurve。我使用的是LineStrip类:
final VertexBufferObjectManager vbom = engine.getVertexBufferObjectManager();
final HighPerformanceLineChainVertexBufferObject pLeftCurbLineChainVBOM = new HighPerformanceLineChainVertexBufferObject(vbom, triangleCount * 3, DrawType.DYNAMIC, true, leftCurb.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);
LineStrip leftCurb = new LineStrip(0, 0, 2f, 300, pLeftCurbLineChainVBOM){
@Override
protected void onManagedUpdate(final float pSecondsElapsed) {
super.onManagedUpdate(pSecondsElapsed);
drawByBezier(curveOffset);
};
void drawByBezier(float curveOffset){
for (int triangleIndex = 0; triangleIndex < 300; triangleIndex++) {
this.setX(triangleIndex, getBezier(triangleIndex, curveXP1, curveXControl, curveXP2));
this.setY(triangleIndex, getBezier(triangleIndex, curveYP1, curveYControl, curveYP2));
}
}
你计算这样的曲线:
public float getBezier(float triangleIndex, float P1X, float PcX, float P2X){
float t = triangleIndex / 300;
float tt = t * t;
float u = 1 - t;
float uu = u * u;
float bezier = (uu * P1X) + (2 * u * t * PcX) + (tt * P2X);
return bezier;
}
当然你不必在onManagedUpdate中这样做 - 它只是来自我的代码,因为我在那里修改了曲线。另外,作为LineStrip和getBezier方法的参数的数字300不必是300,它可以更低或更高,但在两个地方必须相同。因此,如果你想要一个从(100,100)到(400,300)的贝塞尔曲线,控制点在(200,350),那就像这样:
this.setX(triangleIndex, getBezier(triangleIndex, 100, 200, 400));
this.setY(triangleIndex, getBezier(triangleIndex, 100, 350, 300));
希望它也适合你。