Мне нужно рисовать изогнутые линии или прямоугольники в Andengine. Пожалуйста, расскажите мне, если кто-нибудь знает.Есть ли способ рисовать изогнутые линии или прямоугольники в Andengine?
ответ
Хорошо, поэтому класс Rectangle рисует прямоугольники, класс линии рисует линии.
Rectangle rect = new Rectangle(float pX, float pY, float pWidth, float pHeight, VertexBufferObjectManager pVertexBufferObjectManager)
Здесь вы устанавливаете положение, ширину и высоту. Также разместите диспетчер объектов вершинных буферов, и вам хорошо идти.
Кривые Безье сложнее, поскольку нет класса кривых или Безье. То, что я использую 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 - это только из моего кода, так как я могу изменить кривую там. Также номер 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));
Надеется, что это работает для вас тоже.
В пакете примитивов есть класс прямоугольника в andengine, поэтому здесь нет проблем. Однако кривые сложны. Какие кривые вы имеете в виду? Безье? –
Да Безье кривые ... Но класс прямоугольника будет рисовать только прямые. –
О, я просто получил то, что вы имеете в виду ... Изогнутый прямоугольник .... Ну, это также возможно. Подобно LineStrip, я показал вам ответ, вы используете класс Mesh, чтобы сделать прямоугольник из многих треугольников - полосой треугольника. то, изменяя координаты вершин треугольников на основе расчета безье, вы можете сделать края прямоугольника изогнутыми. Трудно, но выполнимо. –