Я пытаюсь использовать ccDrawPoly для создания произвольно выглядящих астероидоподобных полигонов. Для этого я написал простую функцию, которая рисует окружность в сегментах (рандомизируя радиус окружности на каждой итерации), чтобы создать своего рода «ухабистый» многоугольник. Вершины сохраняются в NSMutableArray и затем передаются в ccDrawPolygon (код ниже):
float maxRadiusVariation = self.radius * 0.2; // 20% of radius
float cx = self.radius, cy = self.radius;
int minSegmentAngle = 5;
int maxSegmentAngle = 45;
int angle = 0;
while(angle < 360)
{
float newRadius = self.radius/2 + rand()%(int)maxRadiusVariation;
float x = cx + (cos(CC_DEGREES_TO_RADIANS(angle)) * newRadius);
float y = cy + (sin(CC_DEGREES_TO_RADIANS(angle)) * newRadius);
[vertices addObject:[NSArray arrayWithObjects:[NSNumber numberWithFloat:x], [NSNumber numberWithFloat:y], nil]];
int angleIncrement = minSegmentAngle + rand()%maxSegmentAngle;
angle += angleIncrement;
}
cocos2d внутренне падает при вызове для рисования. Я полагаю, что моя проблема может заключаться в том, как я извлекаю вершины многоугольника из моего кэша NSMutableArray и пытаюсь построить их:
CGPoint cgVertices[[vertices count]];
for(int i = 0; i < [vertices count]; i++)
{
NSArray *vertex = [vertices objectAtIndex:i];
float x = [[vertex objectAtIndex:0] floatValue];
float y = [[vertex objectAtIndex:1] floatValue];
cgVertices[i] = ccp(x, y);
}
ccDrawPoly(cgVertices, [vertices count], YES);
Для получения дополнительной информации я включил пример содержимого массива вершин перед сбоем cocos2d. Чтобы было немного проще визуализировать, я включил созданную мной графику (где синий пиксель представляет центр окружностей, белые пиксели - вершины, а красные линии - линии, соединяющие их).
http://nial.me/output.png
(
(
93,
60
),
(
"96.25231",
"76.90473"
),
(
"91.17692",
78
),
(
"83.78063",
"81.41218"
),
(
"78.77886",
"95.3179"
),
(
"68.77309",
"98.00043"
),
(
44,
"87.71281"
),
(
"34.08406",
"87.79144"
),
(
"26.45318",
"81.78556"
),
(
"22.51079",
"70.74986"
),
(
"23.02254",
"61.29128"
),
(
"27.64341",
"44.21864"
),
(
"30.8436",
"37.22053"
),
(
"52.57661",
"27.84579"
),
(
"62.44148",
"25.08526"
),
(
"73.42231",
"29.853"
),
(
"84.13467",
"37.49406"
),
(
"89.13047",
"49.39737"
)
)