Gaminator 22: Finem [Финэм]
После того как всех обескуражила тема Гаминатора, мы немного потрепались с Треугольником и он предложил, как вариант, игру про важность текущего момента. Разумеется, такая интерпретация меня не устроила, но размышления о том, что именно меня не устраивает, зашевелили нужные рычаги и сюжет игры появился очень быстро. Существует некая важная дата, которая случается всего лишь один раз за жизнь (редко у кого больше), о ней то мне и хочется напомнить игроку (или самому себе).
Это должен быть платформер, где нужно прыгать, атаковать, проходить уровни и читать текст.
Через два дня стало ясно, что в одиночку такую игру мне ни за что не сделать. Написал myHazards’у. Решили, что он возьмет на себя арт, а я сосредоточусь на коде. Если честно, то уже давно хотел с ним поработать, но не было подходящей ситуации, а тут сошлось все, что должно было, т.к. игра была как раз в его жанре. Результат этой совместной работы, меня очень радует. Со скидкой на то, что кусанул я немного больше того, что мы можем переварить вдвоем за отведенный срок. Но мы очень постараемся.
УПРАВЛЕНИЕ:
Влево, вправо -- передвижение.
Вверх, вниз -- лезть по лестнице.
Вниз + С -- спрыгнуть с платформы.
Z -- атака в ближнем бою.
X -- выстрел из револьвера.
С -- прыжок.
Если хотите, должен работать геймпад.
Ссылка- 18 ноября 2021, 20:54
Окей, но почему платформер?
Не очень много времени, чтобы нормально ответить, но я попробую. Главным образом потому, что такой игра пришла в голову, какая еще может быть адекватная причина. Но кроме этого, лично мне сейчас хочется поисследовать этот жанр и набить базу кода. Там будут движущиеся платформы и лестницы. Это немного запарно, но получилось. Еще пытаюсь выйти из своих собственных шаблонов и специально сделал простой прыжок не смотря на то, что не представляю себе платформер без дабл джампа и доводки высоты. Сначала надо научиться использовать минимум, а уже потом браться за большие механики.
Отправили в релиз. Финальный пост может попозже будет. Устали.
+ скриншоты под спойлер
Стоп. Не та версия. Кто запустил, тот проспойлерил все.
Поправили, можно играть. Ссылка в заявке.
Редкий кадр с белым героем. Оставлю для истории. Персонаж должен моргать прозрачным в этот момент. Не могу сообразить, что должно было совпасть для этого кадра, но свойство быть белым он перенял от общего с врагами родительского класса.
Понравилось разнообразие всего в уровнях и графика, но очень хардкорно для меня. Тугой прыжок, герой цепляется за лестницу через раз. Мыши летают над головой, слишком высоко для удара в прыжке, и приходится ждать кучу времени, пока они соизволят перестать блокировать путь. Но хотя бы можно пробежать мимо многих врагов (но не всех) без боя и потери здоровья.
Газ в пещере видно норм, но в начале игры на свету я не сразу понял, что это герой вдруг упал с ног. Не понял, что означает вторая серая полоска у стамины. Не понял со здоровьем врагов, они лечатся что ли, если редко их бить? Анимация смерти слишком долгая, я пускаю пулю, а она оказывается не нужна.
Непривычный порядок кнопок, путаюсь, для меня удобнее было бы средний палец - прыжок, указательный - удар, а безымянный - стрельба.
Дошёл во втором уровне до пещеры с огненными плеваками. Сразу после первого плеваки мне не хватило дальности прыжка через ров с газом (перед ползучей рукой и кровью на стене). Заново переигрывать нет желания, никто не гарантирует, что в следующий раз прыжка в этом же месте хватит. :/
Не смог пройти место где надо с прыжка цепляться за лестницу. Решил что где-то еще что-то пропустил. Но когда запустил сейчас чтоб сделать скрин решил попробовать таки зацепиться и с энной попытки удалось. Дальше там я смотрю повеселее, так что позже напишу, но это место конечно стремное.
Есть два таких места. Ты имеешь ввиду в пещере на первом уровне?
да, на первом уровне.
Блин. Вообще не ожидал, что это настолько сложно. Вроде стандартная механика. Тогда третий уровень тебе мозги вынесет :))
Там не то чтобы сложно - просто надо после первых пары неудач убедить себя что именно тут надо прыгать, а не где-то еще идти искать проход. Ну и надо отпускать прыжок перед хватанием, я так понимаю в первый раз я из-за этого не мог зацепиться.
Виноват мой замыленный глаз. Сейчас специально проверил. Кнопка прыжка не мешает, но мешает слишком короткая разбежка. Игрок может подумать, что пол секунды разбега достаточно, чтобы прыгнуть, но нужно разбегаться в два раз дольше. В итоге, ты просто слишком низко от лестницы, чтобы зацепиться, но кажется, будто зацепиться можно
ооо да. Прыжков 50 или около того. Из них успешных 5.
Дошел до островка где трое с топорами спаунится, и хотя обойма была полная не успел среагировать. Ну и опять эта карусель - с меня пока хватит.
Музыка - ну, по атмосфере вроде подходит но на мой взгляд немного занудная. Поэтому ее ни к плюсам ни к минусам.
Плюсы:
- сюжет интригует, играл чтобы узнать чем закончится. Может позже вернусь ради этого. Вообще реплики классные.
- да, прикольные орбиты на экране с медитирующими.
- баланс, механики
- умные и разнообразные по тактике враги. Птички правда иногда улетают куда-то откуда не могут выбраться, но это отнюдь не огорчает.
- систему с комбо я не очень понял (ааа, пока писал дошло, типа зеленая полоска показывает силу удара?), но идея со стаминой понравилась.
- с пистолетом тоже годная механика. Прикольно было на той проклятой лестнице стрелять с середины чтоб убить рукохвата и потом судорожно цепляться назад.
Минусы:
- немного топорные прыжки. То что они маленькие ладно (хотя до принца персии не хватает детерминированности, а в остальном я предпочитаю менее реалистичные и более прыгучие платформеры), но кроме этого ощущаются какими-то неуправляемыми что ли. Если подольше поиграть привыкаешь, но все равно в нескольких местах не уверен - допрыгнешь или нет.
- хватание за лестницы?
Не понял про полоску. Та бледная полоска на стамина-баре? Она говорит о том, что стамины не хватает на целый удар. Синяя часть, это то, чего уже хватит на удар, а бледная то, чего на удар не хватает.
Спасибо за отзыв. Рад, что не смотря на все трудности, чем то еще держит, и ты пытаешься до сих пор проходить. Плюсов больше написал, но минусы прямо существенные, не дают играть. То, что нужно прыжки и лестницы исправлять, я учел и обязательно исправлю. Но расскажу еще, как это проходить, если вдруг у тебя еще осталось желание.
Персонаж инертный и не моментально набирает скорость. Чтобы нормально прыгать нужно нормально разбежаться, без этого просто не допрыгнешь в 50% мест.
Цепляться за лестницы надо, когда ты прямо вот ее перекрываешь персонажем. То есть надо точно хвататься. И момент, что если живот персонажа находится ниже конца лестницы, он за нее никак не схватится. Из-за чего ты и страдал на первом уровне.
Это, конечно, изобретательно. Мне просто не верится, что ты юзал эту тактику, которая даже не предполагалась, именно в этом месте, где так жесток штраф за неудачу! Ты отчаянный. Это пока высший пилотаж в прохождении.
просто когда я в первый раз успешно запрыгнул именно он меня и прикончил.
ааа, еще раз посмотрел и дошло. Меня просто сбило что когда энергия полная зеленая полоска короткая, а в промежуточной стадии бывает длинной.
Мы пытались в хоррор :)
Поделюсь впечатлениями о разработке. Наверно надо что-то написать, но я только отошел от разработческого транса, в котором мы пребывали.
(Почему комментарий, а не отдельный пост? На случае, если мой коллега тоже захочет высказаться. Специально пост мы не готовили.)
Код:
В этот раз было задумано работать не столько на Гаминатор, сколько на хорошую базу кода. Раньше всегда старался побыстрее воплотить основную механику и по скорее доделывать игру в стиле "тяп-ляп-готово". Но я заметил, что в конце разработки, такой код связывает тебя по рукам и ногам и тормозит завершение игры. В этот раз я запарился и всю первую неделю писал только платформенный движок, а всю вторую неделю искусственный интеллект врагов.
ИИ работает на наследовании. У нас есть отдельный враг, который наследует механизм поведения от глобального класса mind, который наследует тактические характеристики от глобального класса fighter, который происходит от класса body, действующего на уровне прыгания по платформам, который тоже наследуется от общего класса управляющего анимациями и отрисовкой actor. Игрок тоже получает всю эту родительско-дочернюю структуру в наследство, только вместо class_mind стоит сам игрок. Получается такой универсальный юнит, который может быть как игроком так и ии. У него есть анимационные действия, физическое тело, бойцовое тело и дальше управление перенимает настоящий или искусственный разум.
Постарался по максимуму использовать весь ООП потенциал GMS2.3. Особенно мне понравилось пользоваться структурами как класс/экземпляр, объявляя экземпляр через ключевое слово new. Это позволяет, например делать пулю, удар кинжала и удар монстра, через единственный объект o_Weapon, просто создавая оружие (new struct_weapon()) с разными характеристиками для разных юнитов.
В конце концов, это позволило проекту быть более гибким на финальных этапах, что привело нас к самому трудному решению на финальной неделе.
Неделя продления:
Наверно глупо переобуваться на бегу, на последних ста метрах перед финишем. За три недели, без продления, у нас уже была условно готовая игра, почти полноценная. Смущала боевая система, а именно удар ножом. Во первых, не было комбо, во вторых, выглядел он иначе, чем сейчас, более топорно что ли. Но при этом игралось нормально. Лично мне нормально игралось, Хазарду тоже. Однако, если ты инди задрот, тебе не так уж много нужно от механики, ты полюбишь то, что другие не смогут полюбить. И стало ясно, что части игроков такая боевка не понравится - в ней не было сока.
Две ночи myHazards рисовал анимации и еще день я писал систему комбо. Мы полностью переобулись за 3 дня до дедлайна. С этим комбо могла полететь вся система реакции на урон и в целом ИИ. Но не полетела. Хазард сказал, что боевка хорошая, я выдохнул.
Так же, в последнюю неделю, как и обещал сделал музыку. Этому я посвятил целые отдельные сутки и она получилось максимально простой, с минимумом инструментов. Четыре трека из шести звучат просто на одном инструменте. Но лучше с такой музыкой, чем без никакой.
Звук:
Поскольку перед конкурсом (или уже во время), я прямо заявил Нупрахтору, что звук это 51% всей игры, было бы обидно если бы не было этого продления. Тем более, кое-что из музыки я доделал в последний день, а кое-что прямо перед самым релизом.
Звук брал из открытых библиотек, вырезал нужные куски, склеивал и смешивал вместе, пока не добьюсь нужного результата. Например попадание по врагу звучит смачно потому, что там подмешивается всплеск воды, но если не прислушиваться специально, вряд ли вы услышите воду. Каждый эффект состоит из 2-5 разных звуков. Вернувшись в открытую базу звуков, вы не найдете их, это уже новые самостоятельные эффекты.
А ну и не все были из библиотек. Некоторые сгенерированы методом волнового синтеза. Я уже сжился с программой ChipTone, подружился, даже название пишу по памяти. Нравится генерировать звуки, а вот библиотеки я побаивался, но в итоге, все что нужно нашлось.
GameMaker Studio 2:
По тихонечку, нащупывается тот формат разработки, с которым в принципе можно работать. За последние полтора года, я понял, что инструмент диктует то, какие игры удобно делать конкретно на нем. Я стал больше пользоваться возможностями и сахаром гейм мейкера и меньше выдумывать от себя. То что делает, к примеру, ДаркДес, это уникально, но движок рассчитан на какие-то определенные игры, какого-то определенного размера и следовать этому формату означает работать удобно. Раньше я не прислушивался к своему IDE, а теперь прислушиваюсь.
Остальное:
По сюжету не знаю, что сказать. Может быть кто-то не пройдет до конца и не узнает его финального аккорда. Порой я задумывался над тем, что сюжет слишком приторный. Приторный, в смысле, что впаривает тебе свою философию без прелюдий. Но в формате игры, да еще такой крохотной, думаю, по другому и не сделаешь. По крайней мере, у меня мыслей нет. Сейчас меня этот момент уже не напрягает. Сюжет просто залетел в голову в ночь после объявления темы.
Как всегда, амбиции превысили грань дозволенного, тем не менее, это самый законченный проект на гаминатор, из тех с которыми я работал. Но попотеть пришлось знатно. Еще в прошлый раз я себе обещал больше не напрягаться на гаминатор и тут на тебе. Но в целом, разработка, ее процесс и сам результат меня удивили в хорошем смысле. Все прошло на одном дыхании.
Спасибо за предоставленную возможность, буду рад, если поиграете и напишите честное мнение.
Крутой комментарий! Я бы ещё больше почитал про сам код. Не знаю можно ли текстом описать то, как над музыкой работал - тоже интересно.
Похоже комментарий обрезался на самом интересном месте! Что-то про ГМС2 не вошло.
В игру не играл, но по скриншоту и интерфейсу это же ...
Погодь, коммент обновляется со временем. Все будет.
А, обновляется, ну тогда хорошо!
Есть конструктор, создающий структуру (struct) оружия. В переводе на общепринятый язык, есть класс, который создает свои экземпляры:
function new_weapon(урон, кулдаун) constructor
{
damage = урон
cooldown = кулдаун
melee = true
}
Это общий класс. Теперь каждому юниту ты можешь создать по экземпляру такого оружия:
myWeapon = new new_weapon(1, 16)
myWeapon.melee = false
Этот код создает уже непосредственно структуру с набором уникальных характеристик. Далее ты создаешь физический объект оружия obj_weapon. И еще нужна функция use_weapon(struct), которая будет создавать в комнате экземпляр объекта obj_weapon и присваивать ему свойства из myWeapon. obj_weapon нужен просто для маски хитбокса, чтобы задействовать эвент столкновения.
Для чего может понадобиться класс обработчик анимаций? Например для того, чтобы одной строкой задать ему какой-то спрайт и он проиграет его ровно один раз и вернется к исходному состоянию. Это очень удобно, если ты этим пользуешься. Так у меня прописано все что угодно - удары, получение урона. Активировал в одну стоку, и не паришься о том, чтобы это действие прекратилось в нужный момент. Но я заметил подводный камень гейм мейкера. Для того, чтобы нормально срабатывало событие Animation End, необходимо указывать скорость спрайта в формате Frames per game frame. В противном случае, анимация просто пролетала мимо.
Понятно! Я уж подумал, что там прям наследование классов идёт и переназначение переменных-методов.
У меня там в проекте тоже есть несколько структур. Стейт машину вот перевёл на структуры.
С учётом того, что ГМ теперь может из json файла загружать прям структуры, то так и БД характеристик можно хранить. Года 4 назад, для Взертоса, я использовал для этого таблицу CSV и мапу. Сейчас вероятно можно куда проще. Ещё бы ЙоЙо добавили подсказки по структурам нормальные - ваще была бы жара. (а то сейчас все переменные пишет какие только есть)
С подсвечиванием переменных, согласен, не удобно. Но как там узнать какие нужные? Ты ведь можешь структуру 1 передать в переменную A, но можешь и в переменную B, а потом запихнуть в С. И вот что сейчас в твоей переменной С находится - структура или число 1?
У меня сейчас половина переменных на структурах, просто потому, что так удобнее типизировать названия. Например Life .full, Life .work и Life .gain. Тупо удобно записывать и знаешь, что потом можешь еще параметр добавить к этой структуре.
Вот переменными-методами пока не пользовался. Еще не вкурил, как конкретно они мне понадобятся.
Не помню писал или нет, но вот от Жёлтого есть GMEdit и там в виде комментария прописывается тип переменной и тогда доступны поля только указанной структуры. Хоть я и не часто пользуюсь этой программой, но такое удобнее, если получился сущий хаос (например как в моих Стенках, просто ужас).
Переменными-методами не часто пользуюсь, но придумал им такое применение, когда надо переназначить поведение, при этом работает и в рантайме. Например, у меня есть у робота такая переменная с функцией приземления. Я могу в рантайме взять и подставить туда другую функцию, где скажем я выдаю персонажу скорость вверх и тогда получится такой мячик. Тупой пример, но суть в том, что структура поведения одна ("приземлился"), но какое там выполнение - определяется потом.
Допёрло. То есть это замена script_execute(). В принципе, удобно. Теперь осталось научиться размышлять в подобном ключе.
Привет. А как в GMEdit тип для структуры прописать? Я чето не врублюсь.
Где-то находил ссылку на вики, где все фичи описаны. Но могу вспомнить только такое:
Собственно с "@is{X}" работают и string, number и даже ds_map<key,value>
Не очень понятно. И так и сяк пробовал, но подсказки после точки не высвечиваются.

