我正在使用物理引擎内置的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);
}
请有人解释我做错了什么?我已经仔细检查了我的数学(我是一名数学学生,因此我的手指越过了,这不是问题)!
谢谢! 史蒂夫
答案 0 :(得分:1)
所以我最终成功解决了这个问题。只是因为其他人遇到同样的问题我会在这里发布答案:
问题是,虽然重力(显然)是以ms ^ -2和速度m2 ^ -1(复制地球),但是目标C中的任何距离都是以点数而不是所需的METERS形式测量的。因此,使用从SKSpriteNodes等获取的x,y位置/大小值进行的任何计算都将是一个特定因素。
在运行几次测试后,我发现该因子大致为157.这意味着您必须将POINTS中的任何大小/距离乘以157,以获得适用于SUVAT的相对“METER”值。
实际数字本身看起来有点荒谬,因为它们都非常大(速度,距离等),但实际上这并不构成问题,因为它们现在都相互作用!
希望这有助于任何人! 史蒂夫