О чём будет наша игра?
Давайте пофантазируем и придумаем, что то простое.
Тут для каждого своё, в моём случае я исполнил такую задумку.
1.Что то летит вниз, попутно разрушая платформы.
2.По бокам платформы которых нельзя касаться или Game Over.
3.Цель долететь до финиша.
Приступаем к реализации.
Представим, что мы, где то взяли эти платформы и где то их расставили.
А где то, это имеется в виду игровой движок по типу Unity и тому подобное.
Вы же сами не будете писать игровой движок ради игры. Помним про MVP и всё такое.
Расставили их в причудливой форме, две "смертельных" платформы по бокам, сколько-то "разрушаемых" в центре. И так, штук сто, до финиша.
Реализовали управление и механики, тут для каждого индивидуально. Жмём вправо, летим вправо и вниз, жмём влево, соответственно летим влево и вниз.
Сталкиваемся с "смертельными" платформами, погибаем, с "разрушаемыми" соответственно разрушаем их. Финиш выигрываем!
Делаем таких пару уровней, готово, конец, спасибо что читали.запускаем и видим анимацию из стоп кадров.
Что мы сделали не так?
При таком нерациональном использовании ресурсов, ни о какой плавности картинки, речи идти не может, а что же всё таки произошло?
Начнём по порядку.
Заранее подготовленные ресурсы.
Скорее всего вы покупаете тарелки до того, как садитесь за стол, так и тут. Запомните, всё что можно создать заранее, лучше создать заранее. Зачем вам выполнять расчёты разрушения однотипного объекта, во время его разрушения? Ведь такая процедура вероятно будет ресурса затратной. По этой причине, мы можем схитрить и подготовить разрушение объекта заранее.
А при разрушении предоставить эти подготовленные осколки в нужной позиции, придав им нужное направления и скорость, тем самым и сымитировав разрушение.
Повторное использование ресурсов.
Первую проблему мы решили, перейдём ко второй. У нас не реализовано повторное использование ресурсов, сейчас объясню что это такое на примере.
Пример с посудой и тут прекрасно подойдёт. Я ещё не встречал людей, которые после приёма пищи выкидывают и покупают новые тарелки, их ведь можно помыть и использовать снова!
Одновременно на экране показывается не более маленькой кучки объектов. Остальные скрыты за пределом кадра и не используются. Вариант создавать их в ходе движение по уровню мы отметаем по аналогии с примером выше.
Так зачем хранить тучу не используемых объектов, если можно хранить только данные о них? И подставлять их заранее созданному объекту из не большой подготовленной "кучки". В этом случае данные, это их тип, позиции и поворот. Тут уже есть где разгуляться!
Как я реализовал пул повторно используемых объектов?
Ну для начала я просто взял и посчитал примерное количество объектов которые помещаются на экран с небольшим запасом. Создал пулы обетов и поместил их в массивы.
Как я получаю объект из пула? Представим что в пуле 10 объектов и каждый доступен по своему номеру в массиве. В итоге когда нужен объект, что бы его получить нам нужен, номер последнего полученного объекта и список с этими объектами. К примеру если последним был пять, то мы получим шестой, если последним был десятый, то мы соответственно получим первый. Не чего сложного!
Заранее подготовленные фрагменты разбитых платформ, я тоже вынес в отдельный пул маленького размера. Вроде даже, не больше четырёх-пяти разбитых платформ в пуле одного типа. Ведь на экране одновременно может находить малое количество разрушенных объектов, следовательно и фрагментов нужно мало.
Получая объект, вы сбрасываете его состояние к начальному и используете повторно!
Поговорим о данных!
Мы реализовали систему которая хранит позицию и поворот объектов.
А что быстрее задавать значение от руки или создать систему которая сделает это за вас?
Давайте посчитаем, что от руки задать значение ста локациям, в каждой которой по сто секций, в каждой из которой по три платформы это 100*100*3=30000 значений. Что собственно и является ответом.
Что собственно реализовано в моём случае, не буду томить.
Позицию платформ по координате смещения задавалась в соответствие с её номером в локации подставленным в заранее подобранную магическим способом, математическую кривую с определённой амплитудой. Поворот аналогично. (Это всё очень индивидуально для каждой системы). Оставалось только подставлять кривую и получать значения.
Автоматизируем всё до конца!
Эти кривые и амплитуду я тоже решил создавать автоматически из заранее подобранных магическим способом значений. Получилось, что то напоминающие это:
Запускаем.
Система обращается к пулу и берёт свободные объект нужного ей типа, обнуляет его и подставляет ему новые данные. Данные уровней, создаются автоматически.
Остаётся добавить интерфейс и можно выпускать! Конец! Кому не хватило запятых, вот: ,,,,,,,..,,)
Вот что получилось в итоге: