问题: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%的形状有毛刺并且没有完全画出。这是我在这里的示例中显示的内容。
答案 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;
}
这意味着每次触摸移动时,您只需重新定位已存在的节点。您不必每次都创建路径。