ios - Physicsbody no se adhiere al punto de anclaje del nodo
sprite-kit skphysicsbody (6)
Escribí esto para corregir la falta de Apple:
use pathForRectangleOfSize:withAnchorPoint:
para reemplazar su llamada a bodyWithRectangleOfSize:
cuya breve documentación nos dice el problema: "Crea un cuerpo de física rectangular centrado en el origen del nodo propietario".
@implementation SKPhysicsBody (CWAdditions)
+ (CGPathRef)pathForRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
CGPathRef path = CGPathCreateWithRect( CGRectMake(-size.width * anchor.x, -size.height * anchor.y,
size.width, size.height), nil);
return path;
}
+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
CGPathRef path = [self pathForRectangleOfSize:size withAnchorPoint:anchor];
return [self bodyWithPolygonFromPath:path];
}
@end
Editar : Hay una API nueva en 7.1 para proporcionar esta supervisión.
+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s center:(CGPoint)center
Mi escena tiene un montón de rectángulos con cuerpos de física que son del mismo tamaño que el rectángulo. Me gusta anclar todos mis objetos a CGPointZero, sin embargo, cuando lo hago, me doy cuenta de que el cuerpo físico permanece anclado en el medio. En otras palabras, la posición de mi cuerpo de física es como 100 píxeles inferior y a la izquierda de la representación visual.
Aquí hay un fragmento de código simple:
SKSpriteNode* square = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(width, height)];
square.anchorPoint = CGPointZero; //position based on bottom-left corner
square.position = CGPointMake(x, y);
square.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(width, height)];
Cualquier idea o consejo para resolver este problema sería apreciada. Por ejemplo, si pudiera visualizar los cuerpos físicos, eso podría ayudar, pero no estoy seguro de cómo hacerlo.
ACTUALIZACIÓN: Así que he resuelto el problema simplemente no estableciendo el punto de anclaje y reposicionando mis rectángulos. Entonces, el problema todavía existe, pero tengo un trabajo en el lugar y el trabajo está funcionando bien.
Estoy usando Swift pero el SKPhysicsBody
estaba medio ancho y alto incorrecto. Estoy usando un punto de anclaje (0,0). Luego usé el método con rectangleOfSize
, center
:
var cc = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(32, 64))
cc.physicsBody = SKPhysicsBody(rectangleOfSize: cc.size, center: CGPointMake(32/2, 64/2))
Espero que también funcione para ustedes muchachos ... ¡gracias!
Me he topado con esto al usar SpriteKit. Lamentablemente, parece haber problemas basados en el momento de crear un cuerpo de física y, de hecho, agregar el nodo a la escena. Si cambias el orden de tu código y te aseguras de que no has CUALQUIER cambio de física hasta que el nodo esté realmente en el árbol de renderizado, eso debería resolver la ''rareza'' y todo saldrá bien.
Necesitas el anclaje solo cuando configuras la posición de tu spriteNode. No entiendo por qué tendrías que mover físicacuerpo (que es del mismo tamaño de nodo, supongo) a una esquina ... Pero es posible que encuentres útil este método de clase [SKPhysicsBody bodyWithPolygonFromPath: path].
Aquí hay un buen generador para eso: http://dazchong.com/spritekit/
Puedes usar
[SKPhysicsBody bodyWithRectangleOfSize:size center: center];
CGPoint center = CGPointMake(size.width*(anchorPoint.x-0.5f), size.height*(0.5f-anchorPoint.y))
debe transformar el cuadro delimitador de acuerdo con el punto de anclaje del nodo padres
Swift 4.1
deje centerPoint = CGPoint (x: house1.size.width / 2 - (house1.size.width * house1.anchorPoint.x), y: house1.size.height / 2 - (house1.size.height * house1.anchorPoint. y))
house1.physicsBody = SKPhysicsBody (rectangleOf: house1.size, center: centerPoint)