2013-02-19 71 views
0

好吧,我一直在看关于如何从一个spritesheet(8×8)采取精灵一对夫妇的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; 
    } 
} 

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

我的问题是我如何为的就是删除颜色修正和刚刚导入并显示精灵表,所以它已经有颜色吗?

回答

1

所以你与Minicraft源顺藤摸瓜,我明白了。关于Notch的代码的事情是他在本场比赛中在技术上大大限制了自己。引擎做的基本上是说每个sprite/tile可以有4种颜色(来自灰度级的spritesheet),他会生成自己的调色板,以便在渲染过程中从中检索颜色并进行相应设置。我不记得每个频道他设置了多少位,等等。

但是,你显然对编程和imo很陌生,没有比摆弄和分析其他人的代码更好的了。也就是说,如果你真的可以这样做。 Screen类是渲染发生的地方,因此它是使用spritesheet的,因此会为你告诉它得到的任何图块提供相应的颜色。尽管代码写得不好(这是完全原谅的,因为他确实有48个小时来制作该死的东西;))

如果你想只显示spritesheet,你可以重写渲染函数或者超载这样的事情...(在课堂上屏幕)

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源代码或其他一些稍微修改源代码,你可能想改变一些东西为好。)

所有的欢呼声!

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不是更简单吗?