iOS Sprite Kit SKShapeNode不会填满整个路径

时间:2014-05-15 13:50:28

标签: 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%的形状有毛刺并且没有完全画出。这是我在这里的示例中显示的内容。

1 个答案:

答案 0 :(得分: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;
}

这意味着每次触摸移动时,您只需重新定位已存在的节点。您不必每次都创建路径。