2011-07-26 26 views
7

Tôi đang làm việc trên một nhà nhập khẩu cho trò chơi của tôi, nó đọc một xml và sau đó tạo ra các cơ quan box2d cho mọi thứ.Box2d - Mảng độ dài thay đổi của loại phần tử không phải POD 'b2Vec2'

Ví dụ

<polygon vertexCount="3" density="0" friction="0.25" restitution="0.30000000000000004"> 
     <vertice x="6.506500000000001" y="0.4345"/> 
     <vertice x="6.534970527648927" y="0.48385302734375"/> 
     <vertice x="6.478029472351075" y="0.48385302734375"/> 
    </polygon> 

Vấn đề là trong xuất khẩu bây giờ tôi đang phải đối mặt với phần đa giác, tôi cần phải thiết lập một mảng b2vec2 trước khi thêm các đỉnh và thiết lập vị trí của họ.

int count = [[childnode attributeForName:@"vertexCount"] intValue]; 
b2Vec2 points[count]; 

nhưng Box2D muốn các điểm [5] là một số chữ thực tế (như điểm [5] thay vì một biến điểm [số], lỗi nó ra khi tôi có số lượng biến trong đó là:

Variable length array of non-POD element type 'b2Vec2' 

làm thế nào để giải quyết này? tôi đã cố gắng làm cho nó một hằng số nhưng điều đó không làm việc, hoặc (và không giúp tôi kể từ khi tôi cần nó để được động).

Trả lời

-3

đã là con đường dễ dàng hơn và truy cập không giả sử vars:

polygonShape.m_vertexCount = count; 

và sau đó đặt chúng trong forloop:

polygonShape.m_vertices[c].Set(x,y); 

nó hoạt động hoàn toàn tốt :)

+0

sau đó tôi đã sử dụng .Set (m_vertices, m_vertexCount); nếu không, bản thân vật lý sẽ bị lóa ra – M0rph3v5

+0

Không hoàn toàn chắc chắn cách bạn thay thế lỗi hiện tại. Bạn có thể cung cấp thêm trước và sau mã không? – fuzz

19

Bạn phải tạo mảng trên heap:

b2Vec2 *array = new b2Vec2[count]; 

Đừng quên xóa mảng theo cách thủ công khi hoàn tất.

hoặc tốt hơn sử dụng std :: vector:

a) 
std::vector<b2Vec2> vertices(count); 
vertices[0].set(2, 3); 
vertices[1].set(3, 4); 
... 

b) 
std::vector<b2Vec2> vertices; 
vertices.push_back(b2Vec2(2, 3)); 
vertices.push_back(b2Vec2(3, 4)); 
+0

dường như không hoạt động, treo trong b2PolygonShape.cpp. Những gì tôi cuối cùng đã làm được thiết lập .m_vertexCount bằng tay và sau đó chỉ cần đặt chúng với .m_verticles [i] .Set (x, y); – M0rph3v5

+0

chính xác, không thành công tại: b2Assert (cạnh.LengthSquared()> b2_epsilon * b2_epsilon); – M0rph3v5

+0

kiểm tra xem bạn đã không đặt hai đỉnh của đa giác vào cùng một vị trí chính xác – iforce2d

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