2016-04-24 9 views
-3

に私は宇宙船が重力画面中央の星に魅了されている必要があります簡単なゲームを作ってるんです。私が今までに長方形を(まもなくロケットになるように)動かすコードは、まったく滑らかではありません。矩形も星に到達したときに停止することはありませんが、戻ってくる前に星を超えて動き続けます。必要に応じて、YA XA、私はロケットが、中心に対するスクリーン上のどこにあるか計算することで起動し、その加速度値を変更惑星重力は、Java

public void move() { 
    // Deals with gravity towards the center star 

    if (x > game.getWidth()/2) { 
     xVel -= xa; 
    } 
    if (x < game.getWidth()/2) { 
     xVel += xa; 
    } 
    if (y > game.getHeight()/2) { 
     yVel -= ya; 
    } 
    if (y < game.getHeight()/2) { 
     yVel += ya; 
    } 

    x += xVel; 
    y += yVel; 
} 

と:

は、ここに私のコードです。次に、Velocity変数xVelとyVelに加速度値を追加します。

+3

情報ありがとうございました...あなたの質問は? – pczeus

+0

*衝突検出*を追加しない限り、重力に引き付けられた物体は重心を越えて移動し、物体の後ろにある重力の引き込みから再び減速します。それは重力が働く方法です。 – Andreas

答えて

0

あなたはすべてのコードを供給していないが、あなたは浮動小数点数または倍精度を使用する必要があり、整数を使用しているように私には聞こえます。

int x; 
int velX; 

ような変数をdecalre場合は、(完全に停止した後は何もない)スムーズなアニメーションのために必要な精度を得ることはありません。整数は5/2 == 2であり、整数ではなく2.5であり、整数だけを格納することができます。これがジャッキーな動きをしている理由です。

あなたはそのようにdecalringことにより、浮動小数点変数を使用する必要があります。あなたが望む滑らかな動きを与える

float x = 0.0f; 
float vecX; 

または

double x = 0.0; 
double vecX; 

1

明らかに、など

yVel += ya; 

によって速度を変更し、それはあなたの文面から思えるようにあなたに許容可能な事のthats。しかしそれは絶えず増加するスピード(すなわち、最後までに飛ぶ)を生み出す。

あなたが一定の速度を維持したい場合は、

if (x > game.getWidth()/2) { 
    xVel = -xa; 
} 

if (x < game.getWidth()/2) { 
    xVel = xa; 
} 

と同等の操作を行います。おそらく中心の周りに長方形のオシレートがあります。更新して新しい質問が出てくるようにしてください。それは、時間の無いに対して移動されているので

1

あなたの宇宙船の動きが滑らかに見えません。バックグラウンドでCPU集約型アプリケーションを開くと、Javaプロセスの処理時間が短くなるとどうなりますか?今度はmove()を頻繁に呼んでいないので、あなたの宇宙船は突然遅くなります。

あなたはmove()に最後の呼び出しからの経過どのくらいの時間を追跡する必要がある - 私はあなたが高校物理式、距離=速度*時間を覚えていると確信しています。時間を得るには複数の方法があります - 具体的にはゲームについての議論のためにsee hereです。

これは動きを少し滑らかにしますが、動きが重力に見えるようにしたい場合は、単に自分自身で速度を使用することはできません - あなたはまた、加速を考慮する必要があります。あなたの宇宙船はあるその重力スターに向けてを加速しました。あなたの宇宙船が星に近づくほど、重力加速度が強くなります。これはウェブ上で見つけることができるはずの別の高校物理式です。

+0

時間の速度は、オブジェクトの加速にはうまくいきません。特に、2番目の積分が含まれている場合は特にそうです。速度が時間の経過とともに変化するとき、速度が時間とともに増すだけでなく、加速度も時間とともに変化するので、唯一の選択肢はすべての数学(多くの数学)を行うことだけです。このタイプのシムでは、verletの統合を使用するか、離散的な時間ステップで実行し、最小化されたエラーを受け入れます。フレーム時間を使用すると、不確定で管理不能なエラーが発生します。私は非常にフレームレートが問題だとは思っていますが。 – Blindman67