路径在UIGraphicsBeginImageContextWithOptions下不可见 - SpriteKit

时间:2014-02-20 17:41:16

标签: ios objective-c sprite-kit

我正在SKScene中绘制一条路径来显示我的物体轨迹。 一切正常,我可以绘制所有点的路径并将其添加到场景中。 问题发生在我尝试打印我的场景时,一切都会出现但路径。 我在哪里做错了?

- (void)drawPathTrackBall
{
    // length of my nsmutablearray with the object track
    NSUInteger len = [_trackBallPath count];

    // start image context
    CGRect bounds = self.scene.view.bounds;
    UIGraphicsBeginImageContextWithOptions(bounds.size, YES, [UIScreen mainScreen].scale);
    [self.view drawViewHierarchyInRect:bounds afterScreenUpdates:YES];

    // draw my path
    SKShapeNode *line = [[SKShapeNode alloc] init];
    CGMutablePathRef linePath = CGPathCreateMutable();
    CGPathMoveToPoint(linePath, NULL, _ballStartX, _ballStartY);

    for(NSUInteger i=0; i<len; ++i)
    {
        NSValue *nsPoint = [_trackBallPath objectAtIndex:i];
        CGPoint p = nsPoint.CGPointValue;
        CGPathAddLineToPoint(linePath, NULL, p.x, p.y);
    }

    line.path = linePath;
    line.lineWidth = 0.5f;
    line.strokeColor = [UIColor redColor];

    [_container addChild:line];

    _screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

Thanx

1 个答案:

答案 0 :(得分:1)

首先 - 你正在创建简单的路径,它没有连接或绘制到代码中的某个地方到上下文。我还没有学习SpriteKit,但我知道CoreGraphics很好,我认为你不能简单地使用SpriteKit API来创建截图。而是尝试使用原生的CoreGraphics方法。

要使代码正常工作,您需要:

  • 获取您将要绘制的上下文。

  • 由于您已经创建了一条路径 - 只需将其添加到上下文中。

  • 然后抚摸/填充它。

获取当前上下文以绘制调用:CGContextRef ctx = UIGraphicsGetCurrentContext();

添加路径使用:CGContextAddPath(ctx, path);

使用CGContextStrokePath(ctx); / CGContextFillPath(ctx);

进行描边/填充

所以你的更新代码应该是这样的(注意我已经删除了与SpriteKit相关的代码):

- (void)drawPathTrackBall
{
    // length of my nsmutablearray with the object track
    NSUInteger len = [_trackBallPath count];

    // start image context
    CGRect bounds = self.scene.view.bounds;
    UIGraphicsBeginImageContextWithOptions(bounds.size, YES, [UIScreen mainScreen].scale);
    [self.view drawViewHierarchyInRect:bounds afterScreenUpdates:YES];

    CGContextRef ctx = UIGraphicsGetCurrentContext(); // Obtain context to draw.
    CGMutablePathRef linePath = CGPathCreateMutable();
    CGPathMoveToPoint(linePath, NULL, _ballStartX, _ballStartY);

    for(NSUInteger i=0; i<len; ++i)
    {
        NSValue *nsPoint = [_trackBallPath objectAtIndex:i];
        CGPoint p = nsPoint.CGPointValue;
        CGPathAddLineToPoint(linePath, NULL, p.x, p.y);
    }

    // I've exchanged SpriteKit node API calls with CoreGraphics equivalents.
    CGContextSetLineWidth(ctx, 0.5f); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
    CGContextAddPath(ctx, linePath);
    CGContextStrokePath(ctx);

    _screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

试试吧。