0

好吧,我一直在观看一些关于如何从 spritesheet (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

这些基础知识将替换该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 回答
1

所以你在摆弄 Minicraft 的源代码,我明白了。Notch 的代码的问题在于,他在这场比赛中在技术上大大限制了自己。引擎所做的基本上是说每个精灵/图块可以有 4 种颜色(来自灰度精灵表),他生成自己的调色板,他从中检索颜色并在渲染期间进行相应设置。我不记得他设置的每个通道有多少位等等。

但是,您显然对编程很陌生,而且 imo 没有什么比摆弄和分析其他人的代码更好的了。也就是说,如果您真的可以这样做的话。Screen 类是进行渲染的地方,因此它使用 spritesheet 并因此根据您告诉它获取的任何图块相应地提供颜色。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 回答