dynamic ios7 box2d sprite-kit skphysicsbody

Petición de falla de Sprite Kit:(tipoA== b2_dynamicBody || typeB== b2_dynamicBody)



ios7 box2d (2)

Esto fue preguntado antes , pero el asker original no necesitó cambiar la propiedad dinámica, por lo que respondió su propia pregunta al desactualizarla.

Estoy usando Sprite Kit en iOS7 y me gustaría poder cambiar la propiedad dinámica de SKPhysicsBody en tiempo de ejecución. Originalmente estaba cambiando eso en mi método touchesBegan: Alguien en el foro de Apple Dev sugirió mover el cambio al método didSimulatePhysics: pero tampoco ayudó.

Este código causa el error:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!heyWereSwappingDynamismHere) { heyWereSwappingDynamismHere = YES; SKNode * rope = [self childNodeWithName:@"rope"]; SKNode * anchor = [rope childNodeWithName:@"anchor"]; [listOfObjectsToSwapDynamic addObject:anchor]; } } -(void) didSimulatePhysics { if (heyWereSwappingDynamismHere) { for (SKNode * node in listOfObjectsToSwapDynamic) { bool isItDynamic = node.physicsBody.isDynamic; node.physicsBody.dynamic = !isItDynamic; } [listOfObjectsToSwapDynamic removeAllObjects]; heyWereSwappingDynamismHere = NO; }

}

El error que aparece en el depurador es:

Error de aserción: (tipo A == b2_dynamicBody || typeB == b2_dynamicBody), función SolveTOI, archivo /SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Dynamics/b2World.cpp, línea 670.

He buscado en otra parte pero parece ser un problema con la implementación de Sprite Kit (y cubriendo) de Box2D.

¿Tal vez?


Puede cambiar la propiedad dynamic un lado a otro, sin embargo, debe tener mucho cuidado si usa la detección de colisión / contacto.

Durante la colisión / contacto entre dos cuerpos, se afirma que al menos uno de ellos debe ser un cuerpo dinámico. Si cambia esa propiedad a NO en tiempo de ejecución, y el otro cuerpo en contacto también es estático (no dinámico) y se produce la devolución de llamada de colisión / contacto, arrojará este error de aserción particular: se detectará contacto entre 2 cuerpos estáticos mediados -ejecución, que Box2d no disfruta.

Un posible truco de solución: funciona para mí, incluso directamente en el método didBeginContact: :

SKPhysicsBody *temp = node.physicsBody; temp.dynamic = NO; node.physicsBody = temp;


Si la intención del póster original es desactivar las colisiones mientras se manipula directamente un SKNode, se puede hacer de la siguiente manera:

@property (nonatomic, strong) SKNode *node; @property (nonatomic, assign) uint32_t previousCollisionBitMask; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // Disable collisions & gravity self.previousCollisionBitMask = self.node.physicsBody.collisionBitMask; self.node.physicsBody.collisionBitMask = 0; self.node.physicsBody.affectedByGravity = NO; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // Enable collisions & gravity self.node.physicsBody.collisionBitMask = self.previousCollisionBitMask; self.node.physicsBody.affectedByGravity = YES; }

Esto saca el objeto del cálculo de colisiones. Al desactivar la gravedad, el objeto no se cae mientras lo mueve.

Si también le preocupa el contactTextBitMask, puede usar una lógica similar para desactivarlo mientras manipula la escena con toques.