2012-02-23 2 views
0

API를 통해 SpriteSheet을 검색했지만 크기가 다른 스프라이트로 스프라이트 시트를 만드는 방법을 찾지 못했습니다.Slick2D에서 다른 크기의 스프라이트를 사용하는 스프라이트 시트 사용

내가 사용하는 스프라이트 시트에는 16x16px 타일 행, 24x24px 타일 행, 8x8px 행 등이 있습니다.

원래 Slick2D를 사용하지 않고 BufferedImage.getSubimage()를 사용하여 스프라이트 시트의 임시 BufferedImage에서 각 스프라이트를 가져 왔습니다. 내가 사용할 수있는 비슷한 방법이 여기에 있습니까?

답변

1

적어도이 글을 쓰는 시점에는 현재 API 버전에서 직접 하위 이미지를 만드는 방법이 없다고 생각합니다.

그러나, 내가 생각할 수있는 세 가지 옵션이 있습니다 (방금 말한 부가하는 방식의 옵션 이외에 자신을 호출 - 그것은 결국 open source있어) :

  1. 당신은에서 여러 SpriteSheet 객체를 생성 할 수 똑같은 소스 파일에 그대로두고 싶다면 각각의 Sprite 크기에 하나씩 같은 소스 Image을 사용하십시오.
  2. Image 인스턴스를 가져 와서 getSubImage을 호출하여 Image을 각 크기 (24x24, 16x16 등)에 하나씩 3 개의 이미지로 분할 할 수 있습니다. 그런 다음 하위 이미지에서 SpriteSheets을 인스턴스화합니다.
  3. 원본 파일을 크기에 따라 별도의 파일로 분할 할 수 있습니다. 즉, 24x24 스프라이트 셀을 하나의 파일에, 16x16을 다른 파일에 배치하는 등의 작업을 수행 할 수 있습니다.
0
당신은 단지 이미지를 유지하고 그릴 위치를 지정 그래픽 객체의의 drawImage 메소드의 오버로드를 사용할 수

있는 이미지의 일부 :

g.drawImage(image, x1, y1, x2, y2, srcX1, srcY1, srcX2, srcY2); 

참조 [자바 독 (HTTP : // 매끄러운 .cokeandcode.com/javadoc/org/newdawn/slick/Graphics.html # drawImage (org.newdawn.slick.Image, float, float, float, float, float, float, float, float)

첫 번째 매개 변수는 이미지의 인스턴스입니다. 다음 두 매개 변수는 렌더링이 시작되는 화면상의 지점을 정의합니다. X2와 y2는 렌더링의 끝점을 정의합니다. 일반적으로 x2는 x1 + spriteWidth이고 y2는 y1 + spriteHeight이지만 스프라이트를 다른 크기로 그리려면이 값을 변경할 수 있습니다. 마지막 네 개의 매개 변수는 동일하게 작동하지만 화면에 그려지는 스프라이트 시트의 영역을 정의합니다.

우리는 당신의 예를 들자면 우리는 호출이 같을 것이다 세 번째 행에서 두 번째 타일 그리려는 경우 매우 드문 일부에서

int tileWidth = 8; 
int tileHeight = 8; 
int sourceX = 40; 
int sourceY = 8; //as its the sec 
int drawX = 34; 
int drawY = 65; 
g.drawImage(image, drawX, drawY, drawX + tileWidth, drawY + tileHeight 
    , sourceX, sourceY, sourceX + tileWidth, sourceY + tileHeight); 

내가 spritesheet 작업 할 때, 나는 하드 코딩 한 값 (사례, 대부분 테스트)와 소스 x1, x2, y1 및 y2 값이 저장되는 스프라이트 클래스가 있습니다. 리스트 나 맵에 여러 개의 팩을 넣을 수 있으며 스프라이트 인덱스를 가질 수 있습니다. 일반적으로 어떻게 든 정의를 생성 한 다음 목록을 직렬화하므로 필요한 경우 목록을 다시로드 할 수 있습니다.

다음은 내 XML 정의의 간단한 예입니다. xml에 x2 및 y2 값 대신 폭과 높이를 저장합니다. 사람이 읽을 수 있고 수동으로 편집하기 편리합니다.deserialization 후 x2 및 y1 값을 계산합니다.

<spriteSheet imageName="buildings" name="buildings"> 
    <sprite name="1x2 industry 01" spriteX="0" spriteY="0" width="50" height="112"/> 
    <sprite name="1x2 quarters 01" spriteX="50" spriteY="0" width="50" height="112"/> 
    <sprite name="1x1 spaceport 01" spriteX="243" spriteY="112" width="51" height="56"/> 
     ... 
</spriteSheet> 
관련 문제