Spritekit:使用SKPhysicsBody在弧中移动SKSpritekitNode

时间:2015-04-14 21:24:21

标签: ios objective-c sprite-kit skspritenode

我正在尝试使用spritekit中的物理学在一个弧形中移动一个SKSpriteNode,如下所示:enter image description here

但我不确定应该应用哪种物理(applyImpulse,applyForce,applyTorque)。

目前使用applyTorque,代码实际上不起作用,并且不会在对象上产生任何移动:

_boy.physicsBody.velocity = CGVectorMake(1, 1);
CGVector thrustVector = CGVectorMake(0,100);
[_boy.physicsBody applyTorque:(CGFloat)atan2(_boy.physicsBody.velocity.dy, _boy.physicsBody.velocity.dx)];

1 个答案:

答案 0 :(得分:0)

applyTorque不是正确的方法。扭矩是一种扭转力,使您的节点围绕其中心点旋转。

对于您要做的事情,没有一个简单的命令。您也没有提到您的节点的移动方法。施加力量,冲动等等......你将不得不为这个做出一个黑客攻击。

下面的示例项目可以满足您的需求,它将为您指明正确的方向。您将不得不修改代码以满足您特定项目的需求。

点击/单击屏幕一次以开始移动节点,再次点击/单击屏幕以开始90度移动更改。

#import "GameScene.h"

@implementation GameScene {
    int touchCounter;
    BOOL changeDirection;
    SKSpriteNode *node0;
}

-(void)didMoveToView:(SKView *)view {
    self.backgroundColor = [SKColor whiteColor];

    node0 = [SKSpriteNode spriteNodeWithColor:[SKColor grayColor] size:CGSizeMake(50, 50)];
    node0.position = CGPointMake(150, 200);
    node0.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:node0.size];
    node0.physicsBody.affectedByGravity = NO;
    [self addChild:node0];

    touchCounter = 0;
    changeDirection = NO;
}

-(void)update:(CFTimeInterval)currentTime {
    if(changeDirection)
        [self changeMovement];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    touchCounter++;

    for (UITouch *touch in touches) {
        if(touchCounter == 1)
            [node0.physicsBody applyImpulse:CGVectorMake(25, 0)];
        if(touchCounter == 2)
            changeDirection = YES;
    }
}

-(void)changeMovement {
    if(node0.physicsBody.velocity.dy<200) {
        [node0.physicsBody applyImpulse:CGVectorMake(-0.1, 0.1)];
    } else {
        changeDirection = NO;
        node0.physicsBody.velocity = CGVectorMake(0, node0.physicsBody.velocity.dy);
    } 
}