Войти
GodotФорумДемонстрируем наработки

Godot4 :: Царство и капитаны

#0
22:33, 5 янв 2024
+ Показать


Тема для само-мотиваций. Буду делать версию-113.
И на долю этого номера - выпало пере-ползание на Годот-4.

// ---
Создать промежуточный годот-проект, чтобы частями
перекидывать старые скрипты, и сцены.
Брать лиш нужный код - исчезнут наброски и дубляжы функций.

Создать глоб-скрипты.. g1 и подобные,
чтобы использовать привычные глобалки.

Оформить нормальный годот-проект, и туда забрать успешные куски
промежуточного проекта. Нужно большэ наглядности.
Редактор годота, как редактор локаций, и реадктор юнитов.

Экшн-часть игры - наверно, будет три-мерной, с примитивами.
Нужно найти готовый пример, и его внедрить.
Шаговая часть игры - пусть остаётся дву-мерной, но надо соблюдать
класичную изометрию - обновить геометрию тайлов.


// ---
Шаговая часть..
t_unit --> tbs_u // или придумать дургое название.
Для масива заготовок - есть константа предмета - есть заготовка.
Одно из свойств заготовки - не обязательная указка на ресурс сцены.

И внедрить отдельные сцены tbs_u_captain, tbs_u_soldier.
tbs_u_boat можт содержать ноды верхних сцен.

tbs_town - сцена, куда не допускаем внедрение tbs_u_boat,
потому-что подразумеваем приватную линковку с невидимым отрядом.
Но при этом, чилд-ноды города - простые ноды солдат и капитанов,
которые подразумеваются для авто-линковки, в невидимый отряд.

Вероятно, масив клеток должн быть свойством tbs_field, как
личный масив клеток (переносим из глобал-модуля).
// Почерпнуть свойства из вар-филдов, чтобы это был
// гибкий вариант - поле для глобалки, и поле для боя.
// Хотя надо ешё думать - возможно, это две разных сцены.
Но подразумеваю, что нода, с клетками (приключение или арена),
можт-быть множэственая, и входит в состав ноды tbs_etap.
Тоесть, класичная пара поверхности и подземки, либо набор схем,
аля цепочка-или-метрошка.
// Метрошка - восприятие схем, как _все_сразу_грузим.
// Цепочка - телепорты в братскую схему, с выгрузкой текушей.

Вобшем, загружая этап, можно загружать все схемы, либо _первую.
И сохранка - для этапа - вписывает всё имушество этапа
(пачку обше-свойств, масивы клеток).
(старые подобия t_unit - прямо в масив клеток, как и было).

Сцена, внутри движка - остаётся главным стартером сценария.
Сохранка - лиш промежуточный файл, в юзер-папке, вне-проги.

// читая масив клеток, видим юнит - создаём ноду, и заполняем.
Типаж увиденого юнита: этап.ПОЛЕ.нужная_група.add_child( юнит).
ПОЛЕ - нода, которая образовалась, с шаблона, и в неё накидывают
содержымое, из файла сохранки. Когда встретим новое поле, то
создаём новую ноду поля, и теперь - читаем для нового поля.
// Перекидка отрядов, между полями - reparent.
// Например, это переход капитана в новую часть приключения.

Как-быть с принципом дубляжа юнитов, которые вошли в Арену ?
Считаю, что надо оставить старый принцип - дублировать юниты,
потому-что это правильней, учитывая правила игры, где можно
прервать бой, и этим - отказаться, как-будто не нападали.

#1
22:21, 6 янв 2024

Если будут картинки, облегчающие восприятие стихов - будет просто здорово.

#2
(Правка: 13 янв 2024, 20:09) 17:01, 12 янв 2024

Обзор тайлмэпки..

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

// --- мой отчёт знакомства с комплексной нодой TileMap..
(наверно, подобная пропечатка закрепляет изученое)

Создал пустую сцену, на основе Node2D, синия. Назвал tbs_map.
Добавил чилда TextureRect, и оставил пустым - сюда можно загрузить
скриншот, как фон, чтобы подстраивать _как_надо, а потом - удалить фон.

