Gaminator 7. Несыть :: Разработка
Содержание: Концепция ːː꞉꞉ Начало ꞉꞉ Разработка ːː꞉꞉ Релиз ːː꞉꞉ Ещё ːː꞉꞉ Уи-ха!
Всё пошло совсем не так гладко, как я предполагал. Времени потратил много, а результатов появилось не очень, но, по крайней мере, могу с гордостью заявить, что с дистанции не сошел и продолжаю работать!
Преальфа (просто ручкой из могилки помахать)
Пока есть ползающая по плоскому тайловому бэкграунду голова и предательски низкий FPS, хотя вроде бы Direct3D (пусть и в оконном режиме) и при таком мизерном рендере должно летать. Голову и прочие части (которые пока не рисуются) накидал вчерне в CorelDraw — как-то стыдно было использовать для WIP чужие картинки. Бэкграунд, впрочем, не мой, взят с http://lenagold.ru.
Если также медленно всё пойдёт, то на выходе останется также в Кореле набросанный минимализм в гамме помрачней и стилизованные препятствия — «минигигер по-сельски», короче. Следующий этап — учимся ползать в том же отладочном желтом антураже.
Добавлено 24.08.2011: Понял проблему с тормознутостью. Низкий FPS из-за вертикальной синхронизации на 60-герцовом ЖК-мониторе. Убрал синхронизацию и получил 3000 с гаком кадров в секунду при таком же размере окна и 200 кадров при развороте на 1920×1080. Комплексы о недостаточной производительности отброшены.
Добавлено 25.08.2011: Дошел до реализации движения червя, сразу всплыла проблема. Реализовал самый простой и первым приходящий в голову алгоритм: звено червя двигается с той же скоростью, что и голова в направлении предыдущего звена. Увы, на поворотах задние звенья начинают срезать углы и, проходя меньший путь, догоняют голову. На картинке красным — точки траектории головы, а крестики, это центры звеньев, которые специально разнесены далеко для иллюстрации.
Нюанс в том, что скорость червя у меня будет меняться и нельзя провести задние звенья по точкам пути головы — на разных скоростях шаги на траектории будут разные. Сейчас попробую хранить траекторию головы списком точек и с помощью линейной интерполяции устанавливать позиции звеньев на траекторию на определённом расстоянии от головы.
Альфа 1.0 — кто хочет порулить червяком?
Добавлено 26.08.2011: Выкладываю первый релиз, дремучую альфу, в которой реализованы движения и наращивание длины червя. Каждое съеденное яблоко увеличивает размер головы червя и прибавляет одно звено. Графика отладочная, музычка и звуки тестовые. Специально для любителей быстрой езды оснастил червя акселератором (пробел во время движения).
Раз весь дебаг-арт табачно-желтый, то фоновая композиция будет соответствующая: Imelda May — Smokers’s Song. Прошу отписаться, если заметите какие-либо косяки. Например, если картинка отличается от того, что видно на скрине, музыка не играет, нет звуков при поедании яблок или движения червя навевают недостаточно ужаса на обывателей. Управление:
стрелки вперёд и назад — движение и остановка
стрелки влево и вправо — поворот
пробел — дополнительное ускорение
wasd — дублирование стрелок
m — включить/отключить звуки
1, 2, 3, 4 — отладочный вывод (на картинке)
esc— выход из игры
Можно развернуть на весь экран, но это не для слабонервных, так как фон сейчас пестроват, через некоторое время подташнивать начинает. Приятного просмотра! :)
Альфа 1.1 — издание исправленное и дополненное
Добавлено 28.08.2011: Спасибо за тестирование, друзья, ваше внимание бесценно! Суббота пропала по семейным обстоятельствам, зато всё воскресенье ушло на то, чтобы подготовить следующую версию альфа версию, в которой исправлены все найденные вами ошибки, учтены пожелания, а также есть несколько плановых изменений.
1. Реализован дельта-тайминг, теперь игровой движок работает с максимальной скоростью, всё серьёзным образом заплавнело.
2. Исправлена ошибка с порядком вывода частей тела.
3. Путь головы записывается по равным промежуткам перемещения, а не времени.
4. Исправлена ошибка связанная со сворачиванием окна — теперь не падает.
5. Реализовано экспериментальное управление — ускорение зависит от частоты поворотов, стрелка «вперёд» включает режим плавного перемещения.
6. Снижена яркость бэкграунда — ваше зрение вам ещё пригодится.
7. Добавлен отладочный вывод характеристик червя.
8. Добавлены режимы паузы (ввод, пробел) и подтверждения выхода (esc), использованы белый и красный вариант шрифта Bicubik в трёх размерах.
9. Изменён алгоритм формирования тела — хвост (область сужения) имеет ограниченную длину и после увеличения червя больше этой длины размер звеньев уже не меняется, хвост начинает расти вместе с головой.
10. Алгоритм поворота червя теперь учитывает и размер и скорость червя. Новые картинки не рисовал — загиб звеньев всё равно пока работает не как шарнир, углы звеньев топорщатся.
Управление экспериментальное, к нему поначалу надо привыкнуть (особенно тем, кто тестировал предыдущую версию). Чтобы ускориться и, вообще, тронуться с места нужно поочерёдно изгибать червя в разные стороны. Стрелка вперёд больше не «газует», она включает функцию плавного перемещения — повороты становятся плавными, набирать скорость и перемещаться так удобнее. В любой момент, можно отпустить стрелку «вперёд» и молниеносным движением съесть яблоко, развернуться или выкинуть какого-нибудь другого финта — поворот в «резком режиме» практически не зависит от скорости (только от размера червя) и позволяет делать довольно забавные трюки. Стрелка «назад» теперь включает дополнительное плавное торможение, помимо естественного затухания скорости червя. Удачного ознакомления!
P.S. Отладочный вывод теперь на один режим больше: 1,2,3,4 и 5.
Альфа 1.2 — отточено и завёрнуто
Добавлено 01.09.2011: Команда самоотверженных тестеров доблестно продолжает стачивать пальцы о клавиатуру и не выпустить очередной релиз было бы просто преступлением! Спасибо всем, кто слушает это радио!
1. Реализовано масштабирование всей сцены, в частности зависимость приближения камеры от скорости червя.
2. Содержимое области вывода автоматически масштабируется под высоту окна.
3. Фон сменен на более человеколюбивый, при масштабировании старый давал много неприятных эффектов.
4. Исправлены обнаруженные ошибки в управлении.
5. Кнопка «вперёд» теперь не включает, а отключает «плавный» режим движения.
6. Исправлен алгоритм выкладывания рандомной еды — вишнеяблоки больше не падают друг на друга и червя.
7. Вставлен экспериментальный саундтрэк.
Снова привыкаем к новому управлению. Теперь постоянно плывём плавненько, а если нужно, то кнопкой «вперёд» загибаем траекторию под более острым углом. Также из демки убран весь неавторский контент (кроме бэкграунда с lenagold.ru) — экспериментируем с другом stada на музыкальную тему. Это саундтрек — рыба для нарезки и модификации, но у нас альфа-релиз, так что пожалуйте к столу!
Добавлено 01.09.2011: Реализовал какую-никакую обработку столкновений с препятствиями и краями карты, сделал отладочный вывод на спрайтах. Пока для релиза изменений маловато, поэтому просто скрин и работать дальше.
Альфа 2.0 — запасаемся попкорном
Добавлено 02.09.2011: В этот раз никакого интерактива, просто запускаем и смотрим, как два червяка (допустим Вася и Боря) соревнуются в поедании яблок! Кнопочки 2 и 4 включают и отключают отладочный вывод, проливающий свет на природу ИИ.
1. Реализован режим редактора карт (только в девелоперской версии), добавлены разноразмерные тестовые препятствия.
2. Автоматические избегание препятствий как для игрока, так и для ИИ (в этой версии самим вам поиграть не получится).
3. К червям и яблокам теперь рисуются полупрозрачные тени, мультяшность немного выпятилась.
4. Реализована логика ИИ для преследования целей и выхода из сложных ситуаций.
5. Реализована возможность нахождения в игре любого разумного количества червей.
6. Часть отладочного вывода реализована на спрайтах и выглядит приятнее прежних линий.
Бета 1.0 — выжить среди смертной любви
Добавлено 03.09.2011: Время бессердечно утекает, а нужно успеть столько всего! Всем, кто силен духом (я честно говоря, сам стремаюсь в это играть) и не может дождаться завтрашнего общего финиша посвящается этот релиз.
Времени нет расписывать — очень много. Кратенько опишу основное, что нужно знать для выживания.
1. Черви появляются из яиц, когда те достигнут определённого размера.
2. Овечки появляются из ферм (желтые круги), их можно есть. Они растут, но медленно.
3. Червь может откусить у другого червя любые звенья, которые меньше его головы.
4. Черные черви жрут яблоки, овечек и падаль, а красных следует опасаться больше — они любители откусить свежего мяса прямо «с куста».
5. Кнопка «4» поможет узнать о намереньях ИИ.
6. Если червю отожрали хвост, то пока он не наест столько же, сколько потерял, то дальше не растёт.
По умолчанию сделал полноэкранный режим, если нужно в окошке, то запускайте файлик Sateless_Windowed.bat в папке игры.
Боюсь, что ответить на все комментарии не смогу — надо релиз готовить. Но если у вас появится какое-то очень важное предложение или типа того, то пишите, я обязательно всё прочту. Всё, пошел работать дальше.
Кстати! Если за вами уцепился красный червь — повернитесь к нему головой, голову обычно он откусить ещё не может. Берегите хвостики!
- 24 августа 2011, 01:37
- 012
Голова что-то очень уж добрая. Ну да ладно. ^^
Это ж дебаг-арт, пока просто чтобы не грустно было программировать. :)
Очаровательная голова, я бы такую и оставила.
Удачи с остальными частями тельца =)
Спасибо! Вот полный суповой набор для отладки:
Вишенка особенно порадовала ^^
Да и вообще красиво. Ждём-съ релиза.
Мож помогу технически, а может ты сам уже разобрался..
В таких случаях стоит озадачить расстояние от предыдущего звена до следующего, и звенья должны двигаться только если это расстояние больше чем нужное тебе, в противном случае они должны стоять на месте.
Таким образом у них фактически нету своей скорости, а есть только скорость головы
Ага, я так пробовал. Это получается навес на предыдущий вариант - траекторию он не меняет, задние звенья всё равно будут срезать путь, к тому же в моей реализации появляется дёрганье, т.к. движется червь дискретно и если перемещение в 10 пикселей одно из звеньев не повторяет, то оно визуально "отпрыгивает" назад.
Но спасибо за участие! Я, на самом деле, как раз вчера путём проб и ошибок справился - сделал полноценную запись пути головы и трэкинг по нему частей. Сегодня буду пытаться сделать с яблочками (все объекты тупо круги для обработки столкновений), наращивание и уменьшение длины - хочется сегодня выложить демку, в которой порулить можно.
Пора уже тестировать на чужих компах - в позапрошлый Гаминатор приблизительно треть работы, это были попытки заставить мой 256-цветный движок на DirectDraw работать под Vista и Windows 7. Вдруг, в процессе демонстрации технической демки, оказалось, что не у всех XP как у меня и есть проблемы - поставил себе Win7 (кстати, спасибо Gyt, спасибо Jazz - с тех пор не переставлял и очень доволен) и давай на форумах флудить как быть с палитрами и почему моя игра только у меня прекрасна и удивительна, а у остальных хрень розово-зеленистая. :D
Kozinaka, как раз вчера осмысливал бессеточную змейку. Почему бы тебе не направить сегмент по вектору, соединяющему центры предыдущего и следующего? Для хвоста просто к следующему, конечно. Со скоростью будут проблемы, но для ориентации картинки пойдёт.
Или так: через каждые полметра плюёшь позицию головы в список и двигаешь сегменты по интерполяции между точками. Скорость, видимо, одинаковая для всего червя, т. е. для сегментов реально вместо координаты храним номер лин. куска и прогресс по нему, дельта прогресса равна скорость дробь длина куска. Длина куска константа, т.ч. зашибись.
И да, что там в итоге с палитрами? Нельзя существующую прогу под win95 запустить на семёрке с адекватной палитрой?
А с палитрами проблема в том, что Explorer семёрки сам использует DirectDraw (косвенно видимо) и даже в полноэкранном режиме с заданной палитрой отжирает себе несколько цветов - если приложение использует все 256, то получается винегрет. Я тупо убивал процесс Explorer'а перед запуском, а после закрытия игры открывал его снова. Папки слетали, но зато с цветами всё пристойно. :) Это я про Меня зовут Нгаа-Вайда Ри говорю.
Кстати, на 7-ке с таким же бубном запускается древний Heart of Darkness.
Ненасытная утроба приглашает тестеров для близкого знакомства!
Выложил первую тестовую версию.
Это ЯБЛОКО? оО
А по теме:
:( Ты бы не мог попробовать обновить DirectX? Боюсь, что нужен какой-то из последних - я использую D3DX, чтобы через Direct3D выводить 2D графику.
P.S. Будем считать, что это гранат - степень сходства приблизительно такая же, как и с яблоком или вишней. :)
9.0c
На ХР круче вроде некуда. Нетбук же.
Хе-хе, большое спасибо за обратную связь! Я нашел описание проблемы: вот оно, если интересно. Не хватает дебажной dll'ки, она только в полном SDK есть. Активно ищу пути правильной компиляции...
Скачал d3dx9.dll, противный Sateless.exe (твой, твой) потребовал к нему в нагрузку MSVCP100.dll и MSVCR100.dll
C d3dx9.dll это действительно необходимо, у меня не дебажную требует, просто 43, это версия библиотки, у дебажных постфикс d.
А вот последние две - требование для CLR (.NET и всё такое). Это я пытаюсь убрать. Спасибо тебе за терпение! :)
Да завсегда пожалста :)
Зря ты экзешник ненасытным назвал, имхо :)
Как вы судно назовёте, так оно и поплывёт. :)
Вот, скачай, замени exe-шник, я поправил: фикс. Скажи, а можешь удалить твою скаченную d3dx9.dll и просто оставить в папке с игрой мою D3DX9_43.dll из папки с фиксом - будет работать?
Все работает ;)
Что не понравилось: при зажатии кнопки "вниз" червь отчего-то резко останавливается, с какой бы скоростью ни полз.
А в остальном супер) Ждем противников
А что за информация по единичке? Маска столкновения?
И еще, чем крупнее червь, тем больше конец хвоста похож на жало. Ну несерьёзный хвостик какой-то.
UPD: обнаружил проблему с отрисовкой: конец хвоста рисуется то над серединой, то под ней.
Кнопка назад - отладочная, скриншоты делать постановочные. :)
По единичке габаритные окружности. У меня не реализована функция выводящая окружности, поэтому я просто помечаю границы окружности сверху-снизу-слева-справа.
Проблему с отрисовкой решаю, Electronic нашел её чуть раньше.
Для вдохновения тебе :).
Мокрицы. Секреты отвращения.
Я потом звенья перерисую, чтобы при сгибе не вылезали углы - как кости в коленке должны соответствовать друг-другу. Тогда будет отвратительней выглядеть. А вот дыры между звеньями наверное оставлю - общий стиль минималистский придется выдерживать, на большее в остальной графике не потяну.
Забавный glitch, см. картинку.
При врезании в стену, к слову, есть возможность изогнуть змею под любым углом, а не только кругленько.
И музыка классная. Мне, правда, скорее Neverhood напоминает, чем Гигера :).
О, поздравляю, ты занял третье почётное место среди тестеров - ещё одна бага! Я звенья вывожу отдельно, собрав их в отсортированный контейнер (std::set), вот только полноценный оператор сравнения перегрузить поленился - у меня вроде и тупо сравнение указателей работало, а у тебя видимо память выделялась не из большого линейного куска, а то там, то сям. Короче надо каждому звену присваивать номер и учитывать это при сравнении звеньев. Спасибо!
Я ничего не говорю, но зачем std::set? У них же порядок чёткий.
Почему было не покидать их в linked list? Это будет тормозить отрисовку?
У меня тайловая карта объектов - каждый объект привязан к крупной ячейке(один из отладочных выводов её рисует) для сокращения перебора при обработке столкновений. При рендере я пробегаю по ячейкам карты объектов, поэтому звенья червя перебираю не по их порядку. Вот тут и нужен сортирующийся контейнер, в который запихиваешь как придется, а вынимаешь уже по порядку. :)
У меня вроде всё нормально работает. Змея классная, гигеровская :)
Только вот что: пишет, что фпс 70, а движется всё мелкими рывками, как будто фпс 20 примерно.
Отлично! :) Спасибо!
Поразительная точность в определении FPS на глаз! о_О Дерганые перемещения это скорость работы игрового движка, она выставлена фиксированная - 16 раз в секунду, а FPS отображается тот, который у отрисовщика (из-за вертикальной синхронизации это точно частота работы твоего монитора получается). Спасибо за конструктивное замечание - буду думать как бы сделать скорость перемещения независимой от частоты итераций игрового движка - тогда можно будет его запускать на полную, сколько мощи компа хватает.
Обычно для таких целей delta time используют, вроде бы
Ага, именно этого вчера начитался. Правда в основном на gamedev'ах про нюансы дельта тайминга, а по сути я пока не нашел - не как замерить, а как перемешать объекты. Но я наберусь, надо только чутка времени. :)
Эм, а в чём проблема? Замеряешь время между двумя итерациями event cycle, если накопилась, скажем, одна сантисекунда, то двигаешь на соотв. расстояние. Или у тебя event cycle чей-то чужой? Не втыкаю.
Всё моё. Главное просто в голове собрать, как ускорение и перемещение от dt рассчитывать, и угловые скорости тоже как считать. Понятно, что там всё на умножениях, но пока не устаканил в голове. :)
dv = a * dt
dr = v * dt :)
Кстати, ты считаешь скорость или ускорение от числа изгибов? По моим ощущениям, скорость.
И да, как именно? Просто мне единственное, что приходит в голову - ∫ |γ|, но это, наверное, сложновато.
Пока червь как автомобиль катается - придавил педаль, едет быстрее, никаких зависимостей от изгибов. :)
А dt в чём измеряется, в долях секунды? Попробую завтра реализовать.
Да, кстати, судя по отладочному выводу, ты бросаешь отметки позиций головы через равные промежутки времени, а не расстояния. Не боишься, что с переменной скоростью будут проблемы?
Я не стал для отметок позиций отдельную писалку делать, а просто приращения координаты головы записываю. С dt просто буду записывать в список только перемещения больше определённого минимального значения, а те что меньше копить до следующего шага.
У меня даже под Wine на нетбуке заработало (: забавно получается, удачи в разработке.
о_О Крутяк! Спасибо!
На семерке всё отлично)
Вот только обещалось что скорость будет зависеть от количества изгибов, а прямая змея и вовсе не сможет двигаться... Будет реализовано позже?
Скорость зависит, по-моему.
А если прямая змея не сможет двигаться, то как начать игру?
Так же, как и продолжить - изгибом. В чем разница? Начальная длина же есть, хоть и небольшая.
Ага, но я пока не успел продумать как это будет. В ближайшее время попробую вообще убрать стрелки вперёд-назад: чем чаще раскачиваешься стрелками влево-вправо, тем быстрее двигаешься. Если специально двигаться по-змеиному даже в текущем управлении, то появляется прикольное чувство пресмыкания. Я поработаю над этим, спасибо что напомнил!
Как раз хотел попросить убрать необходимость постоянно жать вперёд. А то бесит необходимость две кнопки держать постоянно.
В шутерах не бесит? :) Оке, попробую.
В шутерах можно поворачивать, стоя на месте. И ещё я в них не играю.
Занятно. Но увы, я случайно пролил свои глаза на клавиатуру - теперь придётся новую покупать. И глаза реанимировать... что ж так ядрёно то? Нужно фон приглушить... либо затемнить целиком, либо высветлить сильно (тогда змейка будет очень контрастной что хорошо), либо просто контрастность фона снизить. Можно попробовать и цветом порулить, например сделать фон зелёным или синим.
И да - на Win7 x64 всё работает нормально.
:) А я пердупреждал - фон просто мне сам по себе нравится, как фон он плохой, я на нём заливку тайлами реализовывал, потом под него тестовые картинки червя нарисовал. Я перерисую.
Даже на x64? Охренеть! Спасибо за хорошие новости!
Вот тебе три варианта даже сделал =)
С синим фоном не очень получился. На мой взгляд, самый выигрышный - тёмненький.
Я тоже, кстати, заметил подрагивание экрана.
О, даже так! Спасибо, для следующей демки того же самого, только с учётом озвученных мнений, обязательно приглушу яркость фона, как на первом варианте. :)
...но в любом случае для финального варианта я перерисую и фоны и самого червяка!
Kozinaka, даже под вайном на x64:).
Два замечания по внешнему виду: экран подрагивает, неприятно. Длинная змеюка треугольна, это неэстетично.
Но получится очень круто.
Что значит треугольна? Не нравится уменьшение ширины к хвосту?
Надо попробовать ограничить минимальный размер хвоста и передние (большие) сегменты с какого-то момента больше не увеличивать. Спасибо за мнение!
Ага, если вытянуть змею по прямой, она будет ну как палка прямо... :-)
Я кажется, понял, что еще зацепило: реальные змеи узкие и у головы, и у хвоста.
Я тоже внесу свою лепту. Только не минусуйте, ОК?
1. Разворот змейки. Если маленькая змейка поворачивает по законам физики (или создаёт видимость), то большая эти законы игнорирует напрочь. Змейки разные, а линия то одна!
ИМХО, стоит увеличить поворот большой змейки. Говоря иначе, ввести переменную для этого поворота, которая будет расти вместе со змейкой
2. Опять таки ИМХО, следует сделать так, чтоб вишни спавнились не так близко. А то одна на одной попадаются, съедаю обе, а прибавляется одно звено :(
Про угол поворота дело, спасибо! Про вишни не замечал, но сейчас добавляю отображение счетчика длины - там всё будет явно.
Обращайся) Больше ничего пока не заметил. А что ещё планируешь внедрить в игру?
Этот комментарий удален.
Win 7. Такая же ересь. Особенность движка наверное)
Щорт :) Там было написано:
14:34:58: Версия ОС:
14:34:58: Windows XP
14:34:58: Редакция:
14:34:58: Home Edition
14:34:58: Сервиспак:
14:34:58: Service Pack 3 (Build 2600)
14:34:58: Платформа: NT
14:34:58: Major version: 5
14:34:58: Minor version: 1
14:34:58: Build number: 2600
14:34:58: Плаформа 32-битная.
14:34:58: -----------------------------------
14:34:58: Инициализация приложения:
14:34:58: Создание глобальных объектов.
14:34:58: Загрузка файла аккаунта пользователя 'Users/Kozinaka.ous'
14:34:58: Инициализация объекта отрисовщика:
14:34:58: Инициализация звукового движка:
14:34:59: OK. Звуковой движок инициализирован.
14:34:59: Ошибка графического движка: D3DCREATE_HARDWARE_VERTEXPROCESSING не поддерживается
14:34:59: OK. Графический движок инициализирован.
14:34:59: OK. Отрисовщик инициализирован.
14:34:59: Инициализация игрового движка:
14:34:59: Загрузка карты 'Maps/Lost Town.omp'
14:34:59: Инициализация отрисовщика:
14:34:59: Загрузка графических ресурсов.
14:34:59: Загрузка звуковых ресурсов.
14:35:00: OK. Игровой движок инициализирован.
14:35:00: Инициализация объектов пользовательского ввода:
14:35:00: OK. Объекты пользовательского ввода инициализированны.
14:35:00: OK. Инициализация приложения завершена.
14:35:01: Реинициализация графического движка.
14:35:01: Ошибка графического движка: D3DCREATE_HARDWARE_VERTEXPROCESSING не поддерживается
14:35:01: Ошибка графического движка: Провал инициализации Direct3D
14:35:01: Ошибка графического движка: Инициализация графического движка провалена.
14:35:01: Ошибка графического движка: Инициализация графического движка провалена.
Зря удалил коммент - там был важный текст "при сворачивании"! Я уже релиз подготовил и тут наткнулся на твой коммент. При сворачивании происходит Resize окна, у меня на Resize реинициализация Direct3D, а при сворачивании окна область вывода 0х0. Ща поправлю и выложу новый релиз - 5 минут!
я ж продублировал :[
Уже неважно, я уже исправил в новом релизе. :)
Непривычное управление, впрочем, на то оно и экспериментальное. В общем, понравилось.
Ускорение сбрасывается до 1 при каждом нажатии поворота. Причем, если зажать поворот, скажем, влево, ускорение растет и вместо 2 переходит в -2 (естественное торможение). ИМХО, начинаться ускорение должно с некой величины (2 многовато, например, 1.5) и постепенно падать, если клавиша поворота не меняется. Но это только моё мнение :)
Есть такое, ага. :)
Если сразу скачком назначать ускорение, то можно будет просто быстро-быстро нажимать лево-право и ускоряться не делая зигзагов, а моя цель заставить игрока ползать извиваясь как змея.
Йопт... Страшно-то как...
О,у меня гениальная идея! Давать ускорение при изменении кривизны траектории. Благо, кривизн всего ничего три: положительная (поворот налево), отрицательная (поворот направо) и нулевая. Разумеется, если миллиметр поворачивать, то эффекта быть не должно, но всё равно же записываем траекторию через определённые участки, да?
Ну, записали новую точку, посмотрели на две предыдущие, взяли знак векторного произведения, сравнили с предыдущим сохранённым, если разный, то дали ускорение, сохранили знак. Всё тривиальное просто!
x0, y0 = obtain_new_checkpoint()
new_gamma = sign((x0 - x1)(y1 - y2) - (x1 - x2)(y0 - y1))
add_accel(abs(new_gamma - gamma)) // 0, 1, 2
gamma = new_gamma
x2, y2 = x1, y1
x1, y1 = x0, y0
Спасибо, попробую! Есть проблема - как тронуться с места? :)
Дык изначально кривизна 0. Стоит чуть свернуть - уже не ноль, и поехало ускорение.
Кстати, мелкое замечание - максимальная скорость уж очень халявно достижима.
Нет цели фрустрировать игрока, надо просто спровоцировать его ползать петлями. :) Но я покручу ещё настроечки, ага.
Кривизну мы меряем по пути, нет пути - нет кривизны. Нужна дополнительная примочка, типа имеющегося алгоритма, в качестве "стартёра". Вечерком попробую.
Очевидно, начальный путь лежит ровно вдоль змеи. Мы же кривизну змеи, а не пути меряем. Т. е. x0, y0 - голова, x1, y1 - первое звено, x2, y2 - второе звено.
Посмотрел дебагом, как ты тыкаешь точки. Впечатлился. Пожалуй, ускорение примерно каждую восьмую точку надо менять, не чаще.
Кстати, bug - когда отладочным выводом сбрасываешь FPS до тридцати, то змея замедляется. При правильном delta timing она должна двигаться с той же скоростью, но более дёргано, по идее. Посмотри, хотя, возможно, это глюки вайна.
Гляну, спасибо, очень возможно что дельта-тайминг кривой.
Ещё косяк. Если зажать A и D, червь банально "газует".
Первая монетка в копилку! :) Он поворачивает одновременно в две стороны и поправки направления взаимно уничтожаются. Сделаю взаимоисключающие режимы поворота, тогда либо влево, либо вправо - что последнее нажалось.
Отлично! Понравилось. Но, по-моему, нужно фиксить возможность разгона до максимальной скорости частым перебиранием стрелок. Получается разгон не за счет изгибов, т.к. змея практически прямая. И, насколько я понимаю, максимальная скорость короткой змеи должна быть меньше длинной.
Ага, максимальные скорости я не догадался варьировать по размеру, спасибо!
С разгоном да, ща попробовал - нечестный метод разгона. Надо наверное с нуля ускорение ставить при повороте, а я с 1.0 начинаю, чтобы не мариновать пользователя при старте с нулевой скорости. Я на управление треть дня потратил - больше чем на реализацию дельта-тайминга, а всё равно сыро получилось. Короче всё непросто, надо резко придумывать короткие пути развития игры - на всё меня за неделю не хватит.
Вообще змее неплохо бы быть чуть-чуть эластичной, т.е. необязательно иметь одну скорость по всей длине. Так получилось бы реалистичнее, но делать задолбёшься.
Про ускорение я чуть выше написал, посмотри, может умное чо. Только там. конечно, set_accel, а не add_accel.
А зачем ей быть эластичной? По-моему лучше, если она в магазин за печеньками к чаю бегать будет. :)
Реальная змея не эластична - при проверке на эластичность она обычно перестаёт быть змеёй и становится мёртвым шлангом. Я в школе (у нас биологического профиля класс был) одного такого, замученного детишками, ужа вскрывал и на стекло наклеивал. :)
И чай заваривала, ага. :)
Не, ну она же не АТТ, в конце концов. По ней возмущение скорости бежит не быстрее чем со скоростью звука. Хм. Хотя это километр в секунду.
Кстати, торможение (постоянное) ведь зависит от длины змеи?
Нет, торможение как и ускорение и максимальная скорость от длины не зависит. Положил в копилку добрых дел.
Хош, подарю еще идею? :D У тебя-то всяко лучше получается :)
Баг - окошко и "полноэкранный" режим дают разное поле для обзора
...
Делать было нечего:
(До тысячи звеньев игра честно пыталась держать синхронизированный фпс :) )
Охренеть! Я пока писал тоже немало яблочек стрескал, но чтобы до такого состояние животное довести - ни разу не получалось. Жалко патронов в плюсогане нет больше. Терпение и труд, любой FPS перетрут! :D
Боюсь для окна масштабировать картинку не буду - шрифты у меня растровые, да и полезней сдалать тру-фулскрин и на него нажимать. Хочу приделать масштабирование обзора при изменении скорости - чтобы камера какбы повыше поднималась, если скорость большая.
А как она себя, кстати, вела на пределе? Скачками прыгала? Клинило?
Да так же, как обычно, фпс падал не более, чем до 75 от целевых 85, так что это далеко не предел.
Вот с дебажной отрисовкой "каркаса" падало в несколько раз, до нескольких фпс при 1000 звеньях
Спасибо, понятно - в релизном варианте дебажный вывод буду ампутировать на этапе компиляции. :)
Я сейчас тестирую на ноуте, уже при 300 фпс упал до 31. Конечно понимаю, что на ноуте встроенная видеокарта и т.д., но ты хоть укажи потом системные требования чтоль))
В папке игры есть файлик Log.htm, глянь, есть ли там такая строчка "Ошибка графического движка: D3DCREATE_HARDWARE_VERTEXPROCESSING не поддерживается"? Это бы объяснило тормоза на 300 звеньев.
А системные требования указать сложно, у меня нет набора компов для тестирования, да и довольно бесполезно. Игра ж конкурсная: запустилась - хорошо, не запустилась - ну и ладно, запустил следующую. :)
Можно попросить написать людей конфигурации своих компьютеров и самую слабую из удачных написать в системные)
Из ошибок только:
10:46:31: Ошибка графического движка: Невозможно загрузить растр для шрифта - Resource/Fonts/nBicubikBR.png
Дальше уже идёт: 10:46:31: OK. Графический движок инициализирован.
Гы, а я и не заметил - спасибо, ещё одна бага в копилочку. :)
По теме: И чего я добьюсь указав минимальные системные требования? Баловство это.
Продолжая идею stress testing.
Нормальный FPS 54, после пятисот звеньев - 46-48. Если всю змею в тыщу звеньев вывести на экран, то и вовсе 26-29.
Бедный удав... :)
мсье знает толк в извращеньях
Bug - во время образования нового звена вся остальная змея замирает. Выглядит дёргано и неестественно.
Хехе, прибавлять длину для змеи вообще не естественно, она годами растёт. :) Как бы ты прибавлял новое звено?
лучше было бы прибавлять звено не вторым (после головы), а последним.
Последнее не такой формы как среднее, можно только предпоследнее звено добавлять. надо попробовать, не уверен, что это будет эффектно - хвост имеет фиксированную длину, все звенья хвоста при его увеличении должны поменять размер, т.к. первое звено хвоста перестанет им быть и станет такой же толщины, как и всё предыдущее тело.
нееее, оставь так :) очень круто новое звено "выплывает" из головы
Голова она всему голова! :) Если сделаю так, что повреждённый хвост втягивается, то точно из головы всё оставлю - оно логично, что червяк регенирирует за счет всасывания и переработки звеньев, а всё самое важное в голове.
Кстати, насчёт кусания хвоста. Я правильно понимаю, что при откусывании хвоста другой змеи она будет всасываться на манер макаронины?
Не, просто откусываться. Если у поедателя скорость больше, а размер позволяет съесть следующее звено, то поедание продолжается. Если следующее звено крупнее головы поедателя, то он просто останавливается (или отворачивается, как уж реализую) как при столкновении с препятствием.
Короче - каждое столкновение\поедания для каждого звена червя обрабатывается независимо.
Но если я отъем хвост, то змея укоротится, т.е. действуя неспешно, я сожру её целиком, не?
И что будет, если я сразу вопрусь в срединный сегмент? Просто столкнусь?
Этого ничего пока нет. Но я предполагаю сделать отдельный вид звена - отъеденный обрубок. Если посередине перекусить червя, то задняя часть останется лежать, её можно будет съесть отдельно. Если у червя что-то откусили, то на месте откуса обрубок, но после первой же еды вместо обрубка появляется звено-хвост и дальше червь растёт хвостом, а не головой, пока не восстановит хвост в нормальном масштабе.
Всё тело продолжал бы двигать с прежней скоростью, поставил бы флаг, соотв. голова чуть ускоряется (по синус-квадрату плюс общая скорость примерно), освобождая место для нового звена. Новое звено выросло - флаг снят.
Скоростью управляет игрок, не надо ему мешать в этом, будет бесить, да и вообще замедление хвоста для роста является в данном традиционным приёмом. :)
Да, уже понял, что ускорять голову - плохая идея. Ну, хвост по той же схеме замедлять, всё лучше, чем дёрганье.
Поглядел новую версию...
Весьма занятно. Экспериментальное управление удалось. Но для основной фишки игры - маловато. Фон одобряю =)
Но вот чего я не могу понять - почему в игре про Гигера змея ест яблоки, а не людей? Я бы понял, если бы там была надпись "Боги смерти едят одни лишь яблоки", но и то даже такая напись узко специализирована и не смотревшие DeathNote её не поймут.
Никаких яблок не будет, конечно! Яблоки для демки. :)
А фишек кроме динамики ГГ вообще нет, судорожно пытаюсь придумать чего успеть напрограммировать за неделю, чтобы у игрока была хоть какая-то задача. :(
Если они будут бегать быстро, но спотыкаться об змеюку - будет довольно хитро.
Бегающих тварюшек надо анимировать - это я не потяну. Мне проще других змей добавить и мозги им какие-нибудь примитивные вставить, чтобы они жрали друг-друга и игрока.
Я тут уже прикидываю так: будет игра типа "жри всё, что меньше, убегай от всего, что больше". Большая змея может съесть маленькую как угодно, а маленькая может откусить от большой только те части, которые меньше её головы.
Уровень начинается с того, что на карте разложены яйца и чужие змеи. Из яиц, через некоторое время, появляются новые змеи. Цель - сожрать всё, чтобы не сожрали тебя. Змеи у меня есть, яйца - те же яблоки, осталось придумать как обрисовать выползание змеи из яйца и напрограммировать AI змеи.
Но до этого мне нужно придумать как обрабатывать столкновения с препятствиями, сделать редактор карт для выставления этих препятствий на уровень. Работы, короче, на месяц. :)
Snake Battle, Snake Battle! Сделай мультиплеер, пожалуйста!
Даже в теории не знаю как пишутся мультиплееры. :)
Я обычно инкапсулировал всю работу по управлению и отрисовке одного игрока в отдельный класс и делегировал ему нужные события из общего event cycle. Это работает.
У меня и так всё по классам. Есть класс Worm, есть класс UserInput, у второго есть указатель на первый и возможность дёргать публичные методы типа BeginMoveRight и т.д.
Давай так - если игра хоть до чего-то дорастёт, то ты напишешь для неё мультиплеер. :)
Я, знаешь, с WinAPI не очень, и платформа у меня явно слабо подходит. Но если там ничего дикого...
Поднимем тему после конкурса, если будет о чём говорить.
Issue: при отключенном звуке щелчок при постановке/снятии паузы по-прежнему слышен.
Исправлю, спасибо!
Не баг, скорее мои придирки. Не обращай внимания))
-Спавн вишенок/яблок прямо под змеёй. Иногда съесть её под хвостом нельзя, даже через пару секунд после, так что возвращаться приходится ещё раз или кружить на месте пока вишню не станет возможным её поглотить. Впрочем это было в первой версии так что может уже пофиксил, хоть отпишись...
P.S. а "длина" всё-таки считается по количеству яблок, да?
Оке, в генераторе (на уровне, где он будет) буду учитывать чтобы жрачка генерировалась в невидимой области карты не на теле червя. Длина да, одно яблоко - одно звено. :)
>>>одно яблоко одно звено.
Не очень разумно из-за бага описанного выше:
>>>А то одна на одной попадаются, съедаю обе, а прибавляется одно звено :(
Кстати да, забыл подтвердить багу с яблоками.
Дело в обработчике столкновений - в одну итерацию движок сообщает объекту только один указатель на столкнувшийся с ним объект (первый который обнаружит). Если в следующую итерацию уже столкновения нет, то второй объект оказывается не окученным. Это по-любому придётся ликвидировать, когда буду делать обработку столкновений червей - там постоянно будет по несколько объектов сталкиваться.
Пощупал новую версию — очень даже круто, идея с управлением мне понравилась. Правда вот одна деталь: нажимая одну и ту же клавишу, можно закрутить всю змею в «кольцо». Steps to reproduce:
1) Жмём, например, влево до тех пор, пока змея полностью не остановится;
2) к шагу 1.
Не знаю баг ли это, но, насколько я знаю, чисто физически змея так двигаться не может (:
Вдохновляет! Как ни странно, ещё никто не пожаловался, что новое управление неудобное, хотя все сообщили о наличии какого-нибудь косяка - добрый знак: после обработки напильником нововведение может стать фишкой. :)
Кручение в кольцо это, конечно, баг! И о нём я до сих пор не подозревал, спасибо тебе! :)
сделай чтоб при столкновении с хвостом отнималось ХП - тогда точно никаких колец не будет...
..или чтоб змея "перекусывала" свой хвост а он потом валялся на карте ошмётком.
Я уже думал - боюсь без пересечений собственного тела всё будет очень скучно выглядеть. К тому же очень сложно в "резком" режиме не задевать свой хвост - игрок будет постоянно кипятиться из-за фэйлов.
Если по дельте кривизны считать, то проблем, очевидно, не будет.
Кстати, по поводу разгона с места: если игрок стоит, то можно экстраполировать его траекторию исходя из нажатых клавиш. Т. е. жмёт влево - кривизна 1. Вперёд - 0. Вправо - -1.
Он меня опередил)))
Кстати, при повороте в одну сторону ускорение увеличивается где-то до 1.8/1.9 (главное долго не держать, а то будет -2.0), но как только нажимаешь клавишу поворота в другую сторону, оно снова сбрасывается до 1.1.
Ага, это всё следствие того, что я сразу ускорение фиксированное выдаю, а не с нуля поднимаю. Я это в следующем релизе поправлю. Ща делаю масштабирование, чтобы камера "отъезжала" при разгоне, к управлению чуть позже вернусь.
ИМХО, сначала лучше разобраться с управлением, а косметические доработки и камеру в том числе на потом
Перфекционизм нам всем не чужд, но есть ещё проект в целом, который нужно в том или ином виде завершить в воскресенье: управление и динамика червя, это прорва в которую можно смело вбросить оставшиеся четыре дня, при этом без особой гарантии успеха.
Когда там уже Бета?))
Бета будет, когда сделаю других червей, это не раньше пятницы.
Сегодня выпущу ещё одну альфу с коррекцией управления, отъезжанием камеры и, очень надеюсь, тестовыми препятствиями с алгоритмом отскакивания от них.
Вчера ничего не делал - на ДР пригласили, не смог отказаться. :)
Давай скорее. А то мне тестировать нечего. Скучно! :D
Погляделвторую альфу, очень прикольно, управление оригинальное, именно зи-за его обещания я и обратил внимания на игру. Тперь нехорошести: змеюка тормозит, когда удилнняется, а потом рвет с той же скоростью, как и была. Почему бы спрайты сегментов змеи не сделать пересекающмимися? такое ощущение, что болтаются на ниточке. Нет впечатления, что это змея...
Может, границы поля упругими сделать?
Зачем? Вроде и так хорошо)
Не знаю, у меня впечатление есть. К тому же автор придерживался строгого минимализма :)
Из-за появления нового звена. Иначе нельзя, часть змеи всё равно будет тормозить.
Тормозит только хвост, а голова, которой мы собственно и управляем, движется без остановок. А как ты иначе предлагаешь добавлять звено?
Ну не знаю, по мне так змея ощущается очень даже хорошо, а в плавном режиме (при зажатой стрелке вверх) вообще как настоящая ползет. Кстати, как автор смотрит на то, чтобы инвертировать действие клавиши вверх (т.е. чтоб плавный режим был по умолчанию)?
Клёвая идея, попробую на стрелку вперёд посадить резкий поворотый режим! :)
НЕЕЕТ! Опять придётся постоянно её держать.
Тогда надо подвесить на ту кнопку переключение между режимами...
Да не, привыкнешь ;)
В принципе, я не настаиваю, может даже и не надо (:
Я уже перевернул(пока не выложил) - клёво! Едешь плавно и можешь чуть срезать повороты легко надавливая "вперёд" - в прошлом варианте это было неудобно.
Границы сделаю упругими в том смысле, что при ударе о границу (как и любое препятствия) червь не будет тормозиться, а будет либо отворачиваться от перпятствия, либо плавно скользить вдоль него, если он вошел в него не под прямым углом.
Сегменты просто соберу поаккуратнее, чтобы не разваливались, а щели останутся, это стиль такой, как и прозрачные дырки-глаза. Погляди на мой аватар - змеи будут такими же. :D
"И сотворил он их по своему образу и подобию" ;)
Уже первое, между нами :).
А вот и релиз! Я, правда, сжульничал и датировал его всё же 31-ым. :)
А я по-прежнему умею заворачиваться в кольцо :(. Но в графике стало намного приятней! Особенно к месту чуть уменьшенные расстояния между сегментами.
В кольцо все змеи умеют заворачиваться. Это не баг. Багой было заворачивание в кольцо с перманентным ускорением. Сейчас можно только остановиться до нуля и только потом снова ускоряться в любую сторону.
Осталось, только достичь теперь сложнее) А так вообще шикарно)
Вроде через ноль всё сейчас! Больше не получается разгоняться щёлкая влево-вправо быстро-быстро. :)
Управление, подъезд камеры не пугают?
Поглядел обновление.
Стало лучше=)
Когда змея большая а яблочки маленькая- хороший контраст, игрок видет что его червь растёт.
Камера сделана хорошо ,единственное, что в ней смущает - это когда змея уже длинная - голова большая и при полном замедлении камера приближается и башка на полэкрана. Мб стоит ещё учитывать размер змеи?
Ещё мне кажется что управление в предыдущей версии было лучше, как-то более змеюка извивалась и создавала ощущение того как движутся змеи. Сейчас же (особенно когда она большая) какая-то она сильно неповоротливая стала.
Ага, большая змея стала неповоротливой. На самом деле она стала в два раза жирнее и быстрее раза в полтора, но отъезжание камеры это съедает, а яблочки плохие ориентиры. У большой змеи ограничения на угол поворота увеличиваются, она становится тупее. Вот добавлю других червей, станет понятнее - там снова побалансирую скорости, углы поворотов и всё такое.
Камеру подкручу, спасибо, теперь заметил - мне тоже не нравится, когда голова на полэкрана у большой остановившейся змеи. :)
О, еще одна альфа... Стало лучше, однозначно. Насчет притормаживания - тоже лучше (скажи, ты сделал так, чтобы яблоки елись быстрее?). Неповоротливее змейка, правда, может с ускорениями поиграться в большую сторону?.
Можно сделать ускоренный режим змейки ограниченным по времени, что-то типа прогрессбара "Нитро"... прогрессбар сделать как змейку можно :-)
Если у тебя там будут уровни - не забудь сделать фриплей на очки.
И трек... Рок-н-ролл был веселее :-) змейка дрыгалась в ритм. А теперь чувствуется, когда трек закончился, а когда начался, нехорошо, наверно.
У меня кстати вообще при окончании трека игра подвисает на секунду, прежде чем трек начинает заново играть ._.
Я у себя не замечал, но погляжу - при окончании он снова грузится с диска (раз он один, то он же и следующий:), может это на разных машинах по-разному работает.
Да, скорее всего. У меня ничего не тормозит.
Рок-н-ролл был рокенрольнее, а свинг свинговее, но это была чужая музыка, понимаешь?
Короткое ускорение хотел сделать, но явно не успеваю, хочу чтобы чтобы змея распрямлялась в броске, а это сложно.
Яблоки чуть размером уменьшил. А дёрганье осталось - поправлю в следующем релизе. Дело вот в чём - когда съедается одно яблоко, то туловище просто тормозится, а вот когда на середине этой фазы съедается ещё одно - вот тут поведение дерганое, я не учитывал поедание яблок в постоянном режиме. :)
когда уже яблоки будут изменены на людей?
думаю никогда, сначала я введу других червей, потом вместо яблок введу яйца (они будут расти и из них будут вылупляться новые черви), а если хватит времени то добавлю какую-нибудь съедобную ползучку.
К сожалению, не могу пока приложить скрин, но вот какая досадная штука тут есть: если заворачивать почти в полный круг, можно тремя такими заворотами разогнаться до максимума. Змеи вроде так не делают. Я предлагаю ограничить ускорение до полукруга.
Уже трындец со временем, не до полукругов. :) Надо мозги червям вправлять.
Следы от змеи будут?
А это клёво?
Боюсь количество змей на квадратный метр будет слишком большим, чтобы что-то трассировать - мусор получится. Функцию следа вроде как хвост выполняет. :)
тебе виднее! я чисто идею вкинул )
Ага, спасибо!
Новый релиз с ещё более экспериментальным управлением - управлять в новой альфе уже просто нечем! :)
ИИ червяков хороший на мой взгляд. Действительно радует =)
Нашёл косячок:
червяк на средней стадии взросления может завернуться в кольцо вокруг яблока. Правда потом через некоторое время он из кольцевого выходит.
И когда червяки большие - они тормознутые и наблюдать не так интересно =(
:) Спасибо! Твоё одобрение много значит.
Большие черви плохо ворочаются и из-за ограниченного угла поворота не могут съесть ближайшее яблоко (а они именно по ближайшим специализируются). Я там поставил сторожевой таймер, он заставляет завсших (вокруг яблока или когда яблоко в "отбивающей" от препятствия зоне) временно сменить цель и сходить погулять.
Я думаю стоит подуменьшить максимальный размер червя и жратвы на поле оставлять поменьше.
Сейчас работаю над музыкой и системой боя червей.
Змеи некрасиво пересекаются - раз.
Взрослые змеи очень быстро меняют цели и ни до чего не доползают - два.
А максимальный размер делать не надо, может? А то неинтересно.
И опять из-за низкого fps всё тормозит, а не дёргается.
Змеи пересекаться не будут вообще - либо жрать, либо отталкиваться. Именно максимальный размер и нужен, чтобы не было тормозных змей-переростков.
Свернул, развернул - и яблочек нема! Черви по четвертому дебажному выводу их видят, а я нет
Это стабильно проявляется? У меня такого нет. :(
С какого-то момента яблоки перестают появляться (по крайней мере визуально), черви при этом едят яблоки-невидимки.
:) В этой демке яблоки не появляются вообще - сколько есть в начале, столько и кушать подано. А черви просто от безделья по рандомным точкам скачут. Всё нормально. :)
Сам виноват, избаловал нас "вечными яблочками", вот мы и паникуем ;)
Мсье... ваши черви лезут по синим шарам... баг? =)
Это ещё один довод в пользу уменьшения максимального размера - когда препятствие по размеру сравнимо с выносом сенсорных точек, то червь может легко наехать на него. Не пофиксится, но поуменьшится.
Бета-версия!
Вылетает при нажатии "1". То бишь FPS показывать отказывается. Log молчит. Впрочем мелочи.
И можно побольше карту сделать.