所以我想开始制作2D平台游戏,直到明年我都不会参加物理学,所以我在一本旧物理书中发现了方程式,我必须帮助找到x和y位置以及他们的速度。问题是,它们似乎加速太快,因为渲染速度太慢。这不是程序故障,我的错,因为我不知道如何减慢加速度以使其看起来更平滑。这是我正在使用的球类的代码(我知道代码是一个绝对的混乱!我只是在努力使方程式正确...我永远不会写这样的代码,如果我正在开展一个严肃的项目,所以请不要提醒我它看起来很糟糕)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
public class Ball extends JComponent{
public double xpos;
double oX;
double oY;
double ypos;
double xvel;
double yvel;
long time;
double oxvel;
double oyvel;
long angle = 45;
long startTime = System.currentTimeMillis();
public Ball(int p1, int p2, long t){
xpos = p1;
oxvel = 50;
oX = p1;
ypos = p2;
time = t;
oyvel = -50;
}
public void update(){
xvel = (oxvel*Math.cos(45));
yvel = (oyvel*Math.sin(45)) + (9.8*time);
if(!(xpos + xvel + 10 > getWidth())&&!(xpos + xvel < 0))
xpos +=xvel;
if(!(ypos + yvel + 10 > getHeight())&&!(ypos + yvel <= 0))
ypos+=yvel;
time++;
}
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.RED);
g2d.fillOval((int)xpos, (int)ypos, 15, 15);
}
}
答案 0 :(得分:2)
你有硬编码时间,在你的更新循环中,你只需将你的加速度乘以一个预先计算的时间步长(1个任意单位,使用秒的单位会好得多),你假设每次都是相同的,这个总是导致跳动。您应该将变量时间步长传递给方法并使用它。这意味着渲染的速度并不重要,您将获得平滑的运动。请记住,你可能会要求1/60秒,但你不会总是得到那个。
public void update(double time){
xvel = (oxvel*Math.cos(45));
yvel = (oyvel*Math.sin(45)) + (9.8*time);
if(!(xpos + xvel + 10 > getWidth())&&!(xpos + xvel < 0))
xpos +=xvel*time;
if(!(ypos + yvel + 10 > getHeight())&&!(ypos + yvel <= 0))
ypos+=yvel*time;
}
在整个循环中,您将测量实际的时间步长并通过它。您可以使用System.currentTimeMillis();
long previousStep=System.currentTimeMillis();
public void gameLoop(){
long newStep=System.currentTimeMillis();
double frameTime=(newStep-previousStep)/1000.0;
ball.update(frameTime);
previousStep= newStep;
}
time
很可能不是long
但应该是double
,以整数增量衡量的实时很难做到正确。
答案 1 :(得分:1)
Euler方法对于忠实的物理模拟来说是相当糟糕的,特别是如果你采用与两帧之间的时间一样大的时间步长。每帧执行多个10-20模拟步骤或使用更高阶的积分方法。
即使使用Euler方法,您也需要在差分系统的所有部分应用时间步长。所以它是
velocity += acceleration*timestep
position += velocity*timestep
如果你想让它成为某种辛积分器,假设加速度是由梯度力场产生的,只取决于位置,交换零件,首先更新位置,
position += velocity*timestep
velocity += acceleration*timestep