SpriteKit SKPhysicsBody applyTorque导致精灵位置改变
问题描述:
我有一个有趣的问题。我用相关的物理体创建了一个SKSpriteNode。SpriteKit SKPhysicsBody applyTorque导致精灵位置改变
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:示例代码),当精灵旋转时,这会导致整个世界以圆形模式移动。世界本身并不旋转,而是以与旋转相同的循环模式以相同的速度移动。
随着sprite anchorPoint为0.5,0.5,我认为它应该围绕不应该改变精灵位置的中心点旋转。
我会怎么做这个错误呢?
如果重要的话,这是iOS9,Xcode7,不在模拟器上运行的设备上运行。 (iOS9 SpriteKit文档在Apple的网站上公开发布,iOS9的公开测试版本也是如此,所以这不应该打破任何NDA,我不认为这里的任何东西是iOS9特有的)
答
Sprite Kit是物理引擎,试图模仿真实世界中物体的特征,所以你应该期望模拟中物理体的物体像自然界那样运行。在这种情况下,你正在旋转一个非均匀的物理体,这个物体可能会非均匀地旋转,并且可能会随时间移动(除非物体围绕其质心旋转)。如果将物理体更改为圆形,则精灵应该均匀旋转并保持在固定位置。
好的,这是有道理的,而且确实解决了这个问题。我想其他的“解决方案”将是找出重心并适当地设定定位点。太多工作。虽然一个圆形的物理机构会稍微混淆接触/碰撞,但在大多数情况下,没有人应该注意到像素或三个差异。谢谢! – chadbag