Сега следя поредица от видео уроци в 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