2013-02-19 7 views
0

글쎄, 필자는 스프라이트 시트 (8x8)에서 스프라이트를 취하고 DesignsByZepher의 튜토리얼을 정말 좋아하는 youtube 비디오를 몇 개 보았습니다. 그러나 그가 사용하는 방법은 그에게 소릿대 시트를 가져온 다음 선택한 색상의 코드로 색상을 변경합니다.스프라이트 시트에서 스프라이트 가져 오기

나는 그의 비디오를 시청에서 만든 코드를 렌더링 색상 시트

http://www.youtube.com/watch?v=7eotyB7oNHE를 표시

http://www.youtube.com/watch?v=6FMgQNDNMJc입니다 :

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

그래서 미니 크래프트 소스를보고있는 것 같습니다. 노치의 코드에 관한 한 사실은이 게임에서 기술적으로 실질적으로 자신을 제한한다는 것입니다. 엔진이 수행하는 작업은 기본적으로 모든 스프라이트/타일이 회색조 스프라이트 시트에서 4 가지 색상을 가질 수 있다고 말하면서, 자신이 색을 가져 와서 렌더링 중에 그에 따라 설정하는 자체 색상 표를 생성합니다. 나는 그가 설정 한 채널 당 얼마나 많은 비트가 정확히 기억이 나지 않습니다.

그러나 분명히 프로그래밍에 익숙하지 않고 다른 사람들의 코드를 분석하고 분석하는 것보다 더 좋은 것은 없습니다. 즉, 실제로 일 수 있으면 일 수 있습니다. Screen 클래스는 렌더링이 이루어지는 곳입니다. 따라서 스프라이트 시트를 사용하는 것이므로 원하는 타일에 따라 색상이 지정됩니다. Markus는 코드가 잘못 작성되었지만 영리합니다. (저주받은 물건을 만드는 데 48 시간이 걸렸으므로 완전히 용서되었습니다.)

스프라이트 시트를 그대로 표시하려면 렌더링 기능을 다시 작성하거나 또는 (클래스 화면에서) 이런 일에 과부하

이 그냥 둘 것이다
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]; 
      } 
    } 
} 

그것은 코드의 정말 간단한 조각입니다 (렌더링 화면에 들어갈 수있는 시트의 어떤,하지만 작동합니다), 다음 단계는 픽셀을 실제 래스터로 복사하여 디스플레이 할 수 있다는 것입니다. (모든 미니 크래프트 소스 코드 또는 약간 수정 된 소스 코드를 모두 복사하여 붙여 넣은 경우에는 그 부분에 대해 몇 가지 사항을 변경하고 싶을 수도 있습니다.)

모든 건배!

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; 
} 
나는 또한 main 방법

그러나 솔직히 말해서에서

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

제거하는 것

, 단순히 BufferedImage#getSubImage을 사용하는 것이 더 쉽지 않을까요?

관련 문제