2015-05-15 4 views
0

Мне нужно рисовать изогнутые линии или прямоугольники в Andengine. Пожалуйста, расскажите мне, если кто-нибудь знает.Есть ли способ рисовать изогнутые линии или прямоугольники в Andengine?

+0

В пакете примитивов есть класс прямоугольника в andengine, поэтому здесь нет проблем. Однако кривые сложны. Какие кривые вы имеете в виду? Безье? –

+0

Да Безье кривые ... Но класс прямоугольника будет рисовать только прямые. –

+0

О, я просто получил то, что вы имеете в виду ... Изогнутый прямоугольник .... Ну, это также возможно. Подобно LineStrip, я показал вам ответ, вы используете класс Mesh, чтобы сделать прямоугольник из многих треугольников - полосой треугольника. то, изменяя координаты вершин треугольников на основе расчета безье, вы можете сделать края прямоугольника изогнутыми. Трудно, но выполнимо. –

ответ

2

Хорошо, поэтому класс 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)); 

Надеется, что это работает для вас тоже.