Cocos2d:在UIImageView上绘图会导致奇怪的线条跳跃

时间:2013-04-17 19:08:02

标签: opengl-es cocos2d-iphone uiimageview

Screenshot

我正在实现一个包含2个UIImageViews的CCLayer子类。视图和图层都是相同的大小:我使用相同的框架初始化UIImageViews,并将图层的contentSize也设置为框架。一切都工作得很好,但似乎有些东西在绘图的第一点就会变得混乱。当刚刚拍摄图像时没有线条跳跃,但是当我尝试绘制笔划时,一旦我移动手指,线条的开始就会随机跳跃(因此在此屏幕截图中我从左到右绘制除外对于左下角线)。我不确定我的代码在哪里出错:

//_drawImageView is the UIImageView I am drawing in.

#pragma mark - Touch Methods

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    penStroked = NO;
    _prevPoint = [touch locationInView:[[CCDirector sharedDirector]view]];

    CGRect rect = self.boundingBox;
    if (CGRectContainsPoint(rect, _prevPoint)) {
        return YES;
    }

    return NO;
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    penStroked = YES;
    _currPoint = [touch locationInView:_drawImageView];

    UIGraphicsBeginImageContext(self.contentSize);
    [_drawImageView.image drawInRect:CGRectMake(0, 0, _drawImageView.frame.size.width, _drawImageView.frame.size.height)];
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _prevPoint.x, _prevPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), _currPoint.x, _currPoint.y);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), penSize);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), penColor.r, penColor.g, penColor.b, 1.0);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeNormal);

    CGContextStrokePath(UIGraphicsGetCurrentContext());
    _drawImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    [_drawImageView setAlpha: penOpacity];
    UIGraphicsEndImageContext();

    _prevPoint = _currPoint;
}

我很难在最初对齐线条绘制的点n和手指的实际位置,这就是为什么在ccTouchBegan方法中触摸是从CCDirector获取的,而在ccTouchMoved中它是取自_drawImageView。除了最初的不良行为之外,这是它完美绘制的唯一方式。

1 个答案:

答案 0 :(得分:1)

enter image description here

问题肯定是由于触摸的参考不同造成的。正如我之前所说的那样,这是让我的手指所处的位置匹配的唯一方法。我认为线条跳转是由于代码行所致:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _prevPoint.x, _prevPoint.y);

问题在于,在第一次转动时,或第一次敲击笔/手指时,前一点是从CCDirectors视图引用的,而当前点是来自imageView。我创建了一个int变量,每次笔被描边时都会增加,当penStrokedInt == 1(第一个笔划)时,我使用当前点坐标将_prevPoint更正为WorldSpace:

    _prevPoint = [self convertToWorldSpace:_currPoint];

基本上摆脱了该行的第一点。这不是最好的解决方案,但现在它可以工作!确保在ccTouchEnded时将penStrokedInt重置为0.