在你的问题中需要考虑几个因素,包括不同设备的不同分辨率、重力和动量。为什么要考虑动量?因为在
applyImpulse:(CGVector)impulse
中,
impulse是一个向量,描述了添加多少动量。因此,仅仅在
PLAYER_JUMP_HEIGHT
上乘以一个比例因子是没有用的。
感谢
这个答案,我们可以使用一个名为“像素到单位”的比率来计算需要多少
dy
才能使冲量向量达到所需高度。
以下是说明如何使玩家跳跃到恒定的
PLAYER_JUMP_HEIGHT
。您可能需要根据不同的分辨率自行调整它,这时您的比例因子应该起作用。
#define kScale ([[UIScreen mainScreen] bounds].size.height) / 1024.0
const CGFloat PLAYER_JUMP_HEIGHT = 200.0;
- (void)didMoveToView:(SKView *)view
{
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
NSLog(@"scale: %.3f", kScale);
NSLog(@"total height: %.1f", self.frame.size.height);
NSLog(@"jump height: %.1f%%", kScale * PLAYER_JUMP_HEIGHT / self.frame.size.height * 100);
SKSpriteNode *bar = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(CGRectGetMaxY(self.frame), 1.0)];
bar.position = CGPointMake(CGRectGetMidX(self.frame), PLAYER_JUMP_HEIGHT * kScale);
[self addChild:bar];
self.player = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(kScale * 50.0, kScale * 50.0)];
self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(kScale * 50.0, kScale * 50.0)];
self.player.physicsBody.mass = 0.25;
self.player.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)/5.0);
[self addChild:self.player];
ptu = 1.0 / sqrt([SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(1.0, 1.0)].mass);
}
在上面的代码中,我们首先设置了常量
PLAYER_JUMP_HEIGHT
,一个在屏幕上表示高度为200点的条形图,一个
player
和比率
ptu
。
然后计算
dy
并将其应用于冲量:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.player.physicsBody.velocity = CGVectorMake(0, 0);
self.physicsWorld.gravity = CGVectorMake(0, kScale * (-9.8));
CGFloat dy = self.player.physicsBody.mass * sqrt(2 * (-self.physicsWorld.gravity.dy) * (kScale * PLAYER_JUMP_HEIGHT * ptu));
[self.player.physicsBody applyImpulse:CGVectorMake(0, dy)];
}
这是一个关于IT技术的翻译内容。以下是需要翻译的内容:
这里有一个示例项目(已过时)sample project,您可以运行并玩它。您会发现盒子精灵实际上没有跳过红色条,而是低了一点。我认为原因是重力。
代码在几个地方进行了更新:
定义kScale
宏以适应不同设备的快速测试。仅在纵向方向上起作用。
在需要的地方添加kScale
(跳跃高度、玩家大小和重力!)。现在应该以相同的速度自适应高度跳跃。
applyImpulse
的CGVector
? - WangYudong