0

シンプルなスプライトを画面上で動かそうとしています。別のソースコードの指示に従っているが、他のコードの他の機能から追加された複雑さを取り除いたため、このコードの何が問題なのか頭に浮かびません。今は、画面上で自由に動き回れるようにしようとしています。後で、アニメーションが動きながら変化することを意図しています。両方のクラスのコードを以下に示します。

package game;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;
import javax.swing.Timer:

public class Game extends JPanel implements ActionListener {

int x, y, b_width, b_height;
Player player;
      Timer timer;

public Game() {
    addKeyListener(new KeyRecorder());
    player = new Player();

                timer = new Timer(5, this);
                timer.start();
}

public void paint(Graphics g){
    g.drawImage(player.image, player.getX(), player.getY(), this);
}

@Override
public void actionPerformed(ActionEvent e) {
    player.move();
    repaint();
}

public class KeyRecorder extends KeyAdapter{
    public void keyPressed(KeyEvent e){
        player.keyPressed(e);
        repaint();
    }
    public void keyReleased(KeyEvent e){
        player.keyReleased(e);
    }
}

}

そしてスプライト:

package game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class Player {

private String sprite = "sprite.png"; 
int x, y, dx, dy;
int width, height;
Image image;

public Player() {
    ImageIcon ii = new ImageIcon(this.getClass().getResource(sprite));
    image = ii.getImage();

}

public int getX(){
    return x;
}

public int getY(){
    return y;
}

public void move() {
    x = x + dx;
    y = y + dy;
}

public void keyPressed(KeyEvent e){
    int key = e.getKeyCode();

    if(key == KeyEvent.VK_UP){
        dy -= 3;
    }
    if(key == KeyEvent.VK_DOWN){
        dy += 3;
    }
    if(key == KeyEvent.VK_LEFT){
        dx -= 3;
    }
    if(key == KeyEvent.VK_RIGHT){
        dx += 3;
    }
}

public void keyReleased(KeyEvent e){
             int key = e.getKeyCode();

    if(key == KeyEvent.VK_UP){
        dy -= 0;
    }
    if(key == KeyEvent.VK_DOWN){
        dy += 0;
    }
    if(key == KeyEvent.VK_LEFT){
        dx -= 0;
    }
    if(key == KeyEvent.VK_RIGHT){
        dx += 0;
    }
}


}
4

2 に答える 2

0

カスタム ペイントは、paint() メソッドではなく、paintComponent() メソッドをオーバーライドすることによって行われます。

KeyEvents は、フォーカスのあるコンポーネントによってのみ受信されます。パネルにフォーカスがあるようには見えません。コンストラクターでは、次を追加する必要があります。

setFocusable(true);
于 2013-02-18T16:10:23.263 に答える
0

スイングについてはよくわかりませんが、描画するフレームごとに「repaint()」を呼び出していますか? 例えば

thePanel.repaint();

ちらつく場合は、パネルをダブルバッファリングに設定することもできます

setDoubleBuffered(true);

とにかくそれらがあなたを助けることを願っています。それがあなたの質問に答えない場合、おそらくこれはhttp://docs.oracle.com/javase/tutorial/uiswing/painting/になります

于 2013-02-18T16:42:09.550 に答える