3

私は現在、Java2D でタイルベースのゲームに取り組んでおり、安価な目の保養を追加することを考えていました。

たとえば、爆発や煙のための単純なパーティクル システム (おそらくこのようなもの) を実装します。

新しいアートを大量に (またはまったく) 描画する必要のない、比較的簡単にプログラムできる効果について何か提案はありますか?

上記のエフェクトのチュートリアルとコード サンプルも大歓迎です。

-そうです。

追伸 - 絶対に必要な場合は、LWJGL/JOGL や Slick などに切り替えることもできますが、Java2D にとどまります。

4

5 に答える 5

6

ぼかしやその他の画像フィルタリング効果の実装は、非常に簡単に実行できます。

たとえば、 でぼかしを実行するには、で指定された畳み込み行列で をBufferedImage使用できます。ConvolveOpKernel

BufferedImageOp op = new ConvolveOp(new Kernel(3, 3,
    new float[] { 
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f
    }
));

BufferedImage resultImg = op.filter(originalImg, resultImage);

ぼかし効果がいつ必要になるかはよくわかりませんが、いつか役に立つかもしれません。しかし、実装が簡単なため、簡単に達成できることだと思います。

畳み込み行列に関する情報を次に示します。シャープ、エンボス、エッジ強化などの効果を実装するためにも使用できます。

于 2009-06-10T14:53:40.080 に答える
5

ピクセル化効果の実行は、BufferedImage.

これは、次の 2 つの手順で実行できます。

  1. ピクセル化の 1 つのブロックの色を決定します。
  2. 画像上のピクセル化のブロックを埋めます。

ステップ 1: 色を決定します。

public static Color determineColor(BufferedImage img, int x, int y, int w, int h) {
    int cx = x + (int)(w / 2);
    int cy = y + (int)(h / 2);
    return new Color(img.getRGB(cx, cy), true);
}

このdetermineColorメソッドでは、 の中心からのピクセル カラーBufferedImageが決定され、呼び出し元に返されます。

ステップ 2: ピクセレーション ブロックを決定された色で塗りつぶします。

BufferedImage sourceImg = ...;  // Source Image.
BufferedImage destimg = ...;    // Destination Image.
Graphics g = destImg.createGraphics();

int blockSize = 8;
for (int i = 0; i < sourceImg.getWidth(); i += blockSize) {
    for (int j = 0; j < sourceImg.getHeight(); j += blockSize) {
        Color c = determineColor(sourceImg, i, j, blockSize, blockSize);
        g.setColor(c);
        g.fillRect(i, j, blockSize, blockSize);
    }
}
g.dispose();

かなりの量のコードがありますが、この効果は知的には容易に達成できる成果です。進行中の複雑な処理はそれほど多くありません。基本的に、ブロックの中心の色を見つけて、その色でボックスを塗りつぶします。これはかなり素朴な実装なので、もっと良い方法があるかもしれません。

以下は、上記のピクセル化効果を実行する前後の比較です。

ピクセル化されていない画像 モザイク画像

于 2009-06-10T16:02:50.347 に答える
1

Filthy Rich Clientsでは、非常に優れた多数の Java2D/Swing 効果について詳細に説明しています。また、これらの効果に対する優れた理論的背景も提供します。簡単に手に入る成果物がどれだけあるかはわかりませんが、ブラウズするのに最適なリソースです。

可能性の 1 つは、アルファ合成で何かを行うことです。おそらく、アルファ合成をTiming Frameworkと組み合わせます。ゲームのルールによっては、選択的かつ時間に応じてオブジェクトを半透明にすることがゲームプレイにとって重要になる場合もあります。

于 2009-06-10T16:17:41.253 に答える
0

透明効果 (煙など) は、あまり手間をかけることなく大きな違いを生むことができます。ただし、これがJava2dで実行できるかどうかはわかりません。

于 2009-06-10T16:05:02.963 に答える
0

リアルに見えるもの、他のものから跳ね返るもの、転がり落ちるものなどはクールなものになり、ゲームがトップダウンの 2D ではなく横スクロールの 2D である場合は、既製の物理エンジンを使用できる可能性があります。 Box2D のように、わずかな労力でクールなことを実行できます。これに使用できるBox2DのJava ポートを次に示します。

于 2009-06-10T16:18:44.760 に答える