我正在开发一款非常简单的Android物理游戏,其中一个物体在某些重力下上下弹跳(0摩擦,球应始终达到相同的高度)。我希望它在所有设备上达到相同的高度(密度独立性)。我的游戏用物理编码如下,在540 * 960设备上完全正常。
注意:我的游戏的最大FPS为30
物理代码
//Instance variables
private final float acceleration = .1f;
private static float timePoint;
private float velocityY = 0;
//game loop code
timePoint += 1;//updates every tick
velocityY = velocityY - acceleration * timePoint;
position.y = (int) (position.y - velocityY);
if(position.y + bitMapHeight <= 0){
velocityY = 30;
timePoint = 0;
}
当球击中地面(y = 0)时,我只需施加30的速度,这使得球在540 * 960装置上达到所需的高度。当然,多个设备会导致严重的问题,而且这个公式并不适合所有设备。我认为最好的方法是以某种方式根据屏幕高度计算速度,但我不确定这样的最佳方法是什么。下面是一些屏幕截图,显示发生了什么。
如果有人能指出我正确的方向,我将非常感激!如果需要更多详细信息,请与我们联系。
答案 0 :(得分:1)
我不得不在前一段时间的2D游戏中解决类似的问题。
我在自己的Android设备上开发了初始物理和渲染功能,直到它在该特定设备上表现良好。然后我获得了基线&#39;相关变量的值(例如像素:bjb568所述的米),以在我的基线设备上获得正确的速度。
然后,为了让游戏在不同的设备/屏幕上以相同的方式运行,我只使用了按实际屏幕分辨率与基线屏幕分辨率的比例缩放的基线值。
我的游戏使用了SurfaceView,因此实际屏幕分辨率为&#39;基本上由表面的宽度和高度决定。
我希望有所帮助。
答案 1 :(得分:1)
为什么不在onCreate上尝试这个:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
通过它你可以获得屏幕的值,而不是使用'speedocity = 30;'你可以将它设置为'speedocityY = height / 10',例如
答案 2 :(得分:0)
为什么设置velocityY = 30;点到达底部后?我认为你应该使用完美的弹性碰撞。所以,你只需要设置velocityY = -velocityY;
答案 3 :(得分:0)
我向那些因为我的延迟回复而发帖的人道歉。我找到了一个适合我的解决方案。以下是我采取的方法。
找到物体撞击地面后应达到的目标高度(屏幕下方)。
//We want the object to bounce halfway on screen
targetBounceHeight = metrics.heightPixels / 2;
使用物理计算找到到达Y点所需的速度。
double velocityI = Math.sqrt(2 * targetBounceHeight * acceleration);
我只需找到所需的初始速度,然后将其动态插入原始代码段而不是值30(参见顶部帖子)。该解决方案完美适用于所有测试设备。希望这有助于某人!