У меня есть интересная проблема. Я создаю SKSpriteNode со связанным физическим телом.
SKTexture *shipTexture = [SKTexture textureWithImageNamed:@"Spaceship"];
self.heroSpriteNode = [HeroSpriteNode spriteNodeWithTexture:shipTexture size:CGSizeMake(40, 35.2)];
self.heroSpriteNode.physicsBody = [SKPhysicsBody bodyWithTexture:shipTexture size:CGSizeMake(40, 35.2)];
self.heroSpriteNode.physicsBody.dynamic = YES;
self.heroSpriteNode.physicsBody.mass = 1000.0;
self.heroSpriteNode.physicsBody.affectedByGravity = NO;
self.heroSpriteNode.physicsBody.allowsRotation = YES;
self.heroSpriteNode.physicsBody.angularDamping = 0.5;
self.heroSpriteNode.anchorPoint = CGPointMake(0.5,0.5);
self.heroSpriteNode.physicsBody.categoryBitMask = heroCategory;
self.heroSpriteNode.physicsBody.contactTestBitMask = groundCategory;
self.heroSpriteNode.physicsBody.collisionBitMask = groundCategory | edgeCategory;
Сама Сцена не имеет гравитации.
В подпрограмме обновления я вызываю applyTorque: для физического тела.
-(void) updateWithDeltaTime:(NSTimeInterval)seconds
{
CGFloat rotateTorque = self.rotateRate;
switch (self.rotateForceApplied)
{
case leftForceApplied:
break;
case rightForceApplied:
rotateTorque = -1.0 * rotateTorque;
break;
case zeroForceApplied: // separate from default in case behavior should change
rotateTorque = 0.0;
break;
default:
rotateTorque = 0.0;
break;
}
NSLog(@"before physics position: x %f, y %f", self.heroSpriteNode.position.x, self.heroSpriteNode.position.y);
[self.heroSpriteNode.physicsBody applyTorque:rotateTorque];
NSLog(@"after physics position: x %f, y %f", self.heroSpriteNode.position.x, self.heroSpriteNode.position.y);
}
Спрайт вращается и, кажется, вращается на месте. То, что он на самом деле делает, это вращение вокруг центральной точки (поэтому нет чистого бокового движения). Это видно по регистрации положения спрайта до и после применения крутящего момента. К физическому телу не применяются никакие другие действия. Движение в позиции составляет не более 9 пунктов в каждую сторону.
Поскольку камера привязана к спрайту «героя» ограничениями, а мир движется вместе с камерой (пример кода centerOnNode:), это приводит к тому, что весь мир движется по кругу по мере вращения спрайта. Сам мир не вращается, а движется с той же скоростью по кругу, что и вращение.
Я думаю, что со спрайтом anchorPoint равным 0,5, 0,5 он должен вращаться вокруг центральной точки, которая не должна изменять положение спрайта.
Что бы я делал не так с этим?
Если это имеет значение, это iOS9, Xcode7, работающий на устройстве, а не в симуляторе. (Документация по SpriteKit для iOS9 находится в открытом доступе на веб-сайте Apple, как и публичная бета-версия самой iOS9, поэтому это не должно нарушать никаких соглашений о неразглашении, и я в любом случае не думаю, что здесь есть что-то конкретное для iOS9)