1

JFrameウィンドウを横切って画像を移動する際に問題が発生しました。コードは次のようになります。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Main extends JFrame implements KeyListener{

Image caitlanImage = new ImageIcon("Caitlan.png").getImage();
Person caitlan = new Person(caitlanImage, "Caitlan", 10, 200, true);

Person jake;
Image jakeImage;

//Background images
Image granadaBackground;

public static void main(String[] args) throws InterruptedException{
    new Main();
}
public Main() throws InterruptedException{
    setSize(700,300);
    setTitle("Project Anniversary");
    setVisible(true);   
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    addKeyListener(this);

    //Instantiate background images
    granadaBackground = new ImageIcon("Granada Background.jpg").getImage();

    //Spawn first background
    spawnBackground(granadaBackground);

    //Spawn initial sprite
    spawnSprite(caitlan);
}

public void moveSprite(Person p) throws InterruptedException{   //Method to move a         
sprite 10 pixels (BROKEN)
    Graphics g = this.getGraphics();
        p.setLocation(p.getPosX() + 10, p.getPosY());
        g.drawImage(caitlan.getImage(), caitlan.getPosX() + 10,     
caitlan.getPosY(), caitlan.getImage().getWidth(null), caitlan.getImage().getHeight(null), 
null);
}
public void paint(Graphics g){   //Overridden paint method

}
public void spawnSprite(Person p){  //Method to initially spawn a sprite
    Graphics g = this.getGraphics();
    g.drawImage(p.getImage(), p.getPosX(), p.getPosY(), 
            p.getImage().getWidth(null), p.getImage().getHeight(null), null);
}
public void keyPressed(KeyEvent e) { //Method called whenever a key is pressed
    if(e.getKeyChar() == new String("d").charAt(0)){
        try {
            moveSprite(caitlan);
        } catch (InterruptedException e1) {

        }
    }
}
public void spawnBackground(Image backgroundImage){
    Graphics g = this.getGraphics();
    g.drawImage(backgroundImage, 0, 0, backgroundImage.getWidth(null),    
backgroundImage.getHeight(null),null);
}

public void keyReleased(KeyEvent e) {   //IGNORE

}
public void keyTyped(KeyEvent e) {      //IGNORE

}

}

ここで発生するのは、「d」キーが押されるたびに、スプライトが10ピクセル右に移動することです。しかし、結局は残り10ピクセルで塗り直され、元の画像が残っているため、かなり嫌な写真が重なり合っているように見えます。これは簡単な質問のように思えるかもしれませんが、スプライトを10ピクセル移動するにはどうすればよいですか?

4

2 に答える 2

3

コードに次のようないくつかの問題があります。

  • コンポーネントを呼び出してGraphicsオブジェクトを取得しますgetGraphics()。このオブジェクトは永続化されないことに注意してください。
  • JFrameで直接描画する
  • paintComponent(...)JPanelなどのJComponentのメソッドを描画しない
  • super.paintComponent(...)メソッド内でメソッドを呼び出さないpaintComponent(...)
  • キーバインディングの代わりにKeyListenerを使用する
  • アニメーションループにスイングタイマーを使用していません。

Swingグラフィックのチュートリアルをまだ読んでいないようです。もしそうなら、遅滞なく行うことをお勧めします。このサイトにあるアニメーションの方法の多くの例も確認できます。そのうち私が作成したものです。

于 2013-03-18T22:49:07.860 に答える
0

問題を簡潔に解決するために、何が起こっているかというと、それ自体は何も再描画していないということです。古い画像の上に新しい画像を描画しているだけで、グラフィックは再描画サイクル全体で維持されます。

次のようなことをしてください:

g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight());

絵を描く直前。色を JFrame の背景色に変更して、シームレスに見えるようにします (getBackgroundColor() だけだと思います)。それでも、Swing に関する優れた本を入手する必要があります。

于 2013-03-18T22:52:37.867 に答える