我正在使用SpriteKit的内置物理引擎来构建iOS游戏。基本上,它涉及一个弹跳球,通过我手动设置其初始速度,然后通过重置与地板的接触事件中的速度弹跳。
问题是,此环境的实际数学运算未加总。使用“SUVAT”方程,可以很容易地确定以一定速度 throw 球时,球到达地面时x位移应该有多远,但是(重力设置为-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);
}
请有人可以解释我在做什么错吗?我已经对数学进行了仔细检查(我是数学系的学生,所以手指交叉不是问题)!
谢谢!
史蒂夫
最佳答案
所以我终于设法弄清楚了。万一其他人遇到同样的问题,我会在这里发布答案:
问题是,尽管重力(显然)以ms ^ -2为单位,速度为m2 ^ -1(以复制地球),但物镜C中的任何距离均以POINTS为单位,而不是以METRES的要求形式。因此,使用从SKSpriteNodes等获取的x,y位置/大小值进行的任何计算都将成为一定因素。
经过几次测试,我发现该因子大约为157。这意味着您必须将POINTS中的任何大小/距离乘以157,才能获得适用于SUVAT的相对“METRE”值。
实际的数字本身看起来有点可笑,因为它们都很大(速度,距离等),但是实际上它们并不存在问题,因为它们现在彼此相对工作!
希望这对任何人有帮助!
史蒂夫