2011-12-07 9 views
3

私は問題があります。私は、Javaアプレットとforループで描かれたイメージを持っています。毎回xを5ずつ動かします。それを消去...Javaイメージペイントの問題

for(int tohouse = 0; tohouse <= 520; tohouse+=2) { 
    try { 
    x+=5; 
    tohouse+=10; 

    if (pos == 0) { 
     rectX+=5; 
     g.drawImage(picture1,x,150,this); 
     pos = 1; 
    } else if (pos == 1) { 
     rectX+=4; 
     g.drawImage(picture2,x,150,this); 
     pos = 2; 
    } else if (pos == 2) { 
     rectX+=5; 
     g.drawImage(picture3,x,150,this); 
     pos = 0; 
    } 
    } 
} 

はHERESに画像:

Image

+0

これらのif文とelsesをすべて持つ代わりにswitch文を使用しないでください。 – PTBG

+0

私はそれらの感謝を忘れました!これは私のコンピュータsci APクラスのためのプロジェクトです。私はステートメントを切り替えるためにそれを修正しようとしています。 –

+0

グラフィカルなゲームの基本的な解剖学的構造を理解し、理解する必要があります。あなたが学ばなければならない絶対的な最初の教訓は、*グラフィックスのレンダリング*ゲームの状態の変更*は、タイミングとコードの配置場所の両方で独立した操作でなければなりません。 http://www.theopavlidis.com/Games/Tutorial_Draft_01/part00.htm(私が見つけることができる最初の結果)を見てください。あなたは単にあなたのpaintメソッドにfor-loopを置くことによってアニメーションを行うことはできません。 –

答えて

3

あなたのpaintComponent()またはpaint()方法でループすることにより、アニメーションを行うことはできません。これらの方法では、の具体的なの時点(つまり、現在のフレーム)で自分をペイントするように求めています。

代わりに、スプライトを「レンダリング」することからスプライトを「移動」するロジックを切り離す必要があります。このようなものを探してください

private int x; 

protected void paintComponent(Graphics g) { 
    //draw the images at location x 
} 

// elsewhere, initialize a javax.swing.Timer to increment x every 15 ms 
new Timer(15, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     x += 5; 
     repaint(); 
    } 
}.start(); 
0

これを試してみてください。

for(int tohouse = 0; tohouse <= 520; tohouse+=2) 
{ 
    try 
    { 
     switch(pos){ 
     case 0: 
      rectX+=5; 
      g.drawImage(picture1,x,150,this); 
      pos = 1; 
      break; 
     case 1: 
       rectX+=4; 
       g.drawImage(picture2,x,150,this); 
       pos = 2; 
      break; 
     case 2: 
      rectX+=5; 
      g.drawImage(picture3,x,150,this); 
      pos = 0; 
      break; 
     default: // add some default behavior here 
      break; 
     } 
    } catch(Exception e){ 
     // do something 
    } 
} 
0

Yフレームを再描画するようJavaに指示する必要があります。

あなたのJComponentrepaint()を使用すると、画像がforループの最後にあることになります。このように:

for(int tohouse = 0; tohouse <= 520; tohouse+=2) { 
    try { 
    //Process the changes 
    } 
    component.repaint(); // where component is what the image is added to. 
} 
+0

ロジックは*彼のペイント方法の中にあるので動作しません。 –

+0

彼は 'paint()'メソッドの中にいるとは言いませんでした。その時点でこれが機能する方法はありません。そして 'paint()'の内部でさえ、親コンポーネントを再ペイントすることはまだ正常に動作します(通常)。 – Jon

+0

いいえ、そうではありません。 'paint()'の中では、イベントディスパッチスレッドのイベントの中にいるので、 'repaint()'コールはすべてキューに入れられ、メソッドの実行が終了すると処理されます。 –