Добавил чилда TileMap - отличается от подобного, из Годот3.
Вкладка Инспектор - кликаем свойство tile_set, на слове <empty>.
Выбираем (кликаем) строку New TileSet, и кликаем, внизу TileSet,
чтобы переключить _нижний_экранчик. Кликаем плюсик, рядом с ведром,
выбираем "Атлас", и находим подготовленую текстуру, в папке проекта.
Отказываемся от автоматического нарезания тайлов.
Внизу, во втором столбике, слева - свойства атласа - выставляю там
размер своего нормального тайла (Texture Region Size).
// Не нормальный - из нескольких тайл-размеров,
// клик-растягивая, с зажатой кнопкой SHIFT.

Справа, от Paint, есть галочка ластика (Eraser) - тыкаем туда, и
кликаем по тайлам, чтобы убрать инфу об этом регионе.
Например, сменил размер, и надо убрать старую разметку - зажал Контрл,
и растянул рамочку - отпустил кнопку мышки, и стёрлось, что в рамочке.
Не забудь снова нажать на ластик, чтобы отжать его галочку-статус.

Как нормальный результат - должны быть кликнутые светлые регионы,
с белой рамочкой - разметка назначеных тайлов.
// Я выбрал построение текстуры - в один горизонтальный ряд.

Вкладка Инспектор, верхния строка, над строкой Filter свойств - кликаю,
и выбираю строку TileSet - вижу tile_shape - ставлю Hexagon,
и меняю размер клетки (можно его потом подстраивать, покрасив тайлы).
Чтобы вернуться к TileMap - выбираю корневую ноду, и затем снова
кликаю ноду тайлмэпа. Ну либо кликать <previous edited obj>.
Но наверно, правильней - кликать по значку, и по слову TileSet, не
задевая стрелочку вниз - клики открывают и закрывают саб-окно ресурса.

Порисовал немножко тайлами - они плохо пересекаются.
Добиваемся, чтобы Инспектор показывал свойства TileMap,
видим яркую групу "layers" - раскрываем её - кликаем "y_sort_enabled",
распахиваем групу "ordering" - кликаем, и здесь - "y_sort_enabled".
И у меня, сразу наладилась картинка - тайл-спрайты нижней строки,
начали накладываться на верхнию строку.

Важная добавка - в групе "layers", есть плюсик "Add Element".
Я его пару раз нажал, и теперь, тайл-мэп несёт в себе три слоя.
// В каждом слое, я выставил галочку "y_sort_enabled", на всяк-случий.
Не забываем переключать слой, в который красим тайлы - при этом,
тайлы будут тёмными - кликай соседнию ноду, чтобы посмотреть на
результат покраски тайлов, и снова кликай ноду тайл-мэпа, чтобы
продолжать вносить тайлы в ячейки.
// Есть переключатель, рядом со сменой слоя, но соседния нода - привычней.

@onready var tile_map := $TileMap # // не забываем оптимизировать - внял совету, спасибо

func _input( event): # // скрипт корневой ноды.
#{
  if event is InputEventMouseButton:
    # // if event.button_mask: # if Any_Mouse_Button:
    # //  pass
    if event.button_index == MOUSE_BUTTON_LEFT:
      if event.pressed:
      # // Это момент нажатия - можно не отпускать кнопку, и сдвинуть, но
      # // нажатие ужэ случилось - забираем первую прицельную позицию.
        # // var pos2 = get_global_mouse_position()
        var k = tile_map.local_to_map( tile_map.get_local_mouse_position())

        # // get_cell_source_id // atlas // набор тайлов.
        # // Слой _нуль, с текстурой, где тайлы, в одну строку, и
        # // значит, лиш хикс можно сравнивать с константой поверхности.
        var atlas_xy = tile_map.get_cell_atlas_coords( 0, k)
        print( "pressed tile: ", atlas_xy.x)

      elif not event.pressed:
      # // Момент отпускания кнопки. Если нажали, двинули мыш, и отпустили,
      # // то учитываем сдвинутую позицию, в момент отпускания кнопки.
        var pos2 = get_global_mouse_position()
        var v2i = tile_map.local_to_map( tile_map.to_local( pos2))
        print( v2i)
        # // сдвинул тайл-мэпку, вправо - пропечатка правильная.

