Andrey
есть ли отличия
Andrey
или просто поленились self написать
Andrey
про индексы и метатаблицы тоже знаю
Snusmumriken
Хе
object = {x = 3, y = 5}
function object:bar()
return object.x- object.y
end
local blah = {x = 400, y = 300}
object.bar(blah) --> -2
Andrey
ну да
Snusmumriken
Пардон, я пофиксил
Andrey
или blah:bar()
Snusmumriken
Нет, оно будет работать только object.x/object.y. В качестве self туда передастся blah, но работать оно будет с object ))
Потому что ты так написал ))
Andrey
вот
Andrey
Тогда зачем в той библиотеке двоеточие. если оно и так с ws работает
Snusmumriken
Потому что в ws записывается функция, которую ты определяешь.
Snusmumriken
Ну например смотри.
local Class = {}
function Class:setCallback(func)
self.callback = func
end
function Class:call_callback()
self.callback(self)
end
local function bar(v) print(v) end
Class:setCallback(bar)
print(Class.callback(10, 20)) --> 10
Class:call_callback() —> table 0x123124 (таблица Class)
Snusmumriken
И им же вызывается. Не классом, не кем-то другим а им самим.
Он будет записывать эту функцию _в себя_.
Snusmumriken
Карочи, пойди проспись, и не путай вызов функций с их инициализацией ))
Andrey
Andrey
Да надо проспаться
Andrey
Snusmumriken
Ух, я помню человека по имени "Рокетбанк", в другом чате был "Ниссан", с соответствующей аватаркой, а Яндекса пока не видел!
Александр
Привет. Может кто дать дельный пример программирования логики мобов в играх? Изучал варианты на коллбэках (on_battle, on_idle, on_attack, ...), на корутинах (последовательность действий), но к единому, удобному и хорошо кастомизируемому интерфейсу не пришел.
Игра на плюсах, биндинг на луа.
Александр
Из требований: лёгкие сценарии реализуются без навыков кодинга, сложные - без кода-лапши
Snusmumriken
ECS например.
Александр
ECS например.
ЕМНИП, это способ хранения сущностей и их коллективного взаимодействия.
Я же спрашиваю про настройку логики конкретных мобов. Пример: босс должен бить игрока. Если у босса <50% хп, он кричит что-то один раз. Если <25%, бафается. Вот эти условия должны хорошо укладываться в луа код, но надо учитывать, что они могут быть намного сложнее, с ветвлениями, а также их может писать не программист, а какой-нибудь гейм-дизайнер. Задача - дать ему удобный и понятный интерфейс для этого.
Snusmumriken
Ты давай не ЕМНИПай а вспоминай : )
Это как раз настройки/миксины к объектам.
Александр
Так я помню. И это не имеет отношения к AI
Александр
Если я ошибаюсь, готов посмотреть на пример
Snusmumriken
Ну частично имеют, в них может храниться логика ИИ. Типа, есть тип сущности "убегающее на <50%хп существо", есть тип "существо, которое при >%50 тревоги нападает" и т.п. Мы их смешиваем и получаем фигню.
Snusmumriken
Можно и проще, конечными автоматами фигачить. Переопределять функции update у существ по наступлении определённых событий, например. Но это не очень удобно, хотя в некоторых обстоятельствах — отлично.
Александр
Собственно "убегающий моб" и прочее уже реализовано. Набор отдельных флажков+параметров, который рулит почти всеми мобами в игре, но для боссов слишком неудобен и плохо кастомизируем
Александр
И заранее извиняюсь за долгий пинг - нестабильная связь
Александр
https://habr.com/ru/post/427135/
Вот, что мне понравилось
Elias
😏👍
Elias
Я много перечитал статей, но ничего круче корутин ещё не видел. :)
Александр
О, сам автор тут
Александр
Пользуясь случаем скажу, что восхищён статьёй
Elias
Спасибо :)
Anonymous
А как это сделать на корутинах?
Anonymous
Есть примерная схема?
Александр
В статье вся информация есть
Александр
Я пока остановился на следующей идее: есть набор действий, на которых вешаются корутины-коллбэки. Не функции, а именно корутины, причем в том виде, в котором они описаны в статье. Один код на on_enter_battle, другой на on_idle, третий на on_get_damage и так далее. Плюс корутин в этой ситуации в том, что они корутины, а не функции :)
От коллбэков пока не придумал, как избавиться
Elias
В данном случае коллбэки вполне норм. Они хорошо подходят для машин состояний.
Типа вошли в состояние "battle" -> запустили "on_enter_battle" -> запустили корутину
Александр
on_battle_start(function (mob)
// something initial
mob:buff_once()
// loop
while True do
// ...
if mob.hp < 1000 then
mob:heal(100)
end
mob:wait(10)
end
end)
Elias
👍
Александр
Но корутины шикарны, конечно
Pavel
мы делали через явный запуск тика на классе, (возможно в отдельной корутине не суть в общем-то)
типо
pcall = mob:tick()
а моб уже реализует самостоятельно ту же самую стейт-машину
Александр
FSM для гейм-дизайнера - что-то страшное. Лучше уж сразу разложить его на коллбэки
Artem
кто-то использовал Corona Native?
Pavel
но в итоге это все равно сведется к стейт-машине реализующей поведение.
Александр
Да, стейт машина никуда не денется, она прекрасно выполняет свои функции. Вопрос в том, как "украсить" её, скрыв кишки
Pavel
так тебе все равно поведение реализовывать.
типо - что моб хочет сделать в следующий шаг
Александр
Дефолтное поведение - ходить по заданному пути вне боя, бегать за игроком и бить простой атакой - уже реализовано у каждого моба. Вынести в луа я планирую необычную логику поведения в бою/вне боя
Snusmumriken
Ну я в своё время делал примерно что-то такое, как раз после активных воплей Элиаса о том какие корутины крутые : )
Типа, переопределяем self.state на нужную функцию с yield'ами. И функция, которая дёргает self.state — корутина, чтобы можно было yield'ить.
Anatoliy
Ребяты а подскажите что значит ошибка attempt to yield from outside a coroutine
Snusmumriken
То и значит : )
mva
она значит что кое-кто не попытался её прочитать, а сразу скопипастил в чат
Snusmumriken
Замени coroutine.yield() на
if coroutine.running() then coroutine.yield() end
Snusmumriken
А потом осознай что произошло.
Anatoliy
Перевод то мне ясен, только это не моя прога, я модуль с гитхаба скачал который вроде сразу должен работать, без всяких доработок
mva
> опенсорс
mva
> должен
Snusmumriken
mva
неа
mva
ещё и модуль небось лет 5 как заброшен
Anatoliy
Да и еще трабл - too many C levels (limit is 200) in function at line 48 near '0' - такое лечится?
Snusmumriken
Лечится. Что-то ушло в рекурсию или что-то подобное.
Snusmumriken
В общем, открываешь модуль, смотришь исходный код (места где падает), исправляешь так чтобы не падало. Я так всегда и делаю. Потом можно даже пул-реквестнуть, если проверить на всех основных версиях интерпретатора.
Snusmumriken
@Anatoliy999, ты когда-нибудь что-то выкладывал в опенсорс? Писал модули всякие?
гейм дизайнеру порще дать текстовый файл и сказать что это "конфиг"
и пустьвсе параметры туда пишет
Anatoliy
Snusmumriken
Это случайно не resty-websocket?
Anatoliy
mva
Snusmumriken
не
Тэкс, разговорчики.
@Anatoliy999, ещё один вариант. У этого модуля могут быть (точнее, точно есть) другие библиотеки в качестве зависимостей. И если там используется старая версия библиотек, угадай, что там с зависимостями.
Anatoliy
вот отсюда - https://github.com/alban-linard/lua-copas-ev/tree/master/src/copas библиотечка ev.lua