Физическое тело SpriteKit возвращается в исходное вертикальное положение после удара/стука

Я пытаюсь создать физическую механику, в которой вертикально стоящий объект можно ударить или сбить с ног, а затем он вернется в исходное положение. Думайте об этом как о боксерской груше, установленной на полу. Таким образом, объект будет иметь низкую опорную точку.

Я просто хотел получить небольшое теоретическое представление о том, как подойти к этому, используя физику SpriteKit.

Любая помощь могла бы быть полезна.

Спасибо


person shahidaltaf    schedule 22.08.2014    source источник
comment
используйте SKPhysicsJointPin и изменяйте FrictionTorque в зависимости от того, в какую сторону качается тело   -  person LearnCocos2D    schedule 22.08.2014
comment
Объект не может быть постоянно закреплен или присоединен к «наземному» объекту. Возможно, я думал о соединении «большой массы» внизу и «малой массы» вверху, надеюсь, объект «малой массы» несколько бросит вызов гравитации, но не сможет поднять объект «большой массы» вверх.   -  person shahidaltaf    schedule 22.08.2014
comment
Если проблема заключается в дизайне, вопрос лучше подходит для gamedev.stackexchange.com. тела, поведение не обязательно должно моделироваться исключительно телами и суставами.   -  person LearnCocos2D    schedule 22.08.2014


Ответы (1)


Следующее создает составной объект путем соединения двух тел: окружности и груза. Вес смещен относительно центра круга и намного плотнее. При добавлении в сцену гравитация поворачивает объединенный объект так, что сторона с грузом оказывается внизу. Чтобы использовать его, 1) создайте новую игру с набором спрайтов, 2) замените методы initWithSize и touchesBegan по умолчанию этим кодом и 3) запустите и щелкните в разных местах сцены.

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

    }
    return self;
}

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

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
        SKShapeNode *circle = [SKShapeNode node];
        circle.path =[UIBezierPath bezierPathWithOvalInRect: CGRectMake(-32, -32, 64, 64)].CGPath;
        circle.position = location;
        circle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:32];

        SKSpriteNode *weight = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(8, 8)];
        // Adjust this to get the desire effect
        weight.position = CGPointMake(location.x+1, location.y+28);
        weight.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:4];
        // Adjust this to get the desired effect
        weight.physicsBody.density = 100.0;

        // The physics bodies must be in the scene before adding the joint
        [self addChild:circle];
        [self addChild:weight];

        // Join the circle and the weight with a physics joint
        SKPhysicsJoint *joint = [SKPhysicsJointFixed jointWithBodyA:circle.physicsBody bodyB:weight.physicsBody anchor:weight.position];
        [self.physicsWorld addJoint:joint];
    }
}
person 0x141E    schedule 22.08.2014