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