从精灵表中导入精灵

时间:2013-02-19 08:21:12

标签: java graphics sprite java-canvas

好吧,我一直在观看关于如何从spritesheet(8x8)获取sprite的youtube的几个视频,我真的很喜欢DesignsByZepher的教程。然而,他使用的方法导致他导入一个sorite表,然后将颜色更改为编码所选颜色。

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;
    }
}

^和我认为处理所有颜色的代码,但我对此有点困惑。

我的问题是如何删除颜色修改器,只是按原样导入和显示精灵表,所以它已经有了颜色?

2 个答案:

答案 0 :(得分: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会不会更容易?

答案 1 :(得分:1)

所以,你看,你正在摆弄Minicraft的来源。关于Notch的代码的事情是他在这场比赛中在技术上大大限制了自己。引擎正在做的基本上是说每个精灵/磁贴都可以有4种颜色(来自灰度级的spritesheet),他生成自己的颜色调色板,他从渲染中检索颜色并相应地设置。我不记得他设置的每个频道的确切位数等等。

然而,你显然对编程非常陌生并且没有什么比摆弄和分析其他人的代码更好的了。也就是说,如果你实际上可以这样做。 Screen类是渲染发生的地方,因此它使用spritesheet,因此根据你告诉它获得的任何tile提供颜色。马库斯非常聪明,尽管编写的代码写得不好(完全可以原谅,因为他有48小时制作这个该死的东西;)

如果你想只是按原样显示spritesheet,你可以重写render函数或将它重载为这样的东西......(在类屏幕中)

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源代码或其他一些稍微修改过的源代码,您可能也想要更改一些相关内容。)

所有的欢呼!