Ios flick motion和UIPangestureRecognitor的意外结果
我正在使用下面的代码在SpriteKit场景中实现对精灵的轻弹,以便它们根据UIPangestureRecognitor中手指的运动继续在屏幕上移动和滑动 在大多数情况下,它工作得很好,但是当我靠近屏幕可视区域的边缘并尝试此手势将精灵弹离屏幕时,它会产生相反的效果,并将精灵推回中心而不是屏幕外 谁能告诉我为什么当精灵离屏幕边缘太近时,它会被推回而不是像预期的那样弹离屏幕Ios flick motion和UIPangestureRecognitor的意外结果,ios,objective-c,uigesturerecognizer,sprite-kit,uipangesturerecognizer,Ios,Objective C,Uigesturerecognizer,Sprite Kit,Uipangesturerecognizer,我正在使用下面的代码在SpriteKit场景中实现对精灵的轻弹,以便它们根据UIPangestureRecognitor中手指的运动继续在屏幕上移动和滑动 在大多数情况下,它工作得很好,但是当我靠近屏幕可视区域的边缘并尝试此手势将精灵弹离屏幕时,它会产生相反的效果,并将精灵推回中心而不是屏幕外 谁能告诉我为什么当精灵离屏幕边缘太近时,它会被推回而不是像预期的那样弹离屏幕 if (recognizer.state == UIGestureRecognizerStateEnded) { if
if (recognizer.state == UIGestureRecognizerStateEnded) {
if ([touchedNode.name isEqualToString:@"sprite"]) {
SKSpriteNode *touchedSprite = (SKSpriteNode *)touchedNode;
// Calculate the length of the velocity vector (i.e. the magnitude)
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
// Calculate a final point based on the above
float slideFactor = 0.1 * slideMult; // Increase for more of a slide
CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), recognizer.view.center.y - (velocity.y * slideFactor));
SKAction *moveAction = [SKAction moveTo:finalPoint duration:slideFactor * 2];
[moveAction setTimingMode:SKActionTimingEaseOut];
[touchedSprite runAction:moveAction];
}
}
我认为这是有可能的,你忘了把你的观点从视角转换成场景 让我们假设我们初始化了我们的手势
__weak IBOutlet SKView *skView;
...
panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[skView addGestureRecognizer:panRecognizer];
所以,如果我们想在SpriteKit空间中获得这个手势识别器的触摸位置,我们必须将这个点从视图转换到场景
- (void)handlePan:(UIPanGestureRecognizer*)sender{
CGPoint point = [sender locationInView:skView];
point = [skView.scene convertPointFromView:point];
// do your things here
}
问题在于,最终
CGPoint
的计算基于添加uipangestrerecognizer
的位置。在这种情况下,必须将其添加到SKView中,因为SKSpriteNode
不是UIView
子类,因此不能向其添加uipangestrerecognizer
这是上面的旧计算
CGPoint finalPoint =
CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor),
recognizer.view.center.y - (velocity.y * slideFactor));
下面是使用精灵节点的中心作为计算基础所做的更改
CGPoint finalPoint =
CGPointMake(touchedSprite.position.x
+ (touchedSprite.size.width / 2)
+ (velocity.x * slideFactor),
touchedNode.position.y
+ (touchedNode.size.height / 2)
- (velocity.y * slideFactor));
你有我可以下载的项目来测试这个吗?记录速度。。。轻弹开始在屏幕上,但手指离开屏幕会取消手势识别,可能这会返回错误的速度。对不起,我已经这样做了,我忽略了将此添加到我的问题中。