Потому что это анонимная структура или как это называется в ГМ. Может и с таким сработает каким-то другим образом, но я делаю обычно вот так:
Нашёл вики по программе - https://github.com/YellowAfterlife/GMEdit/wiki
Оказывается есть ещё и вебверсия! https://yellowafterlife.github.io/GMEdit/
Upd. Посмотрел вики. Думаю тебе подойдёт прописывать через @hint https://github.com/YellowAfterlife/GMEdit/wiki/Using-@hint-comments
Видел эту вики, но я тупой видимо и не понимаю даже того что ты мне приводишь. Почему @is{abc_t}? В моем представлении типы это что-то вроде int, real, array. Ты задал "объекту" вместо типа его же собственный "класс" - зачем? Что это дает? Получается, что это работает с конструкторами, но не работает с обычной структурой? Сори за тупизну, специально утрирую, но правда ничего не понимаю. В вике есть раздел, описывающий типизацию локальных переменных, и это все, что мне удалось найти. Я просто хочу видеть поля структуры в виде подсказки всплывающей при наборе кода.
Это собственно то, что я сейчас ругаю в автодополнении ГМС2.3 и хвалю в GMEdit. Это и даёт автодополнение к полям структуры. Когда я напишу в том коде "abc_s.", то мне выскочит подсказка с полями var_a, var_b, var_c игнорируя ТЫСЯЧИ переменных ВСЕГО проекта.
Я с структурами без конструктора не особо люблю работать, только как хранители очень простой информации, которую сложно забыть (вектор с полями x,y,z, например).
Но я написал вот такое:
Не знаю почему теперь по 2 поля показывает, но если убрать строки с @hint, то вообще ничего не показывает.
Вот спасибо. Дай Бог тебе доброго здоровья! Будь здоров. Счастья, здоровья!
Подсказки не дублируются видимо потому, что не указываю тип переменной внутри структуры.
Что это за ошибка и почему переменная экземпляра Life подсвечивается красным
Хм, значит можно просто указать тип внутри, типа full: 3, /// @is{number} ? Хотя так не сработает наверно, у меня подсказки пропадали.
А как избавиться от этого предупреждения не знаю, не разобрался. У меня в полу-рабочем проекте есть тоже пару проблем т.к. надо как-то обнулять переменные со структурами, то я пишу туда undefined, а GMEdit ругается, что не может undefined к структуре моей приравнять.
Нет, тип через full:3,/// @is{number} не работает. А зачем писать undefined? Значение noone не подходит по смыслу?
Undefined из чисто логических для себя соображений решил взять. Noone у меня для никаких-объектов в смысле инстансов. А для структур решил таки использовать undefined. В теории можно и noone использовать конечно.
В бете можно писать инлайново типы для анонимных структур,
или сделать typedef для этого (см. тест)
Другой вариант — описать поля структуры через jsdoc hint, как указали ниже, но лучше с типом,
Если включено авто-определение типов, для локальных переменных анонимные типы будут выведены автоматически. Для переменных конструкторов/объектов это пока не работает, так как нужно переписывать индексирование, чтобы оно работало в несколько шагов (сначала ищем макросы, потом ищем типы, отлучаясь на ещё не индексированные функции, от которых они зависят).
Спасибо, что не прошел мимо. Скачал бету и проверил все приведенные варианты кода, тупо скопировав из сообщения, ибо смысл того, что происходит в вики для меня упорно не открывается (смотрю в книгу - вижу фигу). Ни один из вариантов не дал искомого эффекта - переменные после "Life." не подсказываются. Единственная запись, которая работает выглядит вот так:
Поскольку, прописывание типа для каждого отдельного поля дают не нужный дубликат в подсказке, то вместо них я подставил ХИНТЫ, чтобы не писать их на отдельных строчках. Так запись выглядит более лаконично и точно не пропустишь какую-то переменную.
Конечно, может быть я не правильно установил бетту, т.к. не чистил каталоги в апдате, а просто скачал и запустил. Может потому и не работает такая запись. Не знаю, почему то IDE думает, что там 3 фигурные скобки, а четвертую закрашивает в цвет комментария, будто она лишняя:
Все еще не понятна ошибка Can't cast, которая возникает при некоторых вариантах прописывания типов. И почему переменная Life стала выделятся красным? Ну и раз уж теперь буду пользоваться бетой, пожалуйста напиши куда можно будет присылать баг репорты.
Пробовал тыкать настройки, но не нашел решения
Окей, первая запись не работает в is от того, что регулярное выражение для JSDoc-а останавливается на первой закрывающей фигурной скобке (поправлю к следующей бете), но hint явно работает:
(переменные и JSDoc-и индексируются при сохранении файла, если что)
Это ведь в Create событии или конструкторе написано, а не просто где-то?
hint переменная1.переменная2 лучше не делать, так как это объявляет переменную 1 как глобально доступный тип с статическим полем переменная2. Это предназначено для фокусов с конструкторами рода
После того, как попробовал этот код у себя и он не заработал, стало ясно, что мой IDE чем то отличается. Затем я удалил папку AppDatа/Roaming/AceGM и вуаля, пример с Life заработал. Значит при обновлении IDE, все ее папки нужно вырывать с корнем. Но пример с Shift все еще не подсказывает inactive/free, хотя и подсказывает X/Y. Но ведь на твоем скриншоте видно, что все работает, как надо. Я скачивал windows бету с Itch io, но все еще есть разница, между тем, что на скриншоте и тем, что у меня на компьютере.
Рекомендую в будущем папку не удалять, а переименовывать, чтобы можно было составить баг-рапорт — к примеру, у меня ушло довольно долго времени на то, чтобы выяснить, что если текущая тема пользователя битая, программа застревает на старте, так как люди просто удаляли папку настроек (вместе с "уликами")
Предлагаю:
Про сворачивание, можно писать
(is ищет "переменная = " в начале той же строки)
или
(что добавляет переменную в текущий "контекст" (объект, конструктор, интерфейс...))
или даже
(сворачивание кода работает на стороне Ace и, мягко говоря, не очень умно, так как регулярно проверяет строки при вводе/прокрутке)
Про второй комментарий, добавлять ещё больше синтаксической сложности в hint не хотелось бы, так как читателям и так тяжело разобраться с документацией, а одна лишь логика подсветки этих строк в исходнике занимает отдельный 300-строковый класс.
Для дальнейшего пояснения о правильности/неправильности, если есть hint Life.full, линтер ничего не скажет при попытке постучаться в Life из несвязанного объекта, будет жаловаться при попытке доступа через some.Life, и нельзя будет объявить Life с другими полями в другом месте.
Перешел в ЛС, но для потомков уточню, что в пустом проекте действительно все работает, а в целевом висит ошибка в консоли.
Есть еще один подвох:

