Ios 物理模拟后读取节点位置

Ios 物理模拟后读取节点位置,ios,sprite-kit,uipangesturerecognizer,skphysicsbody,Ios,Sprite Kit,Uipangesturerecognizer,Skphysicsbody,所以我试着制作一个应用程序,你用你的手指拾取物体,它用你的手指移动,然后你把它弹开扔掉。我为类似的游戏找到了一些线索,但没有这个特殊的问题 由于我无法通过施加力或脉冲来保持物体与我的手指在一起,我在“握住它”的同时禁用了它的物理功能,测量速度,所以当我释放它时,我将该矢量作为脉冲应用 这在视觉上效果很好,但当我试图读取对象的位置时,它与“现实”不同步。我已经设定了一个条件,当你释放物体时,如果速度不够快,它应该返回到它的起始位置,但它根本不会移动(除非你设法抛出它,这很好),所以当我试图将.po

所以我试着制作一个应用程序,你用你的手指拾取物体,它用你的手指移动,然后你把它弹开扔掉。我为类似的游戏找到了一些线索,但没有这个特殊的问题

由于我无法通过施加力或脉冲来保持物体与我的手指在一起,我在“握住它”的同时禁用了它的物理功能,测量速度,所以当我释放它时,我将该矢量作为脉冲应用

这在视觉上效果很好,但当我试图读取对象的位置时,它与“现实”不同步。我已经设定了一个条件,当你释放物体时,如果速度不够快,它应该返回到它的起始位置,但它根本不会移动(除非你设法抛出它,这很好),所以当我试图将.position输出到控制台时,它与我在屏幕上看到的内容没有关联

有什么想法吗?我知道不应该同时设置位置和模拟物理,但我在拖动对象时禁用了物理。为什么仅仅因为它在用物理移动它,它就不能跟踪位置

在这里,我尝试投掷一种药剂:

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
    if (recognizer.state == UIGestureRecognizerStateBegan) {         //Picked up

        potion.physicsBody.dynamic = NO;
        potion.physicsBody.velocity = CGVectorMake(0.0, 0.0);
        potion.physicsBody.angularVelocity = 0.0;
        potion.zRotation = 0.0;

        CGPoint touchLocation = [recognizer locationInView:recognizer.view];
        touchLocation = [self convertPointFromView:touchLocation];
        [self selectNodeForTouch:touchLocation];


    } else if (recognizer.state == UIGestureRecognizerStateChanged) { //Moved around

        CGPoint translation = [recognizer translationInView:recognizer.view];
        translation = CGPointMake(translation.x, -translation.y);
        [self panForTranslation:translation];
        [recognizer setTranslation:CGPointZero inView:recognizer.view];

        velocity = CGVectorMake(translation.x, translation.y);


    } else if (recognizer.state == UIGestureRecognizerStateEnded) {   //Dropped

        _selectedNode = nil;
        potion.physicsBody.dynamic = YES;

        if (potion.position.y < 250 && velocity.dy < 20) {            //Returned to starting position

            NSLog(@"Pos:%f,%f",potion.position.x,potion.position.y);

            potion.physicsBody.velocity = CGVectorMake(0.0, 0.0);
            potion.physicsBody.angularVelocity = 0.0;
            potion.zRotation = 0.0;
            potion.position = CGPointMake(gameWidth / 2, 150);
            NSLog(@"Returning potion");
            NSLog(@"Pos:%f,%f",potion.position.x,potion.position.y);


        } else {                                                       //Flung away

            [potion.physicsBody applyImpulse:velocity];
            NSLog(@"Add impulse: %f, %f", velocity.dx, velocity.dy);
            NSLog(@"Pos:%f,%f",potion.position.x,potion.position.y);


        }

    }
}
-(void)handlePan:(UIPangestureRecognitor*)识别器{
如果(recognizer.state==UIgestureCongnizerStateStart){//已拾取
potion.physicsBody.dynamic=否;
魔药.physicsBody.velocity=CGVectorMake(0.0,0.0);
potion.physicsBody.angularVelocity=0.0;
药水旋转=0.0;
CGPoint touchLocation=[识别器位置视图:识别器.视图];
touchLocation=[self-convertPointFromView:touchLocation];
[自选节点触摸:触摸位置];
}如果(recognizer.state==UIgestureCongnizerStateChanged){//移动了
CGPoint translation=[recognizer translationView:recognizer.view];
translation=CGPointMake(translation.x,-translation.y);
[自译:翻译];
[识别器setTranslation:CGPointZero-inView:recognizer.view];
速度=CGVectorMake(translation.x,translation.y);
}如果(recognizer.state==UIgestureRecognitizerStateEnded){//drop
_selectedNode=nil;
potion.physicsBody.dynamic=是;
如果(药剂位置y<250&&velocity.dy<20){//返回起始位置
NSLog(@“位置:%f,%f”,药剂位置.x,药剂位置.y);
魔药.physicsBody.velocity=CGVectorMake(0.0,0.0);
potion.physicsBody.angularVelocity=0.0;
药水旋转=0.0;
potion.position=CGPointMake(游戏宽度/2150);
NSLog(“返回药剂”);
NSLog(@“位置:%f,%f”,药剂位置.x,药剂位置.y);
}否则{//就被扔掉了
[药剂。物理身体应用脉冲:速度];
NSLog(@“添加脉冲:%f,%f”,velocity.dx,velocity.dy);
NSLog(@“位置:%f,%f”,药剂位置.x,药剂位置.y);
}
}
}
编辑:在更多的测试之后,我观察到,如果它从未被抛出(带有冲动的动态),它总是显示(160150)作为它的位置,不管它在哪里。有时它会显示160.00031,我不知道为什么。抛出后,它会在NSLog中显示正确的位置,但更改位置仍然无效


EDIT2:刚刚看到它在一次投掷后没有显示正确的位置。只是不同,但它们似乎相互抵消了。我朝+y方向(向上)扔物体,当我把它放在左角时,位置.x是正确的,但位置.y偏移了大约300。所以y应该是0,它是300。

举一个例子,说明你期望看到的和实际发生的情况。如果我设法把物品扔掉,那就行了。它保持速度,然后被扔出去。如果我只是在手指不动的时候把它放下,它应该会回到起始位置。然而现在,如果我把东西掉到我手指的地方,它就会掉到我手指的地方。potion.position=CGPointMake(游戏宽度/2150);什么都不做。NSLog输出可以显示类似“300400”的内容,在位置更改后显示“160150”,但精灵仍在其他地方。您是否尝试过在
-didSimulatePhysics
方法中读取位置?您可以在设置位置后尝试将其设置为动态。正如您所说,设置动态对象的位置是不可行的。之后将其设置为“动态”没有任何帮助。经过更多的测试后,我观察到,如果它从未被抛出(带有脉冲的动态),它总是显示(160150)作为它的位置,不管它在哪里。有时它会显示160.00031,我不知道为什么。抛出后,它会在NSLog中显示正确的位置,但更改位置仍然无效。