ios - SpriteKit SKPhysicsBody applyTorque 导致 Sprite 位置改变

标签 ios objective-c sprite-kit ios9

我有一个有趣的问题。我创建了一个带有相关物理体的 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);

}

Sprite 旋转并且看起来在原地旋转。它实际做的是围绕一个中心点旋转(因此没有净横向运动)。这可以通过在施加扭矩之前和之后记录 Sprite 位置来查看。没有其他 Action 应用于物理体。位置的移动最多在每个方向上大约9个点。

因为相机被约束固定到“英雄” Sprite ,并且世界随着相机移动(centerOnNode:示例代码),这导致整个世界在 Sprite 旋转时以圆形模式移动。世界本身并不旋转,而是随着旋转以相同的速度以圆形模式运动。

Sprite anchorPoint 为 0.5, 0.5 我认为它应该围绕中心点旋转,这不应该改变 Sprite 的位置。

我这样做会做错什么?

如果这很重要,这是在 iOS9、Xcode7 上运行的,而不是在模拟器中的设备上。 (iOS9 SpriteKit 文档在 Apple 的网站上公开可用,iOS9 本身的公开测试版也是如此,因此这不应该违反任何 NDA,而且我不认为这里有任何内容是 iOS9 特有的)

最佳答案

Sprite Kit 是一种物理引擎,它试图模仿现实世界中物体的特性,因此您应该期望具有物理体的物体在模拟中表现得像它们在自然界中的行为。在这种情况下,您正在旋转一个不均匀的物理物体,它可能会不均匀地旋转,并且可能会随时间移动(除非该物体围绕其质心旋转)。如果将物理体更改为圆形, Sprite 应该均匀旋转并保持在固定位置。

关于ios - SpriteKit SKPhysicsBody applyTorque 导致 Sprite 位置改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361150/

相关文章:

iphone - 非条形分段控件的色调颜色

ios - Objective-C/Sprite 套件 : How do I access variables stored in UIViewController?

swift - 父物理主体不起作用

ios - 按顺序运行 Action SpriteKit

ios - Swift:购买完成时如何通知

ios - 如何为另一个 ViewController 关闭 PopViewController

ios - iOS 中的双向滚动表

ios - 防止 SKLabelNode 接收 Touches

objective-c - 类似于 Apple map 应用程序中的 MapKit 搜索 API

iOS 键盘 - 在应用程序级别以编程方式设置 keyboardAppearance 等属性