Мелкие исправления. И пара маленьких этапчиков.
Версия 113
архив исходников 11 мегабайт
v114 (src)
Внедрил генератор лабиринтов
на основе этой обучалки
Я буду использовать генерированые лабиринты для псевдо-шахт.
Копаем каждый тайл, кроме бортов - находим три алмаза, и это - победа
над псевдо-шахтой - можно включить игроку пасивный доход руды или древесины.
Сейчас, лабиринт скучноватый и лёгкий - ранения лиш за бодание бортов.
Потом добавлю в шахты породители пулек и осколков - будет веселей.
slatazan
опять ничего не работает
запиши хотя бы видео с геймплеем
старая таки запустилась, прошел 5 метров уперся в стену. нажимал все кнопки, никакие подсказки не вылезли.
прыжок не пробелом, неудобно.
Mira
Большое спасибо за внимание, и за скриншот :)
Меня удивило, что идёт запрос скрипта по имени "Ni1",
потому-что у меня такого нет.
Там должно быть обращение к скрипту по имени "g1", в котором нужные функции есть.
Надо подумать, как реагировать на такие ошибки.
Возможно, это из-за того, что оригинальный скрипт назван global.gd,
а редактор мне предложил дать короткое имя, и это имя он мог исказить
на другом компе по каким-то причинам.
// прошел 5 метров уперся в стену
Ну и нормально - не трать своё время.
// прыжок не на той кнопке
Настало время сделать пере-назначение кнопок :)
Спасибо за мотивационный пинок. гы-гы.
// видео
Когда-нибудь запишу
Так.
Догнал, что на скриншоте напечатано "NiL".
Тоесть, глобальный модуль тупо не прогрузился, и остался нолём.
Наверно, не найден путь ...
Возможно, запуск из архива, без распаковки в явную папку.
Вобщем, это не сильный баг - если школьник захочет, то распакует,
и даже сам залинкует глобальный модуль.
Линковка всегда брыкается, прям хоть всё в одном файле кодируй :)
slatazan
ващето я разархивировал иначе как бы я туда гудот.ехе положил.
а по кнопкам сделал бы WASD и пробел как у всех, ну удобней же.
тем более правую руку занимать, может я порно смотрю параллельно.
Видео о знакомстве с движком Godot-3.
видео-обучалка
Что внутри видео..
В фоне, видно сайт движка, на весь экран.
Открыто стартовое окно движка - управление проектами - список недавних
проектов. Можно кликнуть Import, справа, и поискать файл проекта,
которого нет в списке (например, недавно скаченый).
Автор говорит, что достаточно просто сделать игру, как для _дэнди.
И будет серия уроков, но сначала, малое превью.
В фоне, видно окно редактора Годот
= панель FileSystem, слева (дерево папок, и содержимое папки, внизу).
= панель Scene, справа, наверху (дерево из элементов этапа).
// элемент (узел, node) игрока.
// элемент TileMap (геометрия этапа, из плиток).
// и остальные - это враги.
// Значок киношной хлопушки - означает, чужой элемент внутри этапа.
// Тоесть, менять чужой элемент надо, как отдельное дерево элементов,
// и во всех подобных _киношных_хлопушках будут видны изменения.
= панель Инспектор, справа, внизу - там выделена базовый элемент дерева
этапа, и поэтому пусто - лиш свойство _скрипт, печатает _не_назначили.
Солирует окошко с игрой. Если слегка подвинуть это окно наверх, то
станет видно нижнию часть редактора - называется Output. Там
пропечатывают мелкие ошибки, и результат вызова функций print,
или print_debug (напечатает и адрес, с которого была вызвана пропечатка).
В окне игры, видно геометрию этапа (узел-элемент TileMap), и почти
все другие элементы этапа - игрок, слева, и условные враги - справа,
в зелёных кепках (а глав-герой, чиёрт, в короне).
(царь, царь, очень приятно, я - царь).
По ходу демонстрации игрового процеса, автор стреляет, и укладывает
зелёных врагов спать. Можно заметить, что для камеры не выставлено
свойство limit_bottom .
Дальшэ, немного водички, и автор намекает, что надо зайти на сайт
https://godotengine.org/
и почитать, что движок безплатный, и процентов с продаж не требует.
Скачивай, разархивируй в удобную папку - запускай - установка не нужна.
Сразу увидиш то окно _управление_проектами.
Скачай отсюда какой-нить демо-проект, разархивируй, и через кнопку
Import, найди в демо-проекте файл project.godot ...
Однако, автор показывает, как начать свой проект, через кнопу New project.
Нашли папку для всякого хлама, и создали там новую папку (create folder),
и стала доступна кнопка внизу.. Create & Edit.
Дальшэ, у автора мутный переход к актуальному окну редактора сцен,
где он кликает, наверху, по 2D, и лезет в Project Settings,
где ставит галочку Pixel_Snap, которую я не рекомендую ставить,
пока нет никакой графики. Мои текстуры вели себя плохо - я отключил
эту галочку, и мои текстуры стали плавней (но я не специалист)
(я использую фильтрацию-размазню, у текстур для TileMap).
После настроек проекта, автор нажал плюсик, справа, в дереве узлов,
чтобы выбрать базовый элемент (корневой узел сцены).
Node2D это хорошый узел для базовых, и промежуточных элементов игры.
Автор изменил название узла, и полез в меню (слева, наверху) сохранять сцену,
и в окошке, новое имя базового узла было подставлено, как название сцены.
При попытке пробного запуска игры, появилось окошко, и навязало автору
выбрать _стартовую_сцену_проекта - он выбрал файл единственой сцены.
Было показано пустое окно игры. Это нормально.
Подобно браузерам, сцена представлена _вкладкой, с названием, и крестиком
для закрытия, а справа - есть плюсик для образования _новой_вкладки (сцены).
Автор кликает плюсик, чтобы создать префаб _модельки_игрока,
который потом внедрим в первую сцену, которая, как местность.
Автор акцентирует, что важно избирать узлы (ноды) с окончанием _два_дэ.
Цвет значков - важная деталь _совместимости узлов.
Кинематик_боди это правильный узел для персонажа со свободным поведением.
// Ригид_боди - это передача прав на движуху персонажа внутрь физ-движка.
Переименовал узел, и промазал потом - надо кликать на значок, слева
от названия узла, чтобы выбирать узел (а то опять в название залезем).
Если узел выбран, то нажатие плюсика (или звена цепочки, рядом) будут
трактовать, как добавку узла в отмеченый узел - добавка _чилда
(добавка дочернего узла) (выбраный узел - это _парэнт).
Был добавлен узел _спрайт, но в папке проекта совсем мало файлов,
и нет картинок (текстур). За кадром, автор отметил папку с текстурами,
которую скачал-распаковал, до этого, с безплатного сайта
https://opengameart.org/ (нажать Browse, и кликнуть строчку 2D art).
Переход в папку проекта, во внешнем браузере файлов - пасте-вставляем,
и видим, что папка с текстурами добавлена. Как только редактор Годот
получит фокус от опер-системы, то он проверит владения проекта,
и обнаружыт, что появился каталог, который в проекте не фигурирует,
и надо сделать автоматический импорт всех ресурсов каталога, которых
он сможт _загрузить (форматы текстур должны быть привычными, ходовыми).
Автор копается в новой папке проекта, и перетаскивает кадр текстуры
на свойство _спрайт.текстура.
Я рекомендую кликать на это свойство, и выбирать файл с текстурой,
потому-что далеко таскать с одного края экрана на другой. гы-гы.
Конечно, авто-импортёр внедрил умолчательную инфу про нашы текстуры,
и среди этой инфы там указано _размазня_фильтрация.
Поэтому автор выделил все спрайты в папке
(клик по первому, и шыфт-клик по последнему = все выделены),
и выбрал пресет 2D_Pixel, и сделал Ре-Импорт - пикселя стали чёткими.
Сохраняем сцену с префабом _игрока - файл появился рядом с первой
сценой. Переключаемся на первую вкладку браузера ... на вкладку
редактора, и жмакаем звено цепочки, под названием панели (Scene),
избираем файл префаба игрока, и добавляем ...
Автор показывает правильный вариант добавки префаба - надо проскролить
на нужное место (например, зажав колёсико мышки, двигать мышку),
а потом, зажать левый клик на нужном префабе, двигать мышку в центр
основного окна, и отпустить примерно на нужном месте. Так мы добавим
узел (элемент сцены), и сразу выставим ему примерную позицию.
// Можно нажать стрелочки клавиатуры, чтобы подправить позицию.
// Однако, важно сначала выделить нужный узел, а то двинем не то.
// Хотя, есть строка меню Scene/Undo
// Лично я, добавляю префабы через клик по звену цепочки, потом лезу
// в свойства нового узла (Инспектор/Трансформ.позиция), и выставляю
// примерные числа, опираясь на линейки по бокам основного экрана.
// Потом, подправляю позицию стрелочками - мне так надёжней.
И тут, автор показал, что можно запретить дочерним узлам принимать
участие в _избирании_от_клика. Вот я старый дурак - надо применить
эту хитрость в своём проекте. гы-гы.
Ну всё, видимо за этим я и смотрел нубо-обучалку. Всем удачи :)
Автор добавил скрипт, и сказал, что потом пояснит,
а пока, надо тупо повторить его пропечатку - там всё логично.
// уроки копи-пасты - источник многих багов. гы-гы
v115
Архив содержит готовые файлы для винды и линукса, чтобы сразу заценить. В архиве есть исходники скриптов и рисунков.
// --- что было сделано..
1.
У меня (у автора демо-игры), файл global.gd успешно входит в работу.
Но я видел скриншоты, где этот важный скрипт не смогли отпарсить,
и отбросили, как бракованый, оставив ему _нулевой_базис - при попытке
вызвать функцию из нуль-базиса, конечно будет фатальная ошибка.
Пока я не верю, что это из-за огромного размера скрипта.
Возможно, стабильности мешает другой огромный скрипт (zag_ifc).
Убрал скрипт zag_ifc.gd из списка глобалок (Project Settings: AutoLoad).
Создал ноду-сцену items/zag_ifc.tscn и влинковал туда zag_ifc.gd .
Изменилось начало функции global.gd: load_zag_tab_ijg() .
Возможно, это не исправит проблему, но выглядит логичней - загрузили
таблицу в спец-виде - перегнали её инфу в наш масив - стёрли таблицу.
Если очень надо, то всегда можно переносить код глобальных функций
в локальный скрипт, чтобы ошибки линковки не мешали работе.
2.
Занялся проблемой пере-назначения кнопок управления.
Номерки кнопок сильно раскиданы (45, 16777237).
Не найдена функция доставания названий кнопок.
Поэтому надо вручную это пропечатать.
Часть кнопок не будет принимать участие в пере-назначении управления.
ESCAPE, ENTER, Arrows - стабильные кнопки, привязаны к явному сигналу.
F1-FX, Print ... Lock .. Break ... Launch - не хочу связываться с ними.
Свобода - разным сигналам можно выставить одинаковую кнопку.
Пока нельзя выставить осевые сигналы, на джойстике.
Смена сигнала "старт-пауза" можт потребовать два захода пере-назначения.
Не работают букво-клавишы, если включен язык, кроме инглиша.
3.
Перенос кода t_uprav2 в отдельный файл --> uprav.gd
// tog_shoot_k подобные свойства тож туда отправились.
При этом, оставил старые глобальные вызовы g1.sig__move_left() и подобного.
Тоесть, не надо исправлять приставку или название функций.
4.
Lift.gd
Lift_dmg.gd
Внедрил потенциал вариативных пауз для движухи
move_type__climb_to_motion, и обратно.
5.
Внедрил индексы фраз msg_mix.txt в закладки (Лог, Управление, и подобное)
Детали локализаций..
$Menu/tab1_wnd/Label // EN // Подобные псевдо-знаки не требуют перевода.
$Menu/tab1_wnd/Label4 // PgUp <<< // Сюда поставлю знаки, но всё-таки
$Menu/tab1_wnd/Label5 // PgDn >>> // сделаю 2 весточки, в запас.
Функция start_screen__lang_upd, там изменился состав подсказки,
и укорочена фраза lang__sta_screen_hint5 для этой подсказки.
6. Талант пулемётчик - все тэстовые турели можно сразу потратить.
Выставил проверку turel_hot_wait, и поправил обнову этого свойства,
когда игрок добавляет хит-поинты в готовую турель.
Заодно, изменил правило пользования турелями - в пределах одного этапа,
их вернут игроку, кроме раненых. Иногда колизия у турели бракованая,
но с таким правилом нет проблем - поставь турель снова.
// Мутный талант ijg_abil__smart_hand _хитрая_рука надо заново придумать.
7. AreaBox.gd v113 == испортился сенсор для огне-патронов, и ледышки
стали реагировать на простые патроны. Я исправил-вернул старую норму.
v116
https://yadi.sk/d/L7aMJ-SRHOVRFw
// --- что было нового для версии 116..
1. gt.crt_tet_game начало этой функции стало контролировать доступ к
усилению талантов, учитывая откат __find_item( g1.ijg_tet_pult) .
Это позволило не убирать сенсор AreaBoxTet2, при загрузке этапа st018 .
2. Сместил квадраты внутри текстуры textures/tjung_tile32.png
и вопреки названию, теперь там квады 64 на 64 пикселя.
Использовал текстуру в новом тайл-сэте (Tset_tjung.tres) (tjung_edit.tscn)
Создал этапчик st034, и там проверил новый тайл-сэт - нормально.
Сам этапчик должн быть деревней мирных дикарей (например, зелёные гоблины).
3. Создал набросок этапа st035. Там стена вьюнов закрывает обзор,
и абилка Просветка должна помогать, хотя вьюны местами прозрачны.
В середине этапа, в фоне, захотел сделать _разные_плитки, и настроил
генератор подземелий (отключил слой колизии) - результат меня устроил,
но алмазы явно не нужны.
Добавил свойство в скрипт platform/TileMapRand.gd
export var use_diamonds := 0
И если здесь ноль, то алмазы и ледо-камни не вносим.
Поэтому открыл старый этап st033b, и там поставил единицу в use_diamonds.
4. Сделал связку навигации..
enemy/kin_unit2D.gd
platform/nav_layer.gd
Стартуем игру, и тэстируем этапчик st035.
Робот оставлен рядом с меченым местом, где кое-как летают два спрайта,
и толкают робота, если он встанет у них на пути ...
Что я сделал, чтобы началось тэстирование..
Я добавил ноду nav_layer - там было нужное имя "TileMap".
Добавил texture_rect - растянул поверх нужных тайлов - отметил TileMap,
и навёл курсор в левый верхний угол texture_rect - вижу координаты тайла,
и печатаю их в свойства офсета nav_layer.tmap_x_ofs ...
Затем, вручную считаю количество тайлов по горизонатли и по вертикали,
которые попадают в texture_rect, и печатаю в nav_layer.tmap_w_area ...
После этого, можно стереть texture_rect, либо отключить ему видимость,
но оставить для наглядности ... Возможно, надо автоматически искать
чилда со спец именем, чтобы авто-обновлять свойства tmap_x_ofs ...
// ---
Стартуем проект внутри редактора Godot, и наблюдаем - тэстирование навигации проходит внутри этапа st035.
Два красных спрайта летают вокруг зеленых плато, на которых стоит робот.
// архивчик v117
https://yadi.sk/d/F80kj-CIzlYDuA
// --- v117
1. выправлена загрузка этапов..
{
include_scene_extra
поиск игрока был здесь, но понадобилось его видеть в конструкторе этапа,
поэтому перенёс поиск игрока в функцию.. _deferred_include_scene
Добавлена функция.. include_scene__prev_clear()
чтобы в ней собирать все указки, которые надо обнулять, при смене этапа.
}
2. Новая константа для лифтов (и для лифт-колючек)..
move_type__1_after_default_rand = -14
Это означает, что лифт, при загрузке этапа, можт включить себе движуху
к позиции motion, что подразумевает _другой_берег. Таким образом можно
создавать вариативность. Например, добавив лифту монетку - игрок
не знает, куда уехал лифт, и прыгает вниз наугад - вправо или влево.
Если угадал, то получит монету, и опору.
Вдобавок, мини-деталька для движухи move_type__original_demo
accum = 0.5 + g1.random_d10pm( 5) # при загрузке этапа, де-сихронизация
3. Сделал набросок этапа st036, и для него, версия TS_rock_x_ice.tres
где текстура из _декоративной версии, но есть колизия.
Когда дело дошло до лифтов, был обнаружн баг ожыдания.
Функция global.gd :: lift_move_type
if p.wait_climb_now > 0: # если не сточили ожыдание
p.wait_climb_now -= delta # убираем помаленьку, и прерываем.
return # v117 // забыл эту важную строку. гы-гы
4. Подправил текстуру green-jungle-mix2.png
чтобы края чуть лучше повторялись.
Все остальные не-стыковки надо комуфлировать отдельными спрайтами.
5. Сделал набросок этапа st037 (вероятно, здесь будет болотный бос).
6. Несколько новых текстур выбрал из бесплатных..
platform/Crate // яшик
platform/door_gla // красивая дверь.
enemy/canon_1_4 // пушка дикарей (сделать рулетку.. ядро или осколки).
enemy/EyesFlyesBlink_w32_fr16 // мотыльки-глаза (сделать социал-монстров).
7. Сделал набросок рюкзака (сумка), в которые накапливаем ключи, книги.
glob2_t.gd :: add_to_bag // find_in_bag
global.gd :: const ijg_key_dig_r = 209 # предмет-рецепт
global.gd :: const ijg_book_base = 213 # лирика про родную базу.
Возможно, в конце статьи, подсказка по линковке глобальных скриптов..
https://habr.com/ru/post/509144/
var g1_ = null
g1_ = get_node( "/root/global") # "/root/g1"
g1_.unit_take_gift_q( unit, 8, 2) # g1.unit_take_gift_q( unit, 8, 2)
// --- v118
1. Внедрил функцию свободной добавки предмета, и его количества.. { func unit_take_gift_q(unit, n_ijg: int, add_q: int): # global.gd if unit_take_gift_blocking( unit, n_ijg, add_q): return # если не заблокировали, то у нас валидный номерок n_ijg, ijg__val[ n_ijg] += add_q # и свободная прибавка-убавка add_q #--------- Вместе с этим, добавил отвил, чтобы триг-сигналы добавляли предметы.. #global.gd :: trig_sig: # ... elif TrigCase.TRIG_VAL_ADD == use_case: # ... elif to_name == "g1_res": # <---- изменить предмет от тригера unit_take_gift_q( get_player( ), val, ext) # if "val" as 8, and "ext" as 2, значит прибавим 2 алмаза. }
2. Занялся набросками горных этапов. Теперь вход в st051 требует Бур,
чтобы внутри можно было пройти в генераторный этап st051gen, а из
генераторного - надо сделать переход в st051fin, и для этого изменил
dig_diamond_chain_next (функция из файла glob2_t.gd)
и добавил функцию в том-жэ файле.. coin_exit__do
Теперь, умолчательный портал Coin_Exit, можно настроить, и генераторный
этапчик использует указаную там инфу, когда алмазы будут собраны.
Если автор не хочет добавлять игроку три алмаза, то можно их отнять,
оформив кейс на имя этапа, внутри функции dig_diamond_chain_next, либо
создать хитрые тригеры, которые отнимут алмазы - за попытку входа.
ВАЖНО.. тригеры не делают проверок наличия алмазов, и поэтому автор сам
обязан предусмотреть вариант, когда у игрока нет алмазов. Как обычно,
манипулируем деталями этапа, при загрузке этого этапа, и если нет
нужных ресурсов, то стираем ноды, которые будут использовать те ресурсы.
3.
Исправлен баг в скрипте fgr_tet.gd // line 462
# lines_max_once = lines_q # err
Исправлена функция glob2_t.gd :: add_to_bag,
чтобы синхронизировано добавлять предмет (в меню, и в масив ijg__val).
Теперь работает функция glob2_t.gd :: kraft_trig_ok
На старте, ресурсы выданы, чтобы протэстировать создание Бура.
Собери 2 линии сразу, и закончи зачистку - будет крафт бура.
Чтобы изменить требуемые ресурсы, надо менять числа в файлах типа
items/209.h
Если в строке 33 заменить ноль на двойку,
2 // res_wood
то рецепт будет требовать 2 древесины
(золотых монет рецепты не требуют - указана цена, если рецепт покупать).
Всего 6 ресурсов (6 соседних строк) проверяет функция kraft_trig_ok.
Если будет мало, то можно будет использовать 4 доп строки level_now ...
потому-что типаж (12) item_type__shem, подразумевает использование
любых строк файла под _чертёж, не взирая на условные названия строк.
Это опасный дата-драйв стиль, который уместен при создании прототипов.
// --- что было сделано..
1. global.gd
const te_skip_last_lines = 2 # v119
# Добавлены пустые строки, в конце, в стартовый лог-текст.
Эта константа принимает участие в паре функций, и позволяет видеть
последнию весточку в окне лога.
2. Добавил свойство в скрипты игрока (player.gd, player_kin.gd)
var pos_cast = Vector2() # отдаление от этой точки прерывает кастинг
3. Система предметов усложнилась - легко создавать баги.
Изначально, я хотел обойтись без рюкзаков и прочих сложностей,
но добавил псевдо-рюкзак, и понадобилось количество руде и деревяшкам.
4. 14 мест рюкзака - максимум - надо ужать набор предметов.
Книги примут на себя удар - некоторые предметы станут _страницами.
5. Изменил-облегчил условия st011.gd :: check_base_gift
Теперь за перекачку 500 опыта в базу - у робота будет 200 хит-поинтов.
6. Создал наброски некоторых этапов, чтобы обозначить пространство,
которое доступно (купить лом, чтобы с этой подставки прыгнуть в портал).
Суть такова, что игроку надо получить ключ (зелёный и красный),
и дойти до финального этапа каждого хаос-портала - эти два зачёта
отмечаем, и позволяем игроку доступ к новой порции этапов,
для которых пока рано делать наброски.
// Смысл хаос-порталов - мы пытаемся найти опорную крепость врага.
7. Делая st045, внедрил свойство DmgRay.gd :: limit_spawn,
и вариант порождения g1.spawn_preset__any_child_with_vel, где
подразумеваем чилда, у которого есть позиция и свойство linear_velocity.
И эту дочернию ноду копируем столько раз, сколько указано в limit_spawn
(либо порождаем бесконечно, если лимит, как ноль)
(но важно, чтобы порождаемая нода имела-бы механизм удаления из этапа).
8. coin.gd получила функцию _ready, и кое-какие манипуляции, при загрузке.
9. У меня, дебагер часто печатает error..
"Condition ' !area_in && !E ' is true"
Я смотрел исходник - там просто прерывание функции - можно игнорировать.
// ---
1. исправил скрипт coin.gd
{
func deferred_ready(): # v119
if rand_dup_q < 1:
if rx_max or ry_max: # v120 fix
position = priv_pos_rand()
}
Вдобавок, изменил принцип внутри функции priv_pos_rand(), и теперь
размах для новой позиции - строим не от ноля, а от изначальной монеты.
2. добавил обновление названия для предметов сумки (при смене языка).
3. добавил сумку для собирания эфектов (ядо-тикалки, бонус атаки).
Повтор принципа основной сумки, когда работает ячейка g1.ijg__val[ eff]
Тоесть, ноль внутри ячейки - робот испытал когда-то такой эфект, но
сейчас этого эфекта нет. А если ячейка большэ ноля, то это длительность,
в тысячных долях секунды..
if ijg__val[ eff_x] > 0: ijg__val[ eff_x] -= mult_int( delta, 1000)
Наслоение одного эфекта делать не буду. Если кому-то это надо, то
пусть сам добавит свойство eff_layers внутрь скрипта items/BagItem.gd
Тоесть, все динамичные свойства предметов надо в этот скрипт добавлять.
// эфект == предмет особого сорта.
gt.eff_bag_upd вызывают каждый кадр, чтобы длительность к нолю уводить.
4. Оптимизировал вне-игровой скрипт tool_tab_zag2.gd ,
чтобы он создавал понятный и компактный файл zag_ifc.gd
5. Внедрил работу соло-слота (g1.player_alt_atk__ijg), на примере бутыли.
Бутыль можно добавить в сумку, но из-за свойств, этот предмет
найдёт себе место в соло-слоте - реакция на использование - сброс,
либо особые события (костыли в скрипте этапа, или в глобальном скрипте).
6. Сделал набросок не-обязательной квэст-линии про кибер-лепесток.
ijg_kiber_flo_seed
ijg_kiber_flo_st021
7. Много мелких исправлений.
// ---
Новость - робот собирает бутылки ... для чего-то загадочного.
Тема в архиве.