Несколько скшапенод в одном розыгрыше?

Привет, я нарисовал скшапеноды, соединяющие узлы в моем графике для моего визуального представления.

for(int x=0; x<64; x++)
        {
            for(int y=0; y<48; y++)
            {
                PathFindingNode *node = [[gridToDraw objectAtIndex:x] objectAtIndex:y];
                for(int i=0; i< node.connections.count; i++)
                {
                    PathFindingNode *neighbor = [node.connections objectAtIndex:i];

                    SKShapeNode *line = [SKShapeNode node];
                    CGMutablePathRef pathToDraw = CGPathCreateMutable();
                    CGPathMoveToPoint(pathToDraw, NULL, node.position.x, node.position.y);
                    CGPathAddLineToPoint(pathToDraw, NULL, neighbor.position.x, neighbor.position.y);
                    line.path = pathToDraw;
                    line.lineWidth = 0.1f;
                    [line setStrokeColor:[UIColor blueColor]];
                    line.alpha = 0.1f;
                    [self addChild:line];
                }
            }
        }

На моем графике много узлов, и это рисует почти 22 000 фигур. Есть ли способ, которым я могу нарисовать эти фигуры за один вызов, так как они все одинаковые, единственная разница - их начальное и конечное расположение.

Если бы я использовал вместо этого текстуру, которая была бы загружена за один раз, как я мог бы изменить ее вращение, чтобы объединить все мои узлы, как описано выше.

С Уважением,

ОБНОВИТЬ:

SKShapeNode *line = [SKShapeNode node];
        CGMutablePathRef pathToDraw = CGPathCreateMutable();

        for(int x=0; x<64; x++)
        {
            for(int y=0; y<48; y++)
            {
                PathFindingNode *node = [[gridToDraw objectAtIndex:x] objectAtIndex:y];
                for(int i=0; i< node.connections.count; i++)
                {
                    PathFindingNode *neighbor = [node.connections objectAtIndex:i];
                    CGPathMoveToPoint(pathToDraw, NULL, node.position.x, node.position.y);
                    CGPathAddLineToPoint(pathToDraw, NULL, neighbor.position.x, neighbor.position.y);
                }
            }
        }

        line.path = pathToDraw;
        line.lineWidth = 0.1f;
        [line setStrokeColor:[UIColor blueColor]];
        line.alpha = 0.1f;
        [self addChild:line];

Я обновил свой код, чтобы он выглядел так, как показано выше, он рисует один скнод, но он рисует 185 раз, почему так?

1 ответ

Решение

Я собирался ответить на это вчера на похожий вопрос, но он исчез.

Вы можете создать один путь и нарисовать все как один SKShapeNode с помощью CGPathAddPath объединять пути по ходу дела.

Вот пример:

SKEffectNode *effectNode = [[SKEffectNode alloc]init];
SKShapeNode  *shape = [[SKShapeNode alloc] init];
CGMutablePathRef myPath = CGPathCreateMutable();
CGPathAddArc(myPath, NULL, 0,0, 15, 0, M_PI*2, YES);

CGMutablePathRef pathTwo = CGPathCreateMutable();
CGPathAddArc(pathTwo, NULL, 50,0, 15, 0, M_PI*2, YES);     
CGPathAddPath(myPath, NULL, pathTwo);

CGMutablePathRef pathThree = CGPathCreateMutable();
CGPathAddArc(pathThree, NULL, 100,0, 15, 0, M_PI*2, YES);
CGPathAddPath(myPath, NULL, pathThree);

shape.path = myPath;

[effectNode addChild:shape];
[self addChild:effectNode];

effectNode.shouldRasterize = YES;  // if you don't rasterize it's horrifically slow.

Это был просто пример того, как объединить различные пути, чтобы создать один SKShapeNode в нем есть все визуальные элементы, которые вы ищете. Вам нужно будет применить эту концепцию к вашему коду.

Я добавил полученный SKShapeNode для SKEffectNode чтобы я мог использовать shouldRasterize свойство кэшировать фигуры, иначе ваша частота кадров будет ужасной.

Другие вопросы по тегам