1

だから私は 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);
    }
}
4

2 に答える 2

2

ハードコードされた時間があり、更新ループ内で、加速度を事前に計算されたタイムステップ (1 任意の単位、秒単位を使用する方がはるかに良い) で乗算するだけです。これは毎回同じであると仮定します。これは常に次のようになります。びくびくした動き。代わりに変数timestep をメソッドに渡して、それを使用する必要があります。これは、レンダリングがどれだけ速く行われても、滑らかな動きが得られることを意味します。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ます。

于 2014-05-25T19:23:18.523 に答える