java - 从 Sprite 表导入 Sprite

标签 java graphics sprite java-canvas

嗯,我一直在观看 YouTube 上的几个关于如何从 Sprite 表 (8x8) 中获取 Sprite 的视频,我真的很喜欢 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;
    }
}

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

我的问题是如何删除颜色修改器并按原样导入并显示 Sprite 表,以便使用它已有的颜色?

最佳答案

所以我明白了,你正在摆弄 Minicraft 源代码。 Notch 代码的问题在于,他在这款游戏中在技术上极大地限制了自己。引擎所做的基本上是说每个 Sprite /图 block 可以有 4 种颜色(来自灰度 Sprite 表),他生成自己的调色板,在渲染期间从中检索颜色并进行相应设置。我记不清他为每个 channel 设置了多少位等等。

但是,您显然对编程非常陌生,在我看来,没有什么比摆弄和分析其他人的代码更好的了……也就是说,如果您确实可以这样做。 Screen 类是进行渲染的地方,因此它使用 spritesheet,并根据您告诉它获取的任何图 block 相应地给出颜色。马库斯非常聪明,尽管代码写得很糟糕(这是完全可以原谅的,因为他确实有 48 小时来制作该死的东西;))

如果您只想按原样显示 spritesheet,您可以重写渲染函数或将其重载为类似这样的内容...(在 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];
          }
     }
}

这只会将任何适合屏幕的工作表放入屏幕中进行渲染(这是一段非常简单的代码,但应该可以工作),下一步是将像素复制到实际的光栅上进行显示,这我确信你能应付。 (如果您复制粘贴了所有微型飞船源代码或其他一些稍微修改过的源代码,您可能还想更改一些相关内容。)

万事如意!

关于java - 从 Sprite 表导入 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14952863/

相关文章:

algorithm - 图形填充算法-获取边框

graphics - ImageMagick 反射

Libgdx Sprite 不随视口(viewport)缩放

java - hibernate LazyInitializationException

java - 如何在firebase数据库中进行多个查询?

java - 我的抽屉导航上的项目单击监听器不起作用

java - 用户注册后需要基于表单的身份验证。有办法逃避吗?

java - 在 Canvas 内画线

android - 使用 SpriteBatch 渲染图像时 ShapeRenderer 颜色停止工作

java - 使用 libGDX 叠加 Sprite