我一直在处理我正在研究的SpriteKit游戏的一些问题 . 我正在尝试做一个平台游戏风格的游戏,玩家点击屏幕以使角色跳跃 . 我通过以下方式实现这一目标:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// reset the velocity each jump, so that a constant impulse is always applied
self.player.physicsBody.velocity = CGVectorMake(0, 0);
// jump the player up
[self.player.physicsBody applyImpulse:CGVectorMake(0, PLAYER_JUMP_HEIGHT)];
}
PLAYER_JUMP_HEIGHT
只是一个常数 . 我还设置了恒定质量的播放器 .
这在iPad模拟器上运行得非常好,这是我进行大量初始测试的地方 . 然而,在调整我的代码以扩展设备分辨率(对于手机等)之后,看来我的物理现在非常关闭,特别是在iPhone 4S模拟器上 . 同样的冲动现在让玩家非常高,并且他们似乎也更快地从诸如平台之类的物体上掉下来,更像是一条线性曲线 .
我通过首先设置场景的缩放模式来缩放我的场景以容纳多个设备:
scene.scaleMode = SKSceneScaleModeResizeFill;
我还提出了一种方法来扩展游戏中的其他所有内容,方法是将当前设备的分辨率与iPad的分辨率进行比较,然后除以获得比例因子以将所有内容相乘 . 因此,在iPad屏幕宽度为2048的情况下,如果我在iPhone 4S上运行,则比例因子将是960/2048 = 0.46 . 通过这种方式,我可以使用一组可以在所有设备分辨率上缩放的常量来设计游戏,而不会出现其他缩放模式的裁剪或其他缩放问题 .
我对这可能是什么感到非常难过 . 我尝试将玩家质量和跳跃高度乘以屏幕比例因子,在所有可能的组合中,都无济于事 . 我也试过搞乱物理世界的引力和速度,这也不起作用 . 如果有人有处理这个问题的经验并且愿意分享,那么任何帮助将不胜感激 . 谢谢!
1 回答
在您的问题中需要考虑几个因素,包括不同设备的不同分辨率,重力和动量 . 为何动力?因为在
applyImpulse:(CGVector)impulse
中,impulse是一个向量,描述了添加了多少动量 . 因此,简单地将PLAYER_JUMP_HEIGHT
上的比例因子相乘是没有用的 .感谢this answer,我们可以使用名为'pixel to unit'的比率来计算制作脉冲向量所需的
dy
.以下是解释如何使玩家跳转为常量
PLAYER_JUMP_HEIGHT
. 您可能希望自己根据不同的分辨率调整它,这次您的比例因子应该起作用 .在上面的代码中,我们首先设置const
PLAYER_JUMP_HEIGHT
,一个条表示屏幕上有200个点有多高,player
和比率ptu
.然后计算
dy
并将其应用于冲动:这是用于演示,运行和播放的sample project( outdated ) . 你会发现盒子精灵实际上没有跳过红色条但略低一点 . 我认为原因是引力 .
Code updated in several places:
为不同设备定义
kScale
宏以进行快速测试 . 仅适用于纵向 .在需要的地方添加
kScale
(跳跃高度,玩家大小和重力!) . 它现在应该以相同的速度跳跃自适应高度 .