0

OK、Ludum Dare SharkJam の準備のためにゲームをコーディングしています。プログラミングに新しい方法を使用しています。最後の方法で PC がクラッシュしたため、これは機能するはずです。それはうまく機能し、すべてがより良いものになりますが、私が入れた画像がちらつきます。これがメインクラス全体 (画像が描画される場所) パッケージ me.NoahCagle.watermaze; です。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

import me.NoahCagle.watermaze.entity.EntityShark;
import me.NoahCagle.watermaze.entity.Player;
import me.NoahCagle.watermaze.input.Keys;
import me.NoahCagle.watermaze.map.Map;

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

Map map = new Map(0, 0);
Player player = new Player(50, 30);
static EntityShark shark = new EntityShark(400, 400);
public Image dbImage;

public Game() {
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    setTitle("Water Maze");
    setResizable(false);
    setBackground(Color.blue);
    addKeyListener(new Keys());
}

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

public void paint(Graphics g) {
    dbImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
    g.drawImage(dbImage, map.x, map.y, null);
    g.drawImage(player.player, player.x, player.y, this);
    g.drawImage(shark.shark, shark.x, shark.y, this);
    repaint();
}


}

このコードが私のために行うことは、画像が正しく機能するようにすることです。ちらつきだけです。誰でも私の問題を解決できますか? 編集:ペイントメソッドでrepaintメソッドを呼び出す場所に関係があると思うので、そこを見てください。

4

2 に答える 2

3

問題と提案:

  • 1 つの問題は、JFrame のメソッドで直接描画していることです。paintこれにより、自動ダブル バッファリングが得られないため、ちらつきが発生します。代わりに、JPanel のメソッドを描画して、paintComponentswing JComponents に付属する自動ダブル バッファリングを利用します。
  • 次に、あなたはアニメーションを行うためのひどく制御不能な方法であるrepaint()内部から呼び出しています。paintアニメーション ループの代わりにスイング タイマーを使用します。
  • 次に、paintメソッド内で画像オブジェクトを作成しています。paint メソッドまたは paintComponent メソッドを遅くすると、描画とアニメーションの応答が遅くなります。これをしないでください。これらのメソッド内でオブジェクトを作成することは避けてください。代わりに、描画と描画のみに paintComponent メソッドを使用してください。
  • 次に、スーパー メソッドを呼び出しません。オーバーライドsuper.paintComponent(g)内で呼び出します。paintComponent
  • また、メソッドをオーバーライドするときは常に、@Overrideメソッドの署名が間違っている場合にコンパイラが通知するように、注釈を前に付けてください。
于 2013-10-29T03:42:06.457 に答える