Math 由于重力问题,利用时间提高速度(无法获得完美的弹性)
我只是想把球弹到原来的高度。但一旦我引入时间,而不是框架,我就会在某处失去动力 将代码降至最低限度,我有以下几点:Math 由于重力问题,利用时间提高速度(无法获得完美的弹性),math,time,physics,game-physics,gravity,Math,Time,Physics,Game Physics,Gravity,我只是想把球弹到原来的高度。但一旦我引入时间,而不是框架,我就会在某处失去动力 将代码降至最低限度,我有以下几点: public void onDrawFrame(GL10 gl) { float timeDelta = System.currentTimeMillis() - startTime; startTime = System.currentTimeMillis(); update(timeDelta); } float gravity = -1.0f; float PosY =
public void onDrawFrame(GL10 gl) {
float timeDelta = System.currentTimeMillis() - startTime;
startTime = System.currentTimeMillis();
update(timeDelta);
}
float gravity = -1.0f;
float PosY = 2400;
float VelocityY = 0;
public void update(float timeDelta){
PosY+=VelocityY;
if(PosY<=0){
VelocityY=Math.abs(VelocityY);
} else{
VelocityY+=gravity*timeDelta;
}
Log.d(SystemSingleton.sLogDebug,String.format("Pos: y%f. y%f, timeDelta: %f",PosY, VelocityY, timeDelta));
}
public void onDrawFrame(GL10 gl){
float timeDelta=System.currentTimeMillis()-startTime;
startTime=System.currentTimeMillis();
更新(时间增量);
}
浮子重力=-1.0f;
浮动位置y=2400;
浮动速度y=0;
公共无效更新(浮动时间增量){
PosY+=VelocityY;
if(PosY)
我猜这就是原因。打电话给currentTimeMillis可能会给你两个不同的号码。我会怎么做:
float currentTime = System.currentTimeMillis();
float delta = currentTime - startTime;
startTime = currentTime;
计算新位置时,需要考虑时间步长(timeDelta
),而不是这样做:
PosY += VelocityY; // no!!
这样做:
PosY += VelocityY * timeDelta;
更好的做法是:
PosY += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
此外,我会稍微更改反弹检测。以下是一些新代码供您尝试:
// Perform the integration
PosY += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
VelocityY += gravity * timeDelta;
// Check whether it's time to bounce
if (PosY<=0 && VelocityY<0){
VelocityY = Math.abs(VelocityY);
}
Log.d(...)
//执行集成
PosY+=VelocityY*timeDelta+0.5*重力*timeDelta*timeDelta;
速度y+=重力*时间增量;
//检查是否是反弹的时间
如果你的方式更好,但这不是主要问题。不是“问题”,而是“a”问题,我应该看到的问题。干杯。
// Perform the integration
PosY += VelocityY * timeDelta + 0.5 * gravity * timeDelta * timeDelta;
VelocityY += gravity * timeDelta;
// Check whether it's time to bounce
if (PosY<=0 && VelocityY<0){
VelocityY = Math.abs(VelocityY);
}
Log.d(...)