iOS 8中的SpriteKit渲染问题用于绘制应用程序

时间:2014-10-20 17:50:09

标签: ios8 sprite-kit xcode6

我有一个绘图模拟SKScene在iOS 7中运行良好,在iOS 8中不起作用。这适用于模拟器和设备。

场景应该显示手指触摸屏幕的黑线,并且在完成“绘制”线后它们应该保持不变。以下是iOS 7中的屏幕截图:

enter image description here

虽然没有崩溃,但iOS 8中的线条根本没有呈现。我只是得到一个空白的画布。 NSLogging表示它确实正确注册了touchesBegan / Moved / Ended函数。

我完整地制作了整个班级:

@implementation CSDraw

-(id)initWithSize:(CGSize)size type:(NSString *)CSType stresslevel:(NSInteger)stress_indicator { //designated initializer
    if (self = [super initWithSize:size type: CSType stresslevel:stress_indicator]) {
        NSLog(@"Creating new scene from CSDraw within the init");
    }
    return self;
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    self.swiped = NO;
    UITouch *touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    self.pathToDraw = CGPathCreateMutable();

    CGPathMoveToPoint(self.pathToDraw, NULL, positionInScene.x, positionInScene.y);

    self.lineNode = [SKShapeNode node];
    self.lineNode.path = self.pathToDraw;
    self.lineNode.strokeColor = [SKColor blackColor];
    self.lineNode.lineWidth = 10;
    self.lineNode.zPosition = 50;

    [self addChild:self.lineNode];

}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    self.swiped = YES;
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    CGPathAddLineToPoint(self.pathToDraw, NULL, positionInScene.x, positionInScene.y);
    self.lineNode.path = self.pathToDraw;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    if(!self.swiped) { //user just tapped once, draw a single point
        SKSpriteNode *dot = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(10, 10)];
        dot.position = positionInScene;
        [self addChild: dot];

    } else { //calls touchesMoved
    }

    //[self.lineNode removeFromParent]; //comment out this line if you want line to remain on screen
    CGPathRelease(self.pathToDraw);
}
@end

这个类是根据我在this StackOverFlow answer中找到的代码编写的。

1 个答案:

答案 0 :(得分:0)

我在Sprite Kit iOS8游戏中遇到了类似的问题并修复了类似的问题:尝试在touchesMoved函数中的CGPathAddLineToPoint调用之前立即添加CGPathMoveToPoint调用。

根据CGPathAddLineToPoint的类引用,自动调用CGPathAddLineToPoint"将当前点更新到指定位置(x,y)[新端点]"。但是,我的线路在iOS8中无法正确呈现,直到我通过在每次CGPathAddLineToPoint调用之前调用CGPathMoveToPoint手动执行此操作。不知道为什么会这样。也许是iOS8中Sprite Kit的一个错误。

请在下方找到修改后的代码,其中的更改标有/* new */条评论。该代码假定您有一个名为lastPointTouched的CGPoint属性。

 @implementation CSDraw

-(id)initWithSize:(CGSize)size type:(NSString *)CSType stresslevel:(NSInteger)stress_indicator { //designated initializer
    if (self = [super initWithSize:size type: CSType stresslevel:stress_indicator]) {
        NSLog(@"Creating new scene from CSDraw within the init");
    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    self.swiped = NO;
    UITouch *touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    self.pathToDraw = CGPathCreateMutable();

    CGPathMoveToPoint(self.pathToDraw, NULL, positionInScene.x, positionInScene.y);
    /* new */ self.lastPointTouched = positionInScene; 

    self.lineNode = [SKShapeNode node];
    self.lineNode.path = self.pathToDraw;
    self.lineNode.strokeColor = [SKColor blackColor];
    self.lineNode.lineWidth = 10;
    self.lineNode.zPosition = 50;

    [self addChild:self.lineNode];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    self.swiped = YES;
    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    /* new */ CGPathMoveToPoint(self.pathToDraw, NULL, self.lastPointTouched.x, self.lastPointTouched.y);
    CGPathAddLineToPoint(self.pathToDraw, NULL, positionInScene.x, positionInScene.y);
    /* new */ self.lastPointTouched = positionInScene;
    self.lineNode.path = self.pathToDraw;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch* touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];

    if(!self.swiped) { //user just tapped once, draw a single point
        SKSpriteNode *dot = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(10, 10)];
        dot.position = positionInScene;
        [self addChild: dot];

    } else { //calls touchesMoved
    }

    //[self.lineNode removeFromParent]; //comment out this line if you want line to remain on screen
    CGPathRelease(self.pathToDraw);
}
@end