#}


В начале видео, автор создаёт вариант организации - атлас, как один тайл..
( tile_map.get_cell_source_id, как разница между поверхностями)
https://www.youtube.com/watch?v=zZ3VxvlDrnQ

#3
0:25, 13 янв 2024

slatazan

Ты в курсе, что такой вот $TileMap оператор  разбросанный по функциям - это гамнокод, который при каждом вызове ищет в дереве ноду по имени?
Вместо того, чтобы делать это один раз, например типа

    onready var tileMap := $TileMap
#4
(Правка: 20:08) 19:55, 13 янв 2024

Der FlugSimulator
Спасибо, я не знал.
Я думал, при экспорте (аля компиляция), будет замена $TileMap на местные указки.
Теперь - надо соблюдать он-рэди :)


// ---
Трэш-затея:
Итог испытания - сомнительная анимация моря, хотя можно пробануть
разные варианты шума - почти моно-тон.
Вместо g2.random, использовать прокрутку (0, 1, 2, 3), если найти
4 профи-кадра для имиты моря.

const tm_sea_wait_full = 0.042 # длительность кадра, при 24, в секунду.
var tm_sea_wait = 0.0
var tm_sea_m = null

@onready var tile_map2 := $TileMap2

#// g2.land__water_first первый, из четырёх кадров - шум синего цвета.


func _ready():
#{
  tm_sea_m = tile_map2.get_used_cells_by_id( 1, 3, Vector2i( g2.land__water_first, 0))
  #print( tm_sea_m)
#}

func _process( delta):
#{

  if tm_sea_m:
    tm_sea_wait -= delta

    if tm_sea_m.size() > 0  and  tm_sea_wait < 0.0:
      tm_sea_wait = tm_sea_wait_full
      for i in range( 0, tm_sea_m.size()):
        var v2i = tm_sea_m[ i]
        tile_map2.set_cell( 1, v2i, 3,
        Vector2i( g2.land__water_first + g2.random( 0, 3), 0));
      #for
  #

#}
#5
0:44, 14 янв 2024

slatazan
> Теперь - надо соблюдать он-рэди :)

slatazan
> Я думал, при экспорте (аля компиляция), будет замена $TileMap на местные указки.

Какие еще указки?
Будет замена на get_node("TileMap")

#6
23:12, 29 янв 2024

Капля за каплей продвигаю новую версию.
В основном, залип на шаговой части.
Можт-быть сделаю картинку шаговой части чуть красивей.

https://godotengine.org/asset-library/asset?filter=SirRamESQ&cate… &sort=updated


// ---
(Пре-инфо) Смарт-шэйп-нода оперирует рёбрами - талия.
Представь песочные часы - узкая серединка часов, будет поставлена
на технический отрезок, между точками "формы".
<1>--н--<2> // пере-мычка буквы эн, поставлена на отрезок.

Я делаю обводку, в прямом смысле (об вожу клетки воды).
Поэтому, моя текстура - моно-тон, плюс хитрый альфа-слой, где
основную роль играют пикселя верхней половины - они, как берег.
Чем вышэ - тем прозрачней, начиная с не-прозрачной середины.

0.0 // верхния строка пикселей - прозрачна, полностью.
0.3
0.7 // числа примерные.
1.0 // совсем не-прозрачно
0.5 // быстрый спад
0.0
0.0
0.0

После пробы - я увеличил высоту текстуры до 16 пикселей.


// --- GIMP2
Грузим нужный сэмпл-кусочек (цветные пикселя воды, не-прозрачные).
Меню (наверху) Цвет.. Составляюшие.Разобрать
Чтобы получить три слоя.
Моя версия гимпа - создаёт новый файл, с нужными слоями.
Добавляем новый слой, называем alpha, рисуем туда, свои пикселя.

