0

ここに画像の説明を入力してください

Iv'eはこの本への答えをあちこち探しました。そして、私はこの本を読もうとした他の誰もが同じように感じていることを知っています。それは「邪悪な天才のためのプログラミングビデオゲーム」と呼ばれていますこの本を読んだ人はいますか?私はプロジェクト10:RadicalRacing-TheCarsに参加しています。すべてが正しくコンパイルされますが、何らかの理由で私の車がJFrameの正しい場所に表示されません。それらは2本の白い線の下に表示されているはずです。コードは本とまったく同じですが、本は間違っています。原点の高さ部分を変えてみましたが、何をしても動かなくなります。担当者が10人以上いないため、画像を添付できません。これは、車の配置を処理するコードです。

public class TheCars extends JFrame
{
final int WIDTH = 900; int HEIGHT = 650;

double p1Speed = .5, p2Speed = .5;


Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2, WIDTH/30,WIDTH/30);


Rectangle p2 = new Rectangle(((WIDTH/9)+((int)((WIDTH/9)*1.5)/2)),(HEIGHT/2)+    
(HEIGHT/10),WIDTH/30,WIDTH/30);
//the constructor
public TheCars()
{
    //the following code creates the JFrame
    super("Radical Racing");
    setSize(WIDTH,HEIGHT);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);

    //start the inner class (which works on it's own because it is a thread)
    Move1 m1 = new Move1();
    Move2 m2 = new Move2();
    m1.start();
    m2.start();

  }
  //this will draw the cars and the racetrack
  public void paint(Graphics g)
 {
     super.paint(g);

  //set the color to blue for p1
    g.setColor(Color.BLUE);
    //now draw the actual player
    g.fill3DRect(p1.x,p1.width,p1.width,p1.height,true);

    //set the color to red for p2
    g.setColor(Color.red);
    //now draw the actual player
      g.fill3DRect(p2.x,p2.width,p2.width,p2.height,true);

}
private class Move1 extends Thread
{
    public void run()
            //This should all be in an infinite loop so that the process repeats.
    {
        while(true)
        {
        //now put in the try block. This will let 
        //the program exit if there is an error
        try
        {
            //first refresh the screen
            repaint();
            //increase speed a bit
            if(p1Speed<=5)
                p1Speed+=.2;
            p1.y-=p1Speed;

            //this delays the refresh rate
            Thread.sleep(75);
        }
        catch(Exception e)
        {
            //if there is an exception (an error), exit the loop
            break;

        }

        }
    }
}

private class Move2 extends Thread
{
    public void run()
    {
    //this should all be in an infinite loop so the process repeats
    while(true)
    {
    //now put the code in a "try" block.
        //this will let the program exit if there is an error
        try
        {
            //first refresh the screen
            repaint();
            //increase the speed a bit
                    if(p2Speed<=5)
                        p2Speed+=.2;
                    p2.y-=p2Speed;

                    //this delays the refresh rate
                    Thread.sleep(75);
        }
        catch(Exception e)
        {
            //if there is an exception (an error), exitthe loop
            break;
        }
    }
    }

 }
public static void main(String[]args)
{
    new TheCars();
}

}
4

1 に答える 1

3

Rectangleこれらのオブジェクトを画面に直接ペイントすると仮定すると、式 " HEIGHT/2" と " HEIGHT/2 + HEIGHT/10" は等しくなり、ゼロではなく小さいと仮定する必要があります。これは、HEIGHT が でint、値が 2 より大きく 10 より小さい場合に当てはまります。おそらく、これらのボックスを画面の中央に表示するには、少なくとも値を数百にする必要があります。の値を確認しHEIGHT(a を使用するだけSystem.out.println()で問題ありません)、それがウィンドウの実際の高さであることを確認します。

編集

コードの残りの部分を確認したので、各呼び出しの 2 番目の引数fill3DRect()が間違っています。yオブジェクトのメンバーである必要がありますが、これは大きくて変化する数ですが、小さな固定数であるメンバーRectangleを渡しています。width両方の呼び出しを次のように変更すると、元に戻ります。

g.fill3DRect(p1.x, p1.y, p1.width, p1.height, true);
于 2012-05-19T00:52:24.420 に答える