2013-04-19 29 views

Trả lời

2

Bạn chưa thể vẽ Đa giác được tô đầy với shaperender. hãy xem điều này từ bugtracker

Bạn cũng có thể đọc điều đó trong API.

public void đa giác (float [] đỉnh)
Vẽ một đa giác trong x/y máy bay. Các đỉnh phải chứa ít nhất 3 điểm (6 nổi x, y). ShapeRenderer.ShapeType được truyền để bắt đầu có là ShapeRenderer.ShapeType.Line.


API ShapeRender
Chắc chắn nếu nó với ShapeType.Line bạn chỉ nhận được đề cương.
Bạn cần tự vẽ hình tam giác trong trường hợp đó. Nó sẽ có thể điền vào ít nhất Tam giác.
Có lẽ hãy nhìn vào điều này từ Stackoverflow: drawing-filled-polygon-with-libgdx

1

Bạn nên sử dụng mesh cho điều đó. Hãy xem liên kết. Ngoài ra, bạn có thể muốn kiểm tra PolygonSpriteBatch.

+5

Đây là một câu trả lời đầy đủ. Thật dễ dàng để nói chỉ là "sử dụng lưới", nhưng những gì về sự tam giác của đa giác? Điều gì về đa giác lõm? Chỉ cần sử dụng lưới không giải quyết các vấn đề mà đa giác (đỉnh) nên khi có thể có chế độ của nó thiết lập để lấp đầy. Những người tìm kiếm một giải pháp: lưới sẽ tạo ra các trang rắn, nhưng bạn vẫn sẽ cần một cách để sắp xếp chúng. –

-2

Chỉnh sửa lớp ShapeRenderer.java bạn thay thế đa giác() phương pháp với đoạn mã sau:

public void polygon(float[] vertices, int offset, int count) { 
    if (currType != ShapeType.Filled && currType != ShapeType.Line) 
     throw new GdxRuntimeException(
       "Must call begin(ShapeType.Filled) or begin(ShapeType.Line)"); 
    if (count < 6) 
     throw new IllegalArgumentException(
       "Polygons must contain at least 3 points."); 
    if (count % 2 != 0) 
     throw new IllegalArgumentException(
       "Polygons must have an even number of vertices."); 

    checkDirty(); 
    checkFlush(count); 

    final float firstX = vertices[0]; 
    final float firstY = vertices[1]; 
    if (currType == ShapeType.Line) { 
     for (int i = offset, n = offset + count; i < n; i += 2) { 
      final float x1 = vertices[i]; 
      final float y1 = vertices[i + 1]; 

      final float x2; 
      final float y2; 

      if (i + 2 >= count) { 
       x2 = firstX; 
       y2 = firstY; 
      } else { 
       x2 = vertices[i + 2]; 
       y2 = vertices[i + 3]; 
      } 

      renderer.color(color); 
      renderer.vertex(x1, y1, 0); 
      renderer.color(color); 
      renderer.vertex(x2, y2, 0); 

     } 
    } else { 

     for (int i = offset, n = offset + count; i < n; i += 4) { 

      final float x1 = vertices[i]; 
      final float y1 = vertices[i + 1]; 

      if (i + 2 >= count) { 
       break; 
      } 

      final float x2 = vertices[i + 2]; 
      final float y2 = vertices[i + 3]; 

      final float x3; 
      final float y3; 

      if (i + 4 >= count) { 
       x3 = firstX; 
       y3 = firstY; 
      } else { 
       x3 = vertices[i + 4]; 
       y3 = vertices[i + 5]; 
      } 

      renderer.color(color); 
      renderer.vertex(x1, y1, 0); 
      renderer.color(color); 
      renderer.vertex(x2, y2, 0); 
      renderer.color(color); 
      renderer.vertex(x3, y3, 0); 


     } 

    } 
} 

Cách sử dụng:

gdx_shape_renderer.begin(ShapeType.Filled); 
    gdx_shape_renderer.setColor(fill_r, fill_g, fill_b, fill_a); 
    gdx_shape_renderer.polygon(vertices); 
    gdx_shape_renderer.end(); 

    gdx_shape_renderer.begin(ShapeType.Line); 
    gdx_shape_renderer.setColor(border_r, border_g, border_b, border_a); 
    gdx_shape_renderer.polygon(vertices); 
    gdx_shape_renderer.end(); 
+0

Nếu việc khắc phục này dễ dàng tại sao nó chưa được kết hợp? – PMunch

+1

bởi vì điều này không làm việc cho polys với hơn 4 đỉnh. –

6

Hiện nay, ShapeRenderer hỗ trợ đa giác vẽ (theo dòng) nhưng không làm đầy.

Mã này cắt hình đa giác trên hình tam giác và sau đó vẽ từng hình tam giác một cách riêng biệt.

Sửa ShapeRenderer.java như thế này:

EarClippingTriangulator ear = new EarClippingTriangulator(); 

public void polygon(float[] vertices, int offset, int count) 
{ 
    if (shapeType != ShapeType.Filled && shapeType != ShapeType.Line) 
     throw new GdxRuntimeException("Must call begin(ShapeType.Filled) or begin(ShapeType.Line)"); 
    if (count < 6) 
     throw new IllegalArgumentException("Polygons must contain at least 3 points."); 
    if (count % 2 != 0) 
     throw new IllegalArgumentException("Polygons must have an even number of vertices."); 

    check(shapeType, null, count); 

    final float firstX = vertices[0]; 
    final float firstY = vertices[1]; 
    if (shapeType == ShapeType.Line) 
    { 
     for (int i = offset, n = offset + count; i < n; i += 2) 
     { 
      final float x1 = vertices[i]; 
      final float y1 = vertices[i + 1]; 

      final float x2; 
      final float y2; 

      if (i + 2 >= count) 
      { 
       x2 = firstX; 
       y2 = firstY; 
      } else 
      { 
       x2 = vertices[i + 2]; 
       y2 = vertices[i + 3]; 
      } 

      renderer.color(color); 
      renderer.vertex(x1, y1, 0); 
      renderer.color(color); 
      renderer.vertex(x2, y2, 0); 

     } 
    } else 
    { 
     ShortArray arrRes = ear.computeTriangles(vertices); 

     for (int i = 0; i < arrRes.size - 2; i = i + 3) 
     { 
      float x1 = vertices[arrRes.get(i) * 2]; 
      float y1 = vertices[(arrRes.get(i) * 2) + 1]; 

      float x2 = vertices[(arrRes.get(i + 1)) * 2]; 
      float y2 = vertices[(arrRes.get(i + 1) * 2) + 1]; 

      float x3 = vertices[arrRes.get(i + 2) * 2]; 
      float y3 = vertices[(arrRes.get(i + 2) * 2) + 1]; 

      this.triangle(x1, y1, x2, y2, x3, y3); 
     } 
    } 
} 
+0

Bạn có thể cải thiện câu trả lời của mình rất nhiều nếu bạn đã thêm một số giải thích về lý do mã bạn đăng hoạt động. –

+0

Thật tuyệt vời! Cuối cùng tôi tìm thấy nó, và nó hoàn toàn phù hợp với nhu cầu của tôi - chỉ là một ví dụ nhanh với renderer hình dạng đồng bằng cũ. – AlexeyGorovoy

Các vấn đề liên quan