iOS Sprite Kit SKShapeNode не заполняет весь путь

Проблема: SKShapeNode иногда не отображает весь путь. Если он перемещает каждый кадр, некоторые кадры он не рисует. В моем реальном сценарии я использую очень сложную 10-стороннюю форму, но для этой демонстрации я просто делаю треугольник. Например, см. скриншоты (http://imgur.com/a/50mHA).

Код: посмотрите на это в действии, добавив его в базовый шаблон или любую сцену и перемещая мышь (палец) вокруг. Некоторые фигуры показывают этот сбой больше, чем другие, но если вы достаточно подвигаетесь, вы увидите это на каждой фигуре.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint location = [[touches anyObject] locationInNode:self];

    [self enumerateChildNodesWithName:@"path" usingBlock:^(SKNode *node, BOOL *stop) {
        [node removeFromParent];
    }];

    CGMutablePathRef p = CGPathCreateMutable();
    CGPathMoveToPoint(p, NULL, location.x-80, location.y-130);
    CGPathAddLineToPoint(p, NULL, location.x+80, location.y);
    CGPathAddLineToPoint(p, NULL, location.x-80, location.y+130);

    CGPathCloseSubpath(p);
    SKShapeNode *shape = [SKShapeNode node];
    shape.name = @"path";
    shape.path = p;
    shape.fillColor = [UIColor redColor];

    [self addChild:shape];
}

Есть идеи, что происходит?

Редактировать: я хотел добавить, что общий эффект, которого я пытаюсь добиться, — это динамическое освещение в сцене с физическими телами и игроком (источником света). Я использовал информацию с http://ncase.me/sight-and-light/. для создания многоугольника. Однако, когда игрок проходит уровень, в 99% случаев он работает нормально, за исключением того 1%, когда форма дает сбои и не прорисовывается полностью. Это то, что я показываю в примере здесь.


person ndomin    schedule 15.05.2014    source источник
comment
Возможно дело в обмотке. В примере обмотка по часовой стрелке, возможно, она должна быть против часовой стрелки. Попробуйте с обратным порядком точек, т.е. (-80,130),(80,0),(-80,-130)   -  person LearnCocos2D    schedule 15.05.2014
comment
Я думаю, что пример против часовой стрелки, не так ли? В любом случае, я попробовал ваш заказ, и он все еще дает сбои.   -  person ndomin    schedule 15.05.2014
comment
Эм, да, я перепутал.   -  person LearnCocos2D    schedule 15.05.2014


Ответы (1)


Хорошо, то, что вы здесь делаете, очень неэффективно, поэтому, возможно, вы и получаете этот эффект.

Что вам нужно сделать, так это создать один узел формы и сохранить его в свойстве...

@property (nonatomic, strong) SKShapeNode *theShapeNode;

и когда сцена загружается, вы можете создать ее один раз...

// in some method that runs once when the scene loads...

// path is relative to the shape node not the the scene it is in.
// by MOVING the shapeNode the path moves too.
CGMutablePathRef p = CGPathCreateMutable();
CGPathMoveToPoint(p, NULL, 0, -260);
CGPathAddLineToPoint(p, NULL, 160, 0);
CGPathAddLineToPoint(p, NULL, 0, 260);
CGPathCloseSubPath(p);

self.theShapeNode = [SKShapeNode node];
self.theShapeNode.path = p;
self.theShapeNode.fillColor = [UIColor redColor];
[self addChild:theShapeNode];

Потом в прикосновениях переместился метод...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint location = [[touches anyObject] locationInNode:self];

    self.theShapeNode.position = location;
}

Это означает, что каждый раз, когда касание перемещается, вы просто перемещаете уже существующий узел. Вам не нужно создавать путь каждый раз.

person Fogmeister    schedule 15.05.2014
comment
Спасибо за это. Однако форма динамическая, и тело меняется в каждом кадре, так что это не сработает. Я добавлю больше деталей в исходный вопрос. - person ndomin; 15.05.2014
comment
Ты меняешь тело и форму в каждом кадре? Хорошо, пока вы не делаете это со многими телами в каждом кадре, и для физики это зависит от того, как вы ожидаете, что постоянно меняющаяся форма будет вести себя (вероятно, тоже глючит). - person LearnCocos2D; 15.05.2014
comment
Не тело извините, имею в виду путь формы. физические тела не меняются. положение источника света (см. отредактированный исходный вопрос). - person ndomin; 15.05.2014