Тайлам назначена неправильная спрайтовая графика

Сейчас я слежу за серией видеоуроков на 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

И вы могли заметить, что Sprite одинаковы, хотя когда я создаю классы grass и 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-файл. Голосование за закрытие. Убедитесь, что вы не используете статику ненадлежащим образом, что вы создаете новые объекты спрайтов, где это необходимо, в циклах.   -  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