以下CGPathRef中的不准确之处

时间:2014-07-31 02:21:05

标签: ios sprite-kit skaction

所以我有一个SKSpriteNode,它应该从屏幕中间拖动,放开,然后顺利地流到最近的角落(或者更确切地说,距离最近的角落每个轴上10个点)。

我使用的方法应该返回一个CGPathRef,其原点位于节点的位置,以所提供的角度开始(节点偏离中心),然后向末端弯曲,结束于结束角(所有相对于节点的位置...),用于在用户的拖动和程序的拖动完成之间平滑过渡。方法如下:

-(CGPathRef)createPathToEndpoint:(int)end from:(CGPoint)start atAngle:(float)Angle{
    UIBezierPath *path = [[UIBezierPath alloc]init];
    [path moveToPoint:CGPointZero];

    //Code to set up endPoint

    CGPoint translatedEndPoint = CGPointMake(endPoint.x-start.x, endPoint.y-start.y);

    CGPoint cP1;

    /*
    Code here to set cP1 for desired path attributes. 
    Not included for simplicity's sake, because what really seems to be the issue is
    translatedEndPoint not seeming correct.
    */ 

    [path addQuadCurveToPoint:translatedEndPoint controlPoint:cP1];

    CGPathRef newPath = [path CGPath];

    return newPath;
}

SKSpriteNode通过以下代码遵循该路径:

CGPathRef rollPath = [self createPathToEndpoint:section 
                                           from:[touch locationInNode:self] 
                                        atAngle:angle];

NSTimeInterval timeMove = MIN((timePassed/[self distanceBetween:mainBall.position and:middle])*100,1);

SKAction *move = [SKAction followPath:rollPath 
                             asOffset:YES 
                         orientToPath:NO 
                            duration:timeMove];

但是当代码运行时,精灵通常会在距离终点一定距离的地方结束,甚至可以从一对夫妇到可能超过30分的距离。是什么赋予了?

1 个答案:

答案 0 :(得分:1)

当我打字这个问题时,最后,我看到了我的问题。我已经在程序中修复了它,但我认为可能会与社区分享其他人有同样问题的机会。 (因为我不希望这种打字浪费掉)

这里说:即使节点被告知在手指离开后开始跟随曲线,参考手指离开的位置(位置[touch locationInNode: self]),节点的位置可能与触摸的位置略有不同即使-(void)touchesMoved方法尝试将节点保持在指尖,也可以使用位置。

所以简单的解决方法是改变这一行:

CGPathRef rollPath = [self createPathToEndpoint:section 
                                           from:[touch locationInNode:self] 
                                        atAngle:angle];

到此:

CGPathRef rollPath = [self createPathToEndpoint:section 
                                           from:mainBall.location 
                                        atAngle:angle];

再次,简单的菜鸟错误回顾它,但是,嘿,我不能成为这里唯一的菜鸟,希望这能帮助别人!