SUVAT数学不会加入SpriteKit的物理引擎(iOS - Objective C)

时间:2015-04-16 13:46:34

标签: ios objective-c math skphysicsbody physics-engine

我正在使用物理引擎内置的SpriteKit为iOS构建游戏。基本上它涉及一个弹跳球,通过我手动设置它的初始速度和弹跳,通过重置与地板接触事件内的速度。

问题是,此环境的实际数学不会累加。使用' SUVAT'方程式很容易确定球在以一定的速度投掷后到达地面时应该有多远,但是(重力设置为-9.81),它几乎不会移动一对像素。

我把问题简化为试图将球向上射出一定距离(在y方向上)并且同样的事情发生了,它向上移动了几个点然后只是落到了地上,至少是20应该走多远

这就是我设置物理环境的方法:

self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0, -9.81);

然后这是我产生这个球(向上射击)的例子。在数学上它应该达到塔的高度:

-(void)generateTestBall {
self.ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"];
SKSpriteNode * tower = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
self.ball.position = CGPointMake(self.scene.size.width/2,self.scene.size.height/2);
self.ball.size = CGSizeMake(20,20);
self.ball.color = [SKColor redColor];
self.ball.colorBlendFactor = 1;

tower.position = CGPointMake(self.scene.size.width/2 + 20,self.scene.size.height/2+100);
tower.size = CGSizeMake(20,200);
tower.color = [SKColor blueColor];
tower.colorBlendFactor = 1;
[self addChild:tower];
[self addChild:self.ball];

self.ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
self.ball.physicsBody.affectedByGravity = YES;
self.ball.physicsBody.linearDamping = NO;
self.ball.physicsBody.dynamic = YES;
CGFloat ballVel = sqrt(2*9.81*tower.size.height);
NSLog(@"%f",ballVel);
self.ball.physicsBody.velocity = CGVectorMake(0.0f, ballVel);

}

请有人解释我做错了什么?我已经仔细检查了我的数学(我是一名数学学生,因此我的手指越过了,这不是问题)!

谢谢! 史蒂夫

1 个答案:

答案 0 :(得分:1)

所以我最终成功解决了这个问题。只是因为其他人遇到同样的问题我会在这里发布答案:

问题是,虽然重力(显然)是以ms ^ -2和速度m2 ^ -1(复制地球),但是目标C中的任何距离都是以点数而不是所需的METERS形式测量的。因此,使用从SKSpriteNodes等获取的x,y位置/大小值进行的任何计算都将是一个特定因素。

在运行几次测试后,我发现该因子大致为157.这意味着您必须将POINTS中的任何大小/距离乘以157,以获得适用于SUVAT的相对“METER”值。

实际数字本身看起来有点荒谬,因为它们都非常大(速度,距离等),但实际上这并不构成问题,因为它们现在都相互作用!

希望这有助于任何人! 史蒂夫