0

Java でプログラミングしているゲームに問題があります。これがコードです。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Game extends JFrame {
    private static final long serialVersionUID = 1L;

    Graphics dbg;
    Image dbImage;
    static Image block;
    static Block block1 = new Block();
    static Image player1;
    static Player player = new Player(193, 143);

    public Game() {
        Image playerIcon = new ImageIcon("res/play.png").getImage();
        setSize(500, 400);
        setTitle("Game");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setIconImage(playerIcon);
        setLocationRelativeTo(null);
        setVisible(true);
        addKeyListener(new InputHandler());
        setBackground(Color.BLACK);
        setResizable(false);
    }

    public static void main(String[] args) {
        new Game();
        Thread p = new Thread(player);
        p.start();
    }

    @SuppressWarnings("static-access")
    public void paint(Graphics g) {
        try {
            dbImage = ImageIO.read(new File("res/background.png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            player1 = ImageIO.read(new File("res/play.png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            block = ImageIO.read(new File("res/grass.png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        dbg = dbImage.getGraphics();
        draw(dbg);
        g.drawImage(dbImage, 0, 0, this);
        g.drawImage(player1, player.x, player.y, this);
        g.drawImage(block, block1.x, block1.y, this);
    }

    public void draw(Graphics g) {
        repaint();
    }
}

これが画像を追加した場所であるため、このクラスのみを追加しました。他のクラスも見たい方はコメントください。問題は、画像 player1 とブロックが点滅していることです。

4

1 に答える 1

2
  1. EDT (イベント ディスパッチャ スレッド) でファイル I/O を実行しないでください。このpaint(Graphics g)メソッドは EDT で AWT/Swing によって呼び出されるため、そこに画像をロードしないでください (Zebby Dee が正しく指摘しているように)。それらをコンストラクターで初期化するか、SwingWorker などを介してロードします。

  2. メソッドを使用して間接的に行うためrepaint、 fromを呼び出さないでください。これにより、無限の再描画ループが発生します。ゲームを定期的に再描画する必要がある場合は、 aなどを使用して、別のスレッドから定期的にリクエストを送信します。何らかの理由で、画像のオブジェクトもメソッドに渡し、決して使用しないでください。そこに何の意図があるのか​​わからない。 paintdrawTimerrepaintGraphicsdraw

これら 2 つの問題の組み合わせにより、点滅効果が発生します。

于 2013-10-25T20:25:33.397 に答える