web-dev-qa-db-ja.com

Javaで背景画像を設定する方法は?

IDEとしてBlueJを使用してJavaを使用してシンプルなプラットフォームゲームを開発しています。現時点では、ゲーム内にプレイヤーや敵のスプライト、プラットフォーム、その他のアイテムをポリゴンとシンプルな図形を使用して描画しています。それらを実際の画像に置き換えます。

今のところ、ゲームウィンドウ/キャンバスの「背景」として画像(URLまたはローカルソースから)を設定する最も簡単な解決策は何ですか?

プログラミングスキルがあまり良くないので、長くも複雑でもなければ、プログラムをできるだけシンプルに保ちたいと思います。サンプルコードにコメントを付けて機能を詳しく説明し、それが独自のクラスにある場合は、他のクラスで使用される関連メソッドを呼び出す方法を提供してください。

どうもありがとうございました。

22
Dew

答えは、アプリケーションまたはアプレットが [〜#〜] awt [〜#〜] または Swing のいずれを使用しているかによって若干異なります。

(基本的に、JJAppletなどのJFrameで始まるクラスはSwingであり、AppletFrameはAWTです。

どちらの場合でも、基本的な手順は次のとおりです。

  1. Imageオブジェクトに画像を描画またはロードします。
  2. 背景を描画するComponentのペインティングイベントで背景画像を描画します。

ステップ1.イメージのロードは、 Toolkit クラスを使用するか、 ImageIO クラスを使用します。

Toolkit.createImage メソッドを使用して、Imageで指定された場所からStringをロードできます。

Image img = Toolkit.getDefaultToolkit().createImage("background.jpg");

同様に、ImageIOを使用できます。

Image img = ImageIO.read(new File("background.jpg");

ステップ2.背景を取得するComponentのペイントメソッドをオーバーライドし、Imageをコンポーネントにペイントする必要があります。

AWTの場合、オーバーライドするメソッドは Paint メソッドであり、 drawImage メソッドに使用される Graphics オブジェクトに渡されるPaintメソッド:

public void Paint(Graphics g)
{
    // Draw the previously loaded image to Component.
    g.drawImage(img, 0, 0, null);

    // Draw sprites, and other things.
    // ....
}

Swingの場合、オーバーライドするメソッドは、 paintComponentJComponent メソッドであり、AWTで行われたのと同様にImageを描画します。

public void paintComponent(Graphics g)
{
    // Draw the previously loaded image to Component.
    g.drawImage(img, 0, 0, null);

    // Draw sprites, and other things.
    // ....
}

単純なコンポーネントの例

これは、インスタンス化されたときに画像ファイルをロードし、その画像を自身に描画するPanelです:

class BackgroundPanel extends Panel
{
    // The Image to store the background image in.
    Image img;
    public BackgroundPanel()
    {
        // Loads the background image and stores in img object.
        img = Toolkit.getDefaultToolkit().createImage("background.jpg");
    }

    public void Paint(Graphics g)
    {
        // Draws the img to the BackgroundPanel.
        g.drawImage(img, 0, 0, null);
    }
}

ペイントの詳細:

28
coobird

最初に、WorldViewクラスを拡張する新しいクラスを作成します。新しいクラスBackgroundを呼び出しました。したがって、この新しいクラスでは、paintBackgroundメソッドをオーバーライドするために必要なすべてのJavaパッケージをインポートします。これは次のようになります。

_import city.soi.platform.*;
import Java.awt.Graphics2D;
import Java.awt.Image;
import Java.awt.image.ImageObserver;
import javax.swing.ImageIcon;
import Java.awt.geom.AffineTransform;
_

次に、クラス名の後に、WorldViewを拡張することを確認します。このようなもの:

_public class Background extends WorldView
_

次に、タイプGameの変数gameとタイプImageの画像変数を次のように宣言します。

_private Game game;
private Image image;
_

次に、このクラスのコンストラクターで、タイプGameのゲームがコンストラクターのシグネチャ内にあり、superの呼び出しでWorldViewを初期化する必要があることを確認します。 、ゲームを初期化し、画像変数を次のように初期化します。

_super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight());
this.game = game;
bg = (new ImageIcon("lol.png")).getImage();
_

次に、paintBackgroundクラスのPaintメソッドをオーバーライドするときとまったく同じ方法で、Playerメソッドをオーバーライドします。ちょうどこのような:

_public void paintBackground(Graphics2D g)
{
float x = getX();
float y = getY();
AffineTransform transform = AffineTransform.getTranslateInstance(x,y);
g.drawImage(bg, transform, game.getView());
}
_

最後に、Gameクラスで作成したばかりの新しいクラスへのクラスレベルの参照を宣言し、Gameコンストラクターでこれを初期化する必要があります。

_private Background image;

And in the Game constructor:
image = new Background(this);
_

最後に、フレームに背景を追加するだけです!それが私たち全員が行方不明だったと確信していることです。これを行うには、変数frameが宣言された後、次のような操作を行う必要があります。

_frame.add(image);
_

frame.pack();の直前にこのコードを追加してください。また、大きすぎない背景画像を使用してください!

これで終わりです!ゲームエンジンはJPEGおよびPNG画像形式を処理できますが、他の形式もサポートできることに気付きました。これはゲームに背景画像を含めるのに役立ちますが、完璧ではありません!次のレベルに進むと、すべてのプラットフォームとスプライトが非表示になり、ゲームに含まれている背景画像とJLabels/Jbuttonのみが表示されるためです。

<script>
function SetBack(dir) {
    document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>
0
Joe McComas

またはこれを試してください;)

try {
  this.setContentPane(
    new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
0
JavaIsCool