0

スプライトシート (8x8) からスプライトを取得する方法について、YouTube のビデオをいくつか見てきましたが、DesignsByZepher のチュートリアルがとても気に入りました。ただし、彼が使用する方法では、ソライト シートをインポートしてから、色をコード内で選択した色に変更します。

http://www.youtube.com/watch?v=6FMgQNDNMJcシートを表示する

http://www.youtube.com/watch?v=7eotyB7oNHEカラー レンダリング

彼のビデオを見て作ったコードは次のとおりです。

package exikle.learn.game.gfx;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class SpriteSheet {

    public String path;
    public int width;
    public int height;

    public int[] pixels;

    public SpriteSheet(String path) {
        BufferedImage image = null;
        try {
            image = ImageIO.read(SpriteSheet.class.getResourceAsStream(path));
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (image == null) { return; }

        this.path = path;
        this.width = image.getWidth();
        this.height = image.getHeight();

        pixels = image.getRGB(0, 0, width, height, null, 0, width);

        for (int i = 0; i < pixels.length; i++) {
            pixels[i] = (pixels[i] & 0xff) / 64;
        }
    }
}

^これは画像がインポートされるコードです

package exikle.learn.game.gfx;

public class Colours {

    public static int get(int colour1, int colour2, int colour3, int colour4) {
        return (get(colour4) << 24) + (get(colour3) << 16)
                + (get(colour2) << 8) + get(colour1);
    }

    private static int get(int colour) {
        if (colour < 0)
            return 255;
        int r = colour / 100 % 10;
        int g = colour / 10 % 10;
        int b = colour % 10;
        return r * 36 + g * 6 + b;
    }
}

^ そして、すべての色を扱っていると思うコードですが、これについてちょっと混乱しています。

私の質問は、どのように色修飾子を削除し、スプライト シートをそのままインポートして表示するのでしょうか?

4

2 に答える 2

1

つまり、Minicraft のソースをいじっているんですね。Notch のコードに関する問題は、彼がこのゲームで技術的にかなり制限されていることです。エンジンが行っていることは、基本的にすべてのスプライト/タイルが (グレースケールのスプライトシートから) 4 色を持つことができると言っており、レンダリング中に色を取得して設定する独自のカラー パレットを生成します。彼が設定したチャンネルあたりのビット数などを正確に思い出せません。

ただし、あなたは明らかにプログラミングに非常に慣れていないため、他の人のコードをいじったり分析したりすることに勝るものはありません..つまり、実際にそれができる場合. Screen クラスはレンダリングが行われる場所であるため、スプライトシートを使用するものであり、取得するように指示したタイルに応じて色を付けます。Markus は非常に頭が良いが、コードは下手に書かれている (彼は 48 時間もかけてこのひどいものを作ったので、完全に許されている ;))

スプライトシートをそのまま表示したい場合は、レンダリング関数を書き直すか、次のようなものにオーバーロードできます... (クラス Screen)

public void render() {
     for(int y = 0; y < h; y++) {
          if(y >= sheet.h) continue; //prevent going out of bounds on y-axis
          for(int x = 0; x < w; x++) {
              if(x >= sheet.w) continue; //prevent going out of bounds on x-axis
                  pixels[x + y * w] = sheet.pixels[x + y * sheet.w];
          }
     }
}

これは、レンダリングのために画面に収まるシートを配置するだけです (これは非常に単純なコードですが、機能するはずです)。次のステップでは、ピクセルを実際のラスターにコピーして表示します。あなたが扱うことができることを確認してください。(minicraft のソース コードをすべてコピー アンド ペーストした場合、またはその他のわずかに変更したソース コードをコピー アンド ペーストした場合は、それについてもいくつか変更する必要があるかもしれません。)

すべての歓声!

于 2013-07-26T21:05:03.727 に答える
1

この基本は、get(int)メソッドを置き換えることです...

private static int get(int colour) {
    //if (colour < 0)
    //    return 255;
    //int r = colour / 100 % 10;
    //int g = colour / 10 % 10;
    //int b = colour % 10;
    //return r * 36 + g * 6 + b;
    return colour;
}

私も取り除くだろう

for (int i = 0; i < pixels.length; i++) {
    pixels[i] = (pixels[i] & 0xff) / 64;
}

mainメソッドから

でも正直、単純に使った方が楽じゃないBufferedImage#getSubImageですか?

于 2013-02-19T08:33:17.580 に答える