Игра с нуля без мам пап и кредитов на GMS2. build_0_0_3
Гифка для привлечения внимания, на которой ничего не происходит...
Привет! Мне уже всячески рассказали, насколько кривые у меня руки... Вот она популярность! Погнали!
Итак, билд0_0_3. И reFUCKtoring!
Честно говоря это стало для меня неожиданностью. Вернее не сам рефакторинг, его-то я как раз ожидал (изначально всё начиналось, если кто помнит, так, что рефакторинг был лишь делом времени), а вот то, что назреет так быстро - нет. Как я уже говорил в пред. посте - основная проблема нодального программирования в ГРОМОЗДКОСТИ. Адовой, неподъемной громоздкости. В этом отношении GMS2 ещё и проигрывает той же UE4, где можно зафигачить всё более-менее наглядно:
и это реально - НАГЛЯДНО и более-менее понятно. В GMS2 же всё куда как хуже: парадигма расположения блоков в GMS - сверху вниз, в итоге в каждом действии у вас будет вот такая партянка:
как видно - всего десять узлов, а места занимает существенно больше. Тут есть несколько аспектов - в UE вы можете пихать хоть вдесятером... реализовывать сразу всю логику в одном блюпринте, располагая в двухмерной плоскости так, как вам лично будет наглядно. GMS2 честная целочка и пихать в себя позволяет только по очереди распределяет все действия на уровне свойств объекта, поэтому всё в кучу сложить не получится, а самое главное - отойти от вертикали вам позволит только ветвление условия, т.е. "башня" сохранится и станет только толще...
Честно говоря - я не очень уверен, что условия в нодальном GMS2 удобней и читабельней, чем в GML (game maker language):
но совершенно очевидно, что из-за своей громоздкости работать с ними - невозможно.
Итак, рефакторинг! Почему и что привело? Я уже показывал скрин obj_player - там я делал всё на уровне свойств объекта (create,step,collision, etc), что, как уже писал - не удобно с точки зрения того, что постоянно приходится переключаться между закладками и невозможно охватить части функции целиком. Поэтому у меня и встал вопрос: как это всё свалить в кучу, чтобы можно было сразу охватить всё, что происходит.
и тут я подложил себе большую свинью. В силу собственной невнимательности (я как-то сумел себя убедить, что добавлять свойства к объекту - какая-то сложная процедура, а не просто " obj_player.speed_bost = 1 ") я решил всё пихать в global. ... Тут со мной злую шутку сыграла память про типы переменных, типа глобал/локал... короче говно худшее! По-правильному - надо всё пихать в свойства объекта и передавать именно объект в любые другие места! По сути же - я делаю тоже самое! Но пихаю все свойства в объект "global", вместо того, чтобы пихать свойства плеера в объект плеера: "obj_player", в моём случае. Ну и как видно на гифке - листинг хромает. Например
if (keyboard_check(ord("S")) = false) && (keyboard_check(ord("W")) = false)
можно и нужно записывать как:
if !keyboard_check(ord("S")) && !keyboard_check(ord("W"))
Вообще нужно стремиться к мимимизации уменьшению кол-ва символов, в угоду скорости чтения и восприятия. Избавляться от лишнего и всё такое.
Второе худшее говно в представленном листинге, что я, по сути, ебашу функции непосредственно в условии. Т.е. все вот эти
lobal.speed_boost -= global.impulse_value/global.mass_value*global.bc*2;
global.vert_speed_axelerate = -global.impulse_value/global.mass_value*global.bc*2;
global.fuel_tank -= 2;
надо сворачивать в отдельные функции и лишь вызывать из кода, чтобы не захламлять сам листинг, а называть функцию как-то так: vertical_axelerate_increase, vertical_axelerate_decrease, left_axelerate_increase, right_axelerate_increase и т.д. И передавать в них как раз-таки объект, а в самой функции выковыривать из него то, что непосредственно нужно. А так как я - делать не нужно...
Ну и как я уже писал и повторю ещё раз - слезать с нодальной иглы надо так быстро, как только возможно, а лучше - ещё быстрее. Нодальное программирование - это костыль, который может помочь встать, но на костылях не побегаешь...
Так что после нодального представления прототипа - садитесь за рефакторинг и переделывайте всё в код. Это послужит хорошим упражнением для освоения навыков быдлокодинга, которые потом уже можно будет прокачивать в более-менее приемлемые програмистские скилы. Это, конечно же, неправильно - надо сразу учиться хорошо...
ну и текущее состояние:
добавил счётчики скорости с псевдографикой, указывающей направление движения, дистанциометр :D и бак.
з.ы. в посте про круговые диаграмы мне справедливо заметили про ущербность решения, которое я привёл, поэтому считаю своим долгом исправиться и выложить решение получше и с точки зрения производительности и с точки зрения пользователя... для затравочки...