0

簡単に言えば、私はJavaでレースゲームを作っています。私は数冊の本と数学の知識を使って独学で学んでおり、プログラミングを始めてまだ 3 週間しか経っていないので、すべての詳細をまだ学んでいます。背景は次のとおりです。

外接する四角形で囲まれたプレーヤーの画像があり、コードはそのプレーヤーの四角形がフィニッシュ ラインである四角形と交差するタイミングを確認します。ラインと交差するたびに、p1Laps がインクリメントされます。値が特定のポイントに達すると、ゲームは終了し、プレーヤーが勝者と宣言されます。

ここに問題と質問があります: 私の問題は、長方形が交差するたびに Java が複数の交差をカウントしていることです。通常は 8 が交差するため、p1Laps は 8 回インクリメントされます。これは一貫して発生する場合は問題になりませんが、ラップが異なる値で増加することがあります。4、7、および 8 の増分に遭遇したため、特定の周回数後にレースが終了するように値を設定するのは困難です。

私の最初の質問は「なぜ?」2つの長方形が交差するときにJavaが非常に多くの交差をカウントするのはなぜですか? どちらも 2D 形状であることと関係があると思いますが、間違っている可能性があります。

2 番目の質問は、一貫した値でインクリメントを発生させる方法です。できれば「1」ですが、仕上げ値を調整するだけなので、それは最優先事項ではありません。

関連すると思われるコードを次に示します (多くのコードが削除されています)。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.applet.AudioClip;

public class RacerDoom extends JFrame {
//lap counter
int p1Laps=0;

//bouding rectangles
Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30);
Rectangle finishtop = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70);

//check for intersect
if(p1.intersects(finishtop)&&p1Direction==UP){
                        p1Laps++;}
//choose winner
if(p1Laps>=24) {
                        if(!winnerChosen) {
                            winnerChosen = true;
                            break;
}
}

述べたように、増分は通常 8 ずつ増加しますが、(一見) 理由もなく 7 ずつ増加し、「ブースト」が有効になっている場合 (プレーヤーの速度が 2 倍になる) は 4 だけ増加します。ご協力いただきありがとうございます。

4

3 に答える 3

3

その理由は、車がフィニッシュ ラインを通過するのに数フレームかかるためと考えられます。これは、各車がすでにフィニッシュ ラインを通過しているかどうかを追跡することで解決できます。boolean車ごとに変数を使用します。

boolean p1IsOnFinishLine = false;
boolean p2IsOnFinishLine = false;

車がフィニッシュ ラインとif交差しているかどうかを確認するように変更します。これは、車がラインに到達する最初のフレームであることを意味します。その場合は、増やして に設定します。さて、次のフレームでは、車はまだフィニッシュ ラインと交差しますが、 が であるため、すでにそのラップを数えていることがわかっているので、再度行う必要はありません。車がゴールラインと交差しなくなったら、 に設定して、次の交差の準備を整えることができます。 p1IsOnFinishLinefalsep1Laps p1IsOnFinishLinetruep1IsOnFinishLinetruep1IsOnFinishLinefalse

于 2011-09-09T19:37:36.393 に答える
1

プレイヤーは実際に複数のフレームでフィニッシュ ラインと交差しています。更新ごとに、交差しているかどうかを確認します。これは、あなたがフィニッシュ ラインと交差する 8 フレームの長さであることを意味します。私が提案するのは、一線を越えるチェックの方法を変えることです。

  • フィニッシュ ラインとして長方形の代わりに線を使用します。これは、画面上で長方形として維持できないという意味ではありません。
  • 次のようなチェック システムを使用します:
    If (プレイヤーがラインの前にいて、次のフレームでプレイヤーがフィニッシュ ラインの後にいる場合) then lap++

    次のようなもの(下から上にレースしていると仮定):

    if (p1.y > finishLineY && p1.y + speedY < finishLine) lap++;
    
于 2011-09-09T19:40:12.960 に答える
1

他の答えは、問題がどこにあるのかを教えてくれます。

ただし、これを理解する簡単な方法の 1 つは、デバッグを試みることです。IDE (統合開発環境) で Java コードを記述します。通常、デバッガーが付属しています。デバッガーを使用してブレークポイントを設定できます。デバッグ モードでコードを実行し、ブレークポイントがある正確な行にコードが到達すると、一時停止し、デバッガーがコードに移動します。その後、何が起こっているかを確認できます。p1Laps などの変数を表示できます。その後、コードを 1 行ずつ実行できます。動作を調べると、コードについて多くのことがわかり、多くの場合、問題をすぐに検出できます。

于 2011-09-09T19:44:03.840 に答える