在Apple Developer's Guide中,它说:
Sprite Kit使用国际单位制,也称为SI, 或米 - 千克 - 秒系统。必要时,您可能需要 在线咨询其他参考资料以了解更多相关信息 Sprite Kit
使用的物理方程
我正在开发一款带有蝙蝠的小游戏,当用户触摸屏幕时,它可以摆动翅膀。对于主菜单,我希望我的蝙蝠保持上下飞行,描述谐波振荡,如this video 01:43 to 01:46
代码
-(SKSpriteNode *)createBat:(float)scale {
SKSpriteNode *bat = [SKSpriteNode spriteNodeWithImageNamed:@"bat_01"];
bat.xScale = scale;
bat.yScale = scale;
bat.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bat.size];
return bat;
}
-(SKAction *)actionSwingWings {
return [SKAction runBlock:^{
[self.player.physicsBody setVelocity: CGVectorMake(0.0f, 450.0f)];
}];
}
-(float)timeToReturnToInitialPositionAfterJump {
/* CODE SUPPRESSED TO SPARE CHARACTERS
ORIGINAL CODE CALCULATES BHASKARA WITH a=gravity/2, b=initSpeed=450.0 & c=0
c=0 because I want my bat to swing wings again when he falls back to the last wing swing position
The bhaskara function is tested and returning the correct values */
}
-(SKAction *)actionStationaryFly {
return [SKAction repeatActionForever:
[SKAction sequence:@[
[self actionSwingWings],
[SKAction waitForDuration:[self timeToReturnToInitialPositionAfterJump]]
]]
];
}
问题
主要想法是使用Bhaskara功能来了解每只机翼摆动之间必须等待多少时间,但它不起作用。我检查了计算和bhaskara函数是否一致。另一方面,蝙蝠行为不是。
我为这个应用程序选择了Bhaskara,因为positionChange = initialSpeed * time + 0.5 * speedUp * time * time,正如物理学在公式中告诉我们的那样。当positionChange = 0且时间> 0时,我应该得到机翼摆动间隔。
对于当前值: 比重= -9.8; initialVelocity = 450; 我的Bhaskara返回91.8,而只有当我将机翼摆动时间设置为0.6(每0.6秒一个机翼摆动)时,蝙蝠才显示出所需的行为。
为什么系统的行为如此?如果CGVectors代表SI所说的SI,那么实际的蝙蝠行为是否应该与基于它的速度和加速计算一致?