物理模拟后读取节点位置

时间:2014-05-25 22:33:24

标签: ios sprite-kit uipangesturerecognizer skphysicsbody

所以我试图制作一个应用程序,用你的手指拿起物体,用手指移动,然后轻弹它扔掉它。我找到了类似游戏的一些线程,但没有遇到这个特殊问题。

由于我无法通过施加力或冲动来保持物体与我的手指一起,因此当我按住它时,禁用它上面的物理,然后测量速度,所以当我释放它我将这个矢量用作冲动。

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

有什么想法吗?我知道你不应该同时设置位置和模拟物理,但是当我拖动对象时我禁用了物理。为什么它不会跟踪.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);


        }

    }
}
编辑:经过一些更多的测试后,我观察到如果它从未被抛出(带有冲动的动态),它总是显示(160,150)作为它的位置,无论它在哪里。有时它会显示160.00031之类的东西而且我不知道为什么。抛出后,它显示NSLog中的正确位置,但改变位置仍然无法正常工作

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

0 个答案:

没有答案