Вот есть правильная запись и не правильная. Обе они дают одинаковый полезный результат: подсказывают поля структуры. Конечно, в случае со Stamina, вылезает ошибка Can't cast, которая мешает только визуально, но в случае с Life, происходит кое-что по серьезнее - ее больше нельзя свернуть.
Снова вклинюсь в разговор со своими "а вот я бы делал <как-то>". Из своих наблюдений за несколько конкурсных игр и всего пару релизнутых понял, что имеет смысл сделать целую небольшую структуру для какого-то параметра персонажа, например, hp. Поскольку почти всегда в играх использую hp, max_hp, их соотношение (для хелсбара, например) и текстовое описание. Конечно, возможно у тебя именно что только Life и Stamina и участвуют только вот эти переменные full\work\gain без соотношений и названий, но если за full\work\gain скрывается ещё больше общих штук, то ... хотя зачем я вообще пытаюсь навязывать переделку Yak
Думаю, это и твой разговор тоже. Небольшая структура почти всегда будет более удобна, чем разрозненные данные. Тут у меня не используется ничего такого сложного. В моем случае, можно было написать три отдельные переменные hp, hp_max и hp_add, но я чисто для лучшей читабельности и визуальной структуризации делаю это с помощью структуры. У меня такое правило: если в двух и более переменных есть общее слово, значит его можно вынести в структуру. Более того, слова full, work и gain подобранны специально, по причине того, что они имеют одинаковую длину и хорошо смотрятся вместе.
Я фанатик эстетичного кода. Визуально проработать блок кода, для меня, такая же важная задача, как и позаботится о его корректной работе. Недавно столкнулся с проблемой, что ГМ не может найти в коде простой запрос "image_index = 0" потому, что из-за горизонтального выравнивания количество пробелов перед знаком ровно может быть больше стандартного. Из-за этого "двойка" находила не все записи, которые на самом деле участвуют в алгоритме. GMEdit решил просто все мои проблемы, включая эту. В GMEdit можно послать запрос "image_index *= 0" и он найдет тебе все случаи такой записи, вне зависимости от количества пробелов в ней. Честно, я уже морально готовился к тому, чтобы отказаться от выравнивания и тут вдруг ты мне подсказал GMEdit. Я пробовал его когда то раньше, но сейчас действительно стал в нем работать. Спасибо и тебе и Желтому.
Мне тоже нравится эстетичный код, я ещё очень парюсь о том, как называть переменные и функции, а потом чтобы это ещё по архитектуре выглядело хорошо.
Ага, спасибо Жёлтому за такой инструмент! Кстати, ещё недавно обнаружил там вещь, что при наведении на имя спрайта в коде, то по превью показывается спрайт - тоже крутая штука.
Расскажи, о своей структуре, кстати, о которой ты говоришь.
Она далеко не необходимая и писал её вообще для прототипа одного, который даже не на конкурс был (но использовал мысли с конкурсов, как и писал).
Суть простая - есть значение текущее и есть максимальное, подразумевая логику "значение от 0 до 100(например)". Так же есть методы is_full и is_zero, получить соотношение от 0 до 1 и отдельный метод для смены значения по дельте. Тогда ещё не было параметра с текстом, но тоже надо будет вписать.
Преимущество вписывания и "закрытия" прямого доступа к значению через методы в том, что можно как создать ещё одну структуру, так и переопределить эти методы для конкретного параметра. Хотя такого не планировал изначально, но возможно, когда-то это окажется полезным.
Забью место под коммент пока, чтобы попозже ответить
Но ведь этот ответ уже позже не прочитают, так как он не поднимет тему в списке и не попадёт в счетчик?
Дальше, с усложнением структур возникает ситуация чуть сложнее. Пронумеровал строчки:
С хинтом №1 все понятно, он будет подсказывать переменную Y после того как была введена переменная Shift с точкой.
Хинт №2 делает то же самое и я могу написать Shift.Y. и получу подсказку inactive. Однако теперь я могу написать еще и Y. отдельно и тоже получу подсказку inactive. Но что, если у меня есть другая структура содержащая в себе структуру со схожим названием (пример Move.Y.self = 2 и Move.Y.outer = 5)? В этой структуре нет поля inactive и такой подсказки быть не должно. Поэтому, запись №2 неприемлема.
Ну и попробовав решить эту проблему, с помощью хинта №3, оказалось, что такая запись не воспринимается.
Можно. Во первых, мне пришла на первой неделе миди клавиатура наконец-то. Заказал ее уже давно, а модель выбирал вообще за пол года. Выбрал Arturia, просто потому, что они кладут в комплект свой Analog Lab. Это целая библиотека различных синтезаторов (в основном, копии с реальных железок) и у каждого синтезатора целая кучища пресетов и все это работает как один большой VST-плагин.
DAW, в котором прописываю секвенции - Mixcraft 9. Да-да, не эблтон, не фрукты и даже не кубэйс. В Микскрафт самый удобный для меня интерфейс, максимально простой, без лишних нагромождений, и при этом функциональный. И второй момент у Микскрафта - отличная стартовая библиотека инструментов. И я понял, для себя, что ориентироваться в инструментах, это один из определяющих навыков для компьютерного музыканта.
Короче, на клавиатуре у ПК - полторы октавы. На миди клавиатуре - четыре октавы и кнопка быстрого переключения. Играть не умею и никогда не занимался. Процесс выглядит так:
Просто перебираю звуки в поисках подходящего, включаю запись и играю от балды что на душе лежит, попал не попал, пофиг, просто записываю минут 5. Потом слушаю и вырезаю удачные куски. Потом подгоняю их под единый темп. Потом редактирую мышкой кусочки секвенции, убираю лишние ноты, то что случайно нажал. Потом собираю из этого трек. Смотрю чего не хватает и ищу следующий инструмент.
Вроде того, что ты больше клипмейкер, а не музыкант. Музыка играется сама как рука возьмет, а потом монтируешь, что получилось.
Интересно! Узнал новые названия и как другие музыку делают. Для роботов я тоже "брал и играл", но не вырезал и вообще у меня на ухе медведь танцевал.
Играть на живых клавишах даже без знания всей музыкальности нахожу каким-то релаксирующим занятием что ли. То есть нажимаешь, звук идёт, иногда даже мелодия и как-то спокойнее становится от этого. Но это только если именно что "брянькать", а если прям надо музыку выдать, то наоборот раздражает, что ничего невыходит.
Потому, что он из сердца идет.
По моему, у тебя очень благозвучная музыка. За 20 минут на стриме не успел полностью вкусить, но еще попробую.
Жду очередной срач наследование vs композиция
да, хотел пошутить про то что поздно разбираться с наследованием когда все уже с него уходят, но с другой стороны - а что такого. У всех свои этапы роста (и мнение о том в какую именно сторону идет рост, а в какую - деградация). Я всю жизнь всё через наследование делал и ничего.
Не помню тут срачей на эту тему. Кто умеет программировать (не я), тут вообще, по моему, не пишет ничего.
Объем проделанной работы, завершенность и внимание к деталям, конечно, производят впечатление!
Есть такие платформеры, в которых всё происходит медленно, контроль над персонажем уменьшенный (иногда, например, вообще фиксированная длина прыжка и полностью отсутствует контроль над движением в воздухе), для прохождения крайне важна не только ловкость, но и заучивание уровня. Например, Black Thorn, Prince of Persia, Flashback, Another World. Такие игры выглядят более реалистично и самое интересное: получаются почти что пошаговыми.
Такой, на мой взгляд, получилась и Finem.
В случае с боем это вышло очень здорово. За счет общего низкого темпа и больших кулдаунов и у игрока и у противников, получается, что вы с врагами принимаете решения по очереди. В результате бой получился очень тактичным. Важнее, не быстро-быстро сто раз в секунду нажать нужную последовательность клавиш, а верно оценить расстояние, время, свои ресурсы и вовремя сделать нужное действие. Очень круто! Особенно в сочетании с вкусной озвучкой.
Однако, опять же очень важную роль играет заучивание. Большая часть боев проходится так: умер, запомнил, где кто в какой момент появлялся, проходишь заново и уже четко вовремя делаешь то, что нужно: оказываешься в нужном месте в нужное время, наносишь нужные удары с нужными паузами. Само по себе это неплохо. Бой превращается как бы в пазл, к которому ты путем смертей и перепрохождений находишь решение, а потом уже просто пальцами его исполняешь. И такие «паззлы» в игре встречаются интересные. Но!
Всё портят акробатика и вообще перемещение по уровню. Они работают по такому же принципу: совершил ошибку, выучил и прошел заново уже успешно. Но из-за такого подхода приходится множество раз проходить уже множество раз пройденную часть уровня и раз за разом просто пальцами исполнять уже давно найденные решения для каждого боя и каждой платформенной секции! Самое обидное, что и в этих местах ты продолжаешь совершать ошибки, но уже из-за того что торопишься поскорее пройти надоевшие участки.
Я не смог пройти уровень, в котором такие много-много небольших платформ, на которых появляется много плюющихся бошек и перекрестно в тебя плюются. Это, кстати, очень хороший пример. Само место с бошками — это очень интересный пазл. Мне не обидно было помирать там и не в падлу было пробовать пройти его снова и снова. Но каждый раз тащиться до них по давно обрыдшему уровню (который, поначалу, кстати, был интересен), ох... Бошки я прошел, а дальше по какой-то небольшой глупости помер и всё сначала. То есть более сложное и интересное место я прошел, почувствовал себя молодцом, а потом помер, как выражался Кутузов, на говне.
Потом у меня еще после перезапуска игры что-то сталось с прогрессом и меня почему-то отбросило на уровень назад. Короче, тут я игру бросил и поэтому не смог дочитать историю до конца, так что о ней сказать ничего не могу. А жаль. Может, немного позже возьму себя за яйца и всё таки пройду.
По-мелочам:
Если у главного героя сделать голову поменьше, он будет выглядеть реалистичнее и больее похожим на взрослого человека, что, на мой взгляд, будет лучше соответствовать общей стилистике игры.
Было бы круто, если бы на прыжок было несколько чуууть-чуть разных звуков. Или хотя бы воспроизводить один с чуть-чуть разной случайно скоростью каждый раз.
Спасибо за игру!
Спасибо за такой подробный отзыв! Очень рад, что в целом понравилось.
Я тут не прогер и не гейм дизайнер, а только рисовал кривоватый арт, но у меня в процессе тестирования игры возникли некоторые мысли по данному игровому процессу. Даже когда после н-ного прохождения игры я начиналал торопиться (а у нас всех всегда не хватает времени), то подыхал в какой-то глупой ситуации. И начинал заново. Пока меня не проскочила мысль, что надо просто бороться за жизнь, за каждый хитпоинтик, в каждый момент жизни этого маленького, туго цепляющегося за лестницы и кривовато нарисованного существа. Когда начинаешь ценить жизнь персонажа - играть становиться очень легко. Теперь ты берешь ответственность за его гибель, даже если условия кругом несправедливы/слишком хардкорны/неудобны/могло быть лучше. Даже если преодолел большую трудность и кажется вот-вот ждет награда - не стоит расслаблять булки. Надо грызть, царапаться и ноготками цепляться за жизнь. Хорошо тут можно начать уровень и попробовать снова, а жизнь серьезный ошибок не прощает. Такие вот ощущения от игры лично у меня.
Нормальный арт, чего ты нагоняешь)
Это вообще не нам судить)
Спасибо за отзыв, земляк. Крайне содержательная полезная инфа. Уже пока читал, появилось представление, о том какие чекпоинты нужны. Разработчику, конечно, это не очевидно, ведь он играет хорошо, у него нет проблем с прохождением, а сейчас понятно, что их прямо не хватает. Обязательно добавим.
По сохранению/загрузке все время у меня то перелетало на уровень дальше, то не долетало. Так я и не смог настроить нормально. Хотя на быстром тесте все нормально работало. Перепишу всю систему прогресса по другому просто, чтобы наверняка убрать глюки.
Если не считать, что тебя назад откатило, то тебе там оставалось один уровень пройти. Очень близко к финалу.
Плюсы
Минусы
Баги
Пока ощущение, что игра хорошая, но баланс, недоработки (появление врагов, нагромождение противников) просто отбивает удовольствие. Можно сделать шаг (или «спрятать» за платформой ниже, пока сверху появляются руки с клавиатурами), дождаться когда к тебе по одному подходят и вырезать. Динамика специфическая.
Спасибо за отзыв и особенно за баги. Баг с белым спрайтом вообще никогда не встречался, остальные мне понятны. Про урон турелью из-за экрана, это конечно потребует больше сил, чем хотелось бы, чтобы исправить. Но так или иначе, нужно исправлять. Очень много минусов и это хорошо, т.к. это способствует улучшению игры. Такие моменты как с турелью, это уже тонкости. Ты просто не думаешь о них, как о чем то плохом, пока разрабатываешь. Если захочешь допройти, надеюсь не попадется баг с загрузкой предыдущего уровня. Рад, что плюсы у игры тоже нашлись. Аригато.
Ну, честно говоря... Первые кадры меня конечно купили. Интересная такая сцена, пафосное дарк-фентези окружение + реалистичные цели героев с простыми характерами = классное сочетание. Враги тоже сочные, когда начинаешь видеть в них разные компьютерные штуковины. Даже хорошо, что никто не обращает внимания на это несоответствие, не комментирует врагов, или что делание игры выглядит как зачистка данжа. Иначе говоря, два разных мира, живущие одной жизнью.
А вот с игровым процессом всё похуже. Довольно странный выбор кнопки для прыжка, и очень топорный игрок. Ну даже если судить по анимации ходьбы, он должен двигаться явно быстрее, а так у него ноги проскальзывают.
К тому же я сперва не понял, почему я дохну от падений в ямы. Вообще не видно зелёной жижи на дне.
Ну и прыжок повыше бы, и сам уровень постройнее. Я вообще не понял, куда мне идти, потому что повсюду будто бы тупики. Пошёл вправо - там обрыв, через который не перепрыгнуть. Ну ладно - иду вниз. Там прошёл в левую часть, стал уже прыгать по кирпичным стенам в воздухе, и тут не лады - не смог запрыгнуть на выступ. Хотя, казалось бы, игрок совсем чу-чуть не допрыгивает. Я решил, что наверно это не тот путь, по которому я должен идти, и спрыгнул вниз, оказавшись в самом начале. Пошёл опять к обрыву и вниз. В итоге пробежал ещё один круг и, устав, не понимая куда идти, выключил игру. Подозреваю, что я не продвинулся ни на йоту, поскольку ни одного диска так и не встретил (диск кстати клёво нарисован, видел его в катсцене.)
Самая последняя из претензий - это грамматические ошибки и неказистость текста в начальном диалоге. Вот эту шутку про дни в секунды и года в будистские циклы я бы прошлифовал, подобрал бы слова поточнее, ну то есть постарался бы построить действительно красивую речь. Впрочем эта претензия на саму игру мало влияет, да и в моей игре "Про закат" с текстом имеются такие же проблемы.
Игровая задумка ведь действительно могла бы работать, если бы не перечисленные выше проблемы :(
Там можно спрыгивать сквозь платформу вниз. Это может быть не очевидно, т.к. работает на кнопку вниз + кнопку прыжка. Это мы тоже будем исправлять. Забавная статистика, что игроки, которым не нравиться прыжок на кнопку "С", так же испытывают проблемы со спрыгиванием через платформу. На трехкнопочном геймпаде от Сега Мегадрайв, прыжок всегда находится на крайней правой кнопке, которая по совпадению так и называется "С", но для любителей пк-гейминга, прыжок переедет на более привычную для вас "Z". В общем-то, тебе на блоках с кирпичами оставалось только спрыгнуть вниз. Наша вина, что нету обучения.
Рад, что понравились враги и катсцена. А как бы ты перефразировал диалог о временных циклах? Я не очень силен в написательстве и не особо различаю, где выразительный слог, а где не очень. Если есть мысли, прошу в личку. Спасибо за комментарий и что поиграл. Жаль, нельзя постконкурсную выкладывать раньше срока.
Графика смотрю от конкурса к конкурсу примерно в одинаковом стиле и цветовой гамме. Но графика норм. Музыка тоже более-менее подходит. Диалоги неинтересные. Читать скучно. Сама идея игры про конкурс как мне кажется тоже весьма не очень.
Геймплей - застрял на экране где число 22 слева. И подняться назад чтобы идти вправо не могу и идти влево нельзя. То есть перезапускать опять игру ?
Я конечно не знаю всей задумки, но хотелось бы какой-то более понятный геймплей или хотя бы возможность выйти из тупика. Думаю игроки не будут перезапускать ради того, чтобы начать заново.
К сожалению какой-то особенной идеи в игре не увидел. Да игра есть. Но на этом точка. Не знаю - может дальше там интереснее, но попасть туда не смог (((
Мой вердикт: однообразная и скучная игра. Интересно что даже вдвоем не смогли сделать хоть капельку, чтобы было интереснее играть.
Я это все пишу не потому что просто хочу выставить вашу игру в не самом лучшем свете, а потому что надеялся - суда по скриншотам, увидеть что-то более захватывающее.
В данном случае лишь попытка что-то сделать. Посмотрите на игру Хейза. Вот она мне понравилась намного больше. Я даже видео про неё снял. А в вашу и играть не хочется - там особо и проходить то нечего и видео снимать тем более.
Да. Опять какой-нибудь чел тут напишет про меня, что я КАПЕЦ КАКОЙ ТОКСИЧНЫЙ.
Ну ок. Вот отзыв в таком виде, как если бы писал какой-нибудь не токсичный чел )))
Графика супер ! Геймплей улет !!! Музон круть ваще ))) Упал и застрял. Не могу выйти. ПАМАГИТЕ !!! ))) Вообщем все круто игра супер-здоровская так держать!!! Удачи в развитии.
Такой отзыв лучше ? ;)
Просто на самом деле про вашу игру особенно нечего писать. Нет там ни сюжета (рассказ ни о чем). Ни геймплея (имею в виду интересного). Сама по себе игра и атмосфера унылая и соответствующая цветовая гамма.
Вообщем все как-то уныло, однообразно и никакого позитива. (((
Не хотелось бы заканчивать на такой ноте. Поэтому напишу, что я бы изменил, чтобы игра стала лучше: сделайте более веселую цветовую гамму, музоны поэнергичнее и веселее, интересный сюжет (почитайте фантастику что ли). Когда в голове нет никаких идей, то наверное стоит посмотреть какие-то чужие игры и может что-то взять на вооружение. Поучиться у других.
Сейчас вы варитесь что называется в собственном соку. Уже который конкурс у вас примерно одинаковые игры. Да. Жанр разный. Но графон унылый, музыка унылая, сюжета нет.
КАПЕЦ КАКИЕ УНЫЛЫЕ ИГРЫ. Но атмосфера есть !!! )))
Спасибо за отзыв. Ценный комментарий, который совпадает с мнением большинства игроков. Мы будем исправлять, обязательно.
Рубель на стриме вдохновил дать игре второй шанс. Прошёл.
В целом моё мнение не сильно поменялось. Диалоги вроде занятные, а геймплей всё так же так себе. Персонаж слишком неуправляемый. Лестницы - это кошмар. Предпоследний уровень - адище. Застряд нан ём надолго. Нельзя было что ли чек сделать после платформ со стрелками? Менеджмент патронов неплохо сделан. Даже левелдизайн не так уж плох. Лестницы только бесят.
Спасибо, очень приятно. Уже все самые грубые вещи поправили - моушен, лестницы, чекпоинты. Распространять открыто не могу, поиграли только люди, обещавшие, что голосовать не будут. Была бы демка заранее, может быть поправили бы, но физически не успевали. В целом, по ошибкам дизайна все об одном и том же говорят. Но сейчас свежий билд уже не хочется бросать на первом уровне из-за сложности и кривого платформинга. В любом случае, будем допиливать.
Если на гамаке делаете, к Кситу можете обратиться - он на консолях издаст в следующем году. После допила получится неплохая штука, думаю.
Ну нет. Никогда в жизни. Там эти любители ачивок ее будут только ради ачивок потреблять. Не для них моя инди ягодка цветёт. Мы в Falcoware пойдем, уже договорились, что возьмут. Обещали золотые горы поднять.
И аптечек сильно не хватает прям. В принципе, с аптечками можно и без доп-чеков.
ИИ противникам бы подкрутить. Собак сложно хантить с платформ, а зомбаков с лестниц. Они всё время агрятся на ГГ так что окна толком нет чтоб спрыгнуть/залезть и атаковать.
Ну и сама сложность для меня в целом норм. Как понял механику револьвера, первые три уровня пролетел. Если персонаж будет отзывчивый то играться будет приятнее и сливать попытки из-за этого не будешь.
У вас очень круто передано ощущение планирования. Этому дать три удара, получить патрон, всадить тому, добить его ближней атакой, сохранить патрон чтобы снять стрелка сверху. Вот это классно получилось.
Спасибо за момент с ИИ. Собираю как раз такие мысли. Ощущение планирования вероятно потеряется, таких хардкорных игроков уже днем с огнем не найдешь. Но в целом, может будет еще тест прям сильно допиленной версии.
Прошел до четвертого уровня, дальше не смог. Комментарий будет именно про конкурсную версию, т.к. читать все комментарии и посты уже попросту нет времени.
Финэм вышел довольно жестокой игрой. Именно жестокой - и таковой её делают тугость в управлении и физике. Управление героем вызывает удовлетворение, когда у тебя всё получается, но в большинстве случаев игровая логика и механика настроены против тебя.
Тебя будут больно колошматить, потому что в этой игре неуязвимость длится меньше секунды. Если ты сделал неправильное решение и спрыгнул не в ту сторону - игра накажет тебя щедрым откатом прогресса ввиду отсутствия чекпоинтов. Я долго не мог понять каких противников бить каким оружием и как они соотносятся по урону и ХП - сказать честно, я до сих пор не до конца понимаю как работает боевая система. Сама задумка со стаминой хороша, но плохо, что исчерпав её ресурс ты становишься просто безоружен перед противниками. А они будут безжалостно таранить тебя на такой скорости, что отреагировать у тебя не будет и шанса.
Очень неплохая графика! Да, выглядит она немного по-любительски, но сделана с душой и добавляет атмосферности. За дизайн врагов ставлю пятерку с плюсом, хотелось бы, чтобы это было лучше обыграно в сюжете. В целом я в восторге от проработанности отдельных деталей игры, хочется чтобы финальная полировка затронула остальные аспекты игры в том числе.
P.S. В процессе прохождения были разбиты клавиатура и мышь, без рофлов. Кажется, не стоило садиться играть в игры, да еще и в столь хардкорные, пока не закончился депрессивный эпизод, м-да...
И зачем только вы позволяете себе депресировать, да ещё и клавы ломаете....
Хотелось бы, чтобы это всё зависело от меня, конечно, но депрессия немного не так устроена :D
На клавиатуре на самом деле по большей части пострадала только одна кнопка, наушники пока замотал изолентой и нормально. Так что сильно никто не пострадал.
Я всегда считал что зависит, ну ещё от питания и режима сна =)
Приношу извинения за сломанную периферию. Не очень понятно, когда ты разработчик и думаешь, что игра слишком легкая, а на деле она неимоверно сложная, просто ты привык. Думаю, что мы обыграем в сюжете врагов как-то, спасибо за совет.
Нет проблем, тут точно не вина игры или авторов. Игра наоборот очень крутая, жалко что сложная.