0

问题:ASKShapeNode有时不会绘制整个路径。如果它在每帧移动一些帧,它就不会绘制。在我的真实案例场景中,我使用了一个非常复杂的 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% 的形状出现故障并且没有完全绘制。这就是我在此处的示例中展示的内容。

4

1 回答 1

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;
}

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

于 2014-05-15T14:06:53.517 回答