2013-05-15 4 views
0

저는 TheChernoProject의 게임 프로그래밍 자습서로 YouTube에서 일련의 비디오 자습서를 따르고 있습니다. 나는 타일에서 레벨을 렌더링하는 에피소드 36에 도착했습니다. 나는 그것에 대해 너무 자세하게 설명하지는 않겠지 만, 아무도 만나지 못했던 이상한 문제가 발생했습니다 (적어도 아무도 그것에 대해 도움을 요청하지 않았습니다).
좀 더 정확하게 말하자면, Sprite 클래스, Tile 클래스 (GrassTile 및 VoidTile 클래스를 두 개 확장 한 클래스) 및 Level 클래스가 있습니다. 스프라이트로 만든 타일의 레벨 코스타. 여기 타일 볼 수 있습니다잘못된 스프라이트 그래픽이 타일에 할당되었습니다.

public static Tile grass = new GrassTile(Sprite.grass); 
public static Tile voidTile = new VoidTile(Sprite.voidSprite); 

을 그리고 스프라이트는 그렇게 만들어집니다

public static Sprite grass = new Sprite(16, 0, 0, Spritesheet.tileset); 
public static Sprite voidSprite = new Sprite(16, 0x00AAFF); 

두 생성자를 스프라이트 : 이러한

(int size, int x, int y, Spritesheet sheet) 
(int size, int colour) 

하고 레벨이 무작위로 생성됩니다 0-3 범위의 필드 (0은 잔디입니다. 나머지는 현재 VoidTile입니다. 그러나 그래픽이 표시되는 방식에는 문제가 있습니다. printlns를 사용하여 검사했는데 대부분 작동합니다. ~을한다. ID에 따라 올바른 타일을 인쇄하십시오.) 그들이 그들에게 할당 된 다른 스프라이트를 가지고, 심지어 내가 잔디와 voidTile 클래스를 만들 때 불구하고, 스프라이트가 동일한 지,

ID: 0 | Tile: [email protected] | Sprite: [email protected] 
ID: 2 | Tile: [email protected] | Sprite: [email protected] 
ID: 3 | Tile: [email protected] | Sprite: [email protected] 
ID: 1 | Tile: [email protected] | Sprite: [email protected] 

그리고 당신은 알 수 있습니다 : 당신이 그것을 볼 수 있습니다. 그리고 이상한 부분은 할당 된 스프라이트가 내가 생성 한 순서에 의존한다는 것입니다. 이제 VoidTile을 마지막으로 만들었 기 때문에 모든 타일에는 voidSprite 그래픽이 있습니다. 내가 그들을 바꿔 놓을 때 (GrassTile을 마지막으로 만들 때), 그들은 모두 초초를합니다. 나는이 일을하기 위해 내가 생각할 수있는 모든 것을 시도했지만, 그렇지 않았다. 프로젝트 폴더를 업로드 했으므로 코드를 가져 와서 코드를 확인할 수 있습니다. 아마도 놓친 것 같습니다.

프로젝트 URL : 내가 의심으로 https://dl.dropboxusercontent.com/u/18909657/TheGame.rar

+0

이것은 더 좋은 질문 일 수 있습니다. http://gamedev.stackexchange.com – ninesided

+0

오류가있는 코드를 분리하고 게시하려면 디버깅을 더해야합니다. 아무도 여기 거대한 rar 파일을 거치지 않을 것입니다. 투표를 종료합니다. 부적절하게 정적을 사용하지 않는지, 루프에서 필요한 경우 새 스프라이트 객체를 작성하는지 확인하십시오. –

답변

1

OK, 나는 거짓말을하고 RAR 파일을보고했고, 당신 있습니다 부적절 정적 사용 : 스프라이트 필드 정적 만듦으로써

public class Tile { 

public int x; 
public int y; 

public static Sprite sprite; 

public static Tile grass = new GrassTile(Sprite.grass); 
public static Tile voidTile = new VoidTile(Sprite.voidSprite); 

public Tile(Sprite sprite) { 
    Tile.sprite = sprite; 
} 

public void render(int x, int y, Screen screen) { 
} 

public boolean solid() { 
    return false; 
} 

} 

, 이제는 모든 타일 인스턴스에 대해 동일합니다.

솔루션 :

  • 는 부적절 정적 사용하지 마십시오. 스프라이트 Sprite 변수는 정적이어서는 안됩니다.
  • 본 사이트에 적절한 코드를 올리면 오류를 파내는 등 자신이해야 할 일을 할 필요가 없습니다.
  • AWT와 Swing 구성 요소를 불필요하게 섞어 사용하지 마십시오.

스프라이트를 정적이 아닌 것으로 변경하면 컴파일시 불만이 생기면 스프라이트 필드를 사용하는 다른 코드를 수정해야하며 스프라이트를 다시 정적으로 만들지 않아야한다는 점에 유의하십시오.

관련 문제