Цвет.. Составляюшие.Собрать - выбрать RGBA.
// У меня создаётся ешё один файл, где всё соединилось.
Экспортируем текстуру, как PNG, и переносим в папку годот-проекта.
// После этого, подправленые пикселя, экспортируем в готовый файл,
// пере-записывая, а годот - сам обновляет, видя отличие даты сохранения.
Так можно выправлять пикселя, запустив игру из редактора.

#7
23:12, 29 янв 2024

// ---
Внутри тэст-проекта, создал ноду SS2D_Shape_Closed

Если нужна пила, и есть текстура зубчика, тогда, чтобы текстуру
не растягивали, а ставили зубчик за зубчиком - находим раздел
CanvasItem, раскрываем групу Texture, и там для свойства "repeat",
выставляем вариант Enabled. Там рядом - можно сделать острые пикселя,
если выставить filter, как Nearest.

Раскрыл групу ссвойств Material, клик по знаку кубика, в первой строке
(shape_material, который сразу создан).,
игнорирую все строки fill_ ., клик по слову Array[SS2D_], чтобы
увидеть, и нажать кнопку "Add Element". Появилась строка <empty>,
жму её, выбираю строку "New" - создали контэйнер, в пустой строке,
и можно сюда кликать, на знак кубика, чтобы открыть саб-ресурс,
в сиреневой рамочке. Здесь, установки для первой авто-кисти, для бортов.
Клик на <empty>, выбираем строку "New", и кликаем на появившыйся кубик,
справа от "edge_matarial" - раскрыли фиолетовый саб-ресурс - там, клик
по верхнему свойству "textures", на слове Array, чтобы увидеть,
и нажать кнопку "Add element" (подразумевая добавку слота текстуры).
Над кнопкой плюсика, кликаю по <empty>, и выбираю слово "Load",
чтобы найти нужную текстуру (png или типа того).
Отключаю галочки, чтобы не мешались.. use_corner_, use_taper_.
// Иначе - будут белые квадратики, на прямо-угловых точках.

Остальные свойства "textures_x" - не трогаю, но там подразумевается
тонкий тюнинг, для углов и подобного.
Справившысь с практикой добавки первой текстуры - наверно, можно
посмотреть обучалку, и освоить остальные хитрости плагина.
После создания заготовки, настроив текстуры, делаем копию ноды, и ...
не забываем раскрыть групу свойств Геометрия, и кликнуть, там,
по местной Execute - будет вопрос - отвечаем, ДА, чтобы разлинковать
старый набор точек. Но если эту смарт-ноду планируем использовать,
как _шаблоновый_кирпич, который мы наштампуем везде - не надо
делать разлинковку - пусть все кирпичи используют _один_набор_точек.

Я не трогаю свойство "normal_range" - меня устраивает, что эта кисть
будет красить - весь борт, на все 360 градусов. Мне нужна простая
каёмка, одной текстурой. Если нужны три каёмки (верх, низ, борта),
тогда нужно добавить ешё ТРИ сиреневых элемента "Add Element",
и настроить, там, свойства "normal_range", примерно так..
45 и 90, как верхний борт.
135 и 90, как левый борт.
225 и 90, как нижний борт.
315 и 90, как правый борт.
// Счёт градуса угла, начинаем, справа, в середине,
// и мотаем размер угла (distance), против часовой стрелки.

Все эти элементы - можно рисовать друг-на-друге.
Тоесть, можт быть обше-каёмка 0-360, и добавочные, аля 45-90.
Меняй свойство _сиреневый..z_index,
чтобы нужна дуга рисовалась вышэ других.

Если белая дуга не обновилась, то закрой-открой этот саб-ресурс
(дуга схлопнется, и снова появится - будет вынуждена _заново_нарисовать).
Если нода не обновила свой рисунок, то надо жать "Execute",
в самом верху свойств всей ноды Shape_Base (_refresh == обновить).

GodotФорумДемонстрируем наработки