На плочките е присвоена неправилна графика на спрайт

Сега следя поредица от видео уроци в YouTube, по-конкретно урок за програмиране на игри от TheChernoProject. Стигнах до епизод 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). Можете да го видите там:

ID: 0 |   Tile: com.ekhart.game.level.tile.GrassTile@73d74138 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 2 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 3 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef
ID: 1 |   Tile: com.ekhart.game.level.tile.VoidTile@3ba0d916 |   Sprite: com.ekhart.game.gfx.Sprite@3d0c51ef

И може да забележите, че спрайтът е един и същ, въпреки че когато създавам класовете трева и voidTile, те имат различни спрайтове, присвоени към тях. И странната част е, че зададеният спрайт зависи от реда, в който ги създавам. Сега всички плочки имат voidSprite графика, защото създадох VoidTile последно. Когато ги разменя (като направя GrassTile последен), всички те имат тревен спрайт. Опитах всичко, за което се сетих, за да направя това, но не става. Качих папката на проекта, така че можете да я импортирате и да проверите кода, може би съм пропуснал нещо.

URL адрес на проекта: https://dl.dropboxusercontent.com/u/18909657/TheGame.rar


person ekharrtoll    schedule 15.05.2013    source източник
comment
това може да е по-добър въпрос за gamedev.stackexchange.com   -  person ninesided    schedule 15.05.2013
comment
Трябва да направите още малко отстраняване на грешки, поне за да изолирате кода с грешка, и след това да го публикувате. Никой тук няма да премине през огромен rar файл. Гласуването за затваряне. Проверете, за да сте сигурни, че не използвате static неподходящо, че създавате нови спрайт обекти, където е необходимо, в цикли.   -  person Hovercraft Full Of Eels    schedule 15.05.2013


Отговори (1)


ОК, излъгах и погледнах вашия 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;
}

}

Като направи полето на спрайта статично, то вече е едно и също за всички екземпляри на Tile.

Решение:

  • не използвайте статика неподходящо. Променливата Sprite на спрайт не трябва да е статична.
  • Публикувайте подходящия код на този сайт, за да не се налага ние да вършим изрязаната работа вместо вас, която трябва да вършите сами, като например да търсите грешката.
  • Не смесвайте ненужно AWT и Swing компоненти.

Обърнете внимание, че ако вашата компилация се оплаква от вас, когато промените спрайта да бъде нестатичен, тогава трябва да коригирате другия код, който използва полето за спрайт, а не да правите спрайта отново статичен.

person Hovercraft Full Of Eels    schedule 15.05.2013