我必须在Andengine中绘制曲线或矩形。如果有人知道怎么走,请告诉我
好的,矩形类绘制矩形,直线类绘制直线。
Rectangle rect = new Rectangle(float pX, float pY, float pWidth, float pHeight, VertexBufferObjectManager pVertexBufferObjectManager)
您可以在这里设置位置、宽度和高度。把顶点缓冲对象管理器也放在那里,就可以了。
贝塞尔曲线更难做,因为没有Curve类和贝塞尔曲线。我使用的是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;
}
当然你不必在onmanageduupdate中这样做-它只是来自我的代码,因为我在那里修改了曲线。同样,300作为LineStrip的参数,在getBezier方法中不一定是300,它可能更低或更高,但它必须在两个地方相同。如果你想画一条从(100,100)到(400,300)的贝塞尔曲线控制点在(200,350)你可以这样做:
this.setX(triangleIndex, getBezier(triangleIndex, 100, 200, 400));
this.setY(triangleIndex, getBezier(triangleIndex, 100, 350, 300));