Spritekit: переместить SKSpritekitNode в дугу с SKPhysicsBody

Я пытаюсь переместить SKSpriteNode в дугу с физикой в ​​спрайтеките так:

Но я не уверен, какой физик я должен применить к нему (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 ответ

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);
    } 
}
Другие вопросы по тегам