Fight Like a Wizard Alpha #4: правильное движение и перетасовка колоды.
Утро доброе, господа!
Для начала немного анализа.
Мои прошлые посты собирали не только плюсы, но и минусы. И каждый новый пост приносил всё больше минусов. Я задаюсь вопросом, почему так? Поэтому прошу вас ответить в комментариях, чего мне не хватает?
Может я слишком часто постил?
Или мой текст слишком безграмотен и не структурирован?
Возможно вы не хотели бы читать о том, что в итоге было ошибкой и лишено смысла?
Или минуса заслуживает моё дилетанство в области геймдева? Мол и ООП учить не хочет, и выдаёт себя за профи-игродела?
Опишите пожалуйста в комментариях, как я могу сделать посты более приятными для вас?
Но, как бы там ни было, теперь у меня насобирался материал для нового поста.
Как вы помните, в прошлом посте было описано, как я отказался от прошлого метода "открывания" карт. В этот раз в каждую из шести карт я добавил в качестве кадров рисунки для всех карт.
Следом мне нужно было, собственно, открыть карты. Я делал это простым переназначением кадра анимации на каждую карту.
Что ж, эта вещь работает, но теперь появилась проблема выбора карт таким образом, что бы они не повторялись. И тут у меня случился тупик. А вернее развилка: влево - создать заранее последовательность чисел, и уже на неё опираться как на случайную последовательность; или пойти вправо - каждый раз при присвоении рандомного кадра делать выбор среди не открытых карт. Как делать первое я не знал, а второе хоть и было понятно как делать, но мне это показалось слишком сложным.
В итоге, на следующий день я отправился влево. Я же ведь левша!
Но на самом деле не по этому. Второй вариант, при внимательном рассмотрении, может быть весьма нереальным. И вот почему: часто ли у вас было такое, что вы вытащили из колоды, например, в Манчкине, те самые 3-4 карты подряд, которые вы сыграли в течении последних десяти ходов? Даже если колода только что закончилась и перетасовалась.
К тому же, пристальная критика господина shakagami натолкнула меня на создание последовательности чисел в одномерном массиве.
НеМного погуглив я всё таки умудрился составить правильный запрос и в числе первых строк нашёл гайд по созданию случайной последовательности неповторимых неповторяющихся чисел. Кому нужно будет - могу в комментах дать ссылку.
Однако сразу ввести её в игру я не смог. Запутался. Так что первым делом я воссоздал пример у себя в новой сцене с новым листом событий. Выглядел данный рандомизатор так.
Что бы перепроверять корректность работы я добавил кнопочку, которая будет инициировать перетасовку.
Тестовый прогон и...
...как мы видим, в массиве действительно нет двух одинаковых номеров. Так что следующим этапом я вставил это дело в основной лист событий. Перетасовку поставил на старт сцены, что бы перетасовка происходила автоматически. Плюс еще перед этим указал автоматическое изменение размера текущей последовательности под размер колоды. Ведь в последствии карты будут добавляться и колода увеличится.
И да, это вполне ожидаемо работало.
Кстати, еще упомяну, что максимальное число для рандома я взял на 1 больше, чем размер массива последовательности, ибо первые несколько тестов у меня игра просто зависала. Всё дело в особенности функции рандомизатора: он будет случайным образом выбирать число строго меньше верхней границы. Так что поначалу функция ну вот просто никак не могла найти восемь непохожих друг на друга чисел из семи возможных!
Теперь переходим к "вскрытию" карт.
Здесь я сразу ввёл глобальную переменную под названием "актуальная карта". Она отображает номер той карты, которая будет выбрана следующей.
Корректируем ивенты: как только каждая карта дойдёт до своего места, ей будет назначен кадр "верхней карты".
И ... карты открылись подряд. Господа, у нас СТРИТ!
И тут я понял свою ошибку. Переменная актуальной карты не говорит мне о номере следующей карты. Она говорит о том, из какой ячейки массива случайных чисел брать номер следующей карты. Так что верным будет вот такой вид действий.
Далее мне нужно было проработать механизм движения и замены карты, когда её выбрали. Я хотел сделать так, что бы когда карты выберут, она двигалась на центр экрана, далее активировались её свойства, затем карта следовала к колоде и оттуда снова на своё место, где она стала уже новой картой.
И лучшее, что выдал мне мой мозг, видно ниже.
Тогда же я попытался ввести некоторые повторяющиеся действия в функции, что бы при необходимости просто вызывать их и не более того.
И естественно эта фигня не работала.
В течении следующих двух с половиной дней я отдыхал от работы почитывая о различных поведениях и пробуя это на практике, поскольку с кастомным поведением я не мог задавать скорость в заданном направлении, а только ускорение. И, видимо, каждое новое ускорение как-то суммировалось с предыдущими, так что когда карта после выбора возвращалась обратно в колоду, её там словно на резинку привязывали: она дрыгалась в разные стороны от колоды, но никак не хотела лететь на своё место. Пробовал также поведение "Пуля", но оно в первый цикл алгоритма двигалось не так, как в последующие. А это недопустимо.
По итогу я остановился на поведении нахождения пути (pathfinding). Вообще-то это поведение служит для автоматического нахождения пути для обхода препятствий, но, поскольку, у нас препятствий не будет, карта должна будет двигаться прямолинейно. К тому же пока я экспериментировал, пришёл к разделению событий достижения каждой точки движения на три группы.
Теперь весь цикл движения выглядел одинаково. И всё бы хорошо, если бы не маленькая неточность.
Карта всякий раз не доходила до конца на несколько пикселей.
Я признаюсь, я не смог придумать ничего лучше, кроме как передвинуть цель движения дальше, что бы карта не дойдя до неё остановилась как раз там, где и было запланировано. А также для большей точности присваивал карте необходимые координаты.
На данный момент движение карт работало вполне удовлетворительно, одинаково, близко к тому, как было запланировано, но зато без необъяснимых сюрпризов. Так что на данный момент работу с движением карт можно считать завершённой.
Под конец, осталось зациклить колоду. А также я решил добавить перетасовку карт, что остались в колоде. Это исключит вычисление последовательности и предугадывание карт, когда колода закончится. За основу я взял всё ту же функцию тасовки, однако теперь первым шести элементам массива последовательности присваивались номера уже открытых карт, а переменная актуального номера начинала работать с шести, а не с нуля, как при первом перемешивании.
На этом пока что всё.
Не забудьте оставить в комментариях своё мнение на тему качества постов.
И спасибо каждому, кто в который раз прочёл мою отсебятину до конца.
P.s. Забавно, но баянометр показал сначала мой предыдущий пост с совпадением на 71%, а чуть ниже его же, но уже на 53%.
Лига Разработчиков Видеоигр
6.6K постов22.1K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"