
Snusmumriken
12.11.2017
10:31:33
Самое противное, что через четыре года ты будешь точно так же смотреть на свои текущие туторы, потому что четыре года не просто так были : )
Я к тому чтобы ты не заморачивался.

Elias
12.11.2017
10:34:14
Ха-ха, надеюсь, что нет. К тому же, не сказать, чтобы я предыдущие статьи считал безумно ошибочными. Скорее они просто недостаточно в глубину копают, а так ошибок не так много.
И я думаю быстро выйти за пределы того, про что говорят обычно. А то часто останавливаются на самых основах, а то, как это применять в реальной жизни, не показывают.
Для меня было большим открытием то, что на Lua можно писать огромную часть кода, которая лишь изредка вызывает C++. О таком обычно не пишут. :)

Daniel
12.11.2017
10:37:29
Как разбить слово на отдельные символы?


Snusmumriken
12.11.2017
10:38:43
Ха-ха, надеюсь, что нет. К тому же, не сказать, чтобы я предыдущие статьи считал безумно ошибочными. Скорее они просто недостаточно в глубину копают, а так ошибок не так много.
И я думаю быстро выйти за пределы того, про что говорят обычно. А то часто останавливаются на самых основах, а то, как это применять в реальной жизни, не показывают.
Для меня было большим открытием то, что на Lua можно писать огромную часть кода, которая лишь изредка вызывает C++. О таком обычно не пишут. :)
Ну, это можно заметить по многочисленным воплям о крутизне resty/tarantool/redis, благодаря встраиваемым луа-скриптам, а так же - в принципе, по существованию скриптовых языков. Ну, я постоянно пересекался на начале с каким-нибудь комплектом либ вроде torch, где много ускорялок и утилитарных функций для луа. Тот факт что такое существует - тонко намекает что на этом всём пишут действительно много кода, и только иногда - выглядывают на сишную сторону, когда нужна какая-то конкретная тяжёлая/невозможная в скрипте функция.

Google

Daniel
12.11.2017
10:39:17

Snusmumriken
12.11.2017
10:39:40

Daniel
12.11.2017
10:41:22
Спасибо
А как теперь к каждому символу присвоить какое либо значение переменной?


Elias
12.11.2017
10:44:35
Ну, это можно заметить по многочисленным воплям о крутизне resty/tarantool/redis, благодаря встраиваемым луа-скриптам, а так же - в принципе, по существованию скриптовых языков. Ну, я постоянно пересекался на начале с каким-нибудь комплектом либ вроде torch, где много ускорялок и утилитарных функций для луа. Тот факт что такое существует - тонко намекает что на этом всём пишут действительно много кода, и только иногда - выглядывают на сишную сторону, когда нужна какая-то конкретная тяжёлая/невозможная в скрипте функция.
Ага
В Питоне это как-то более распространено, со всеми этими Numpy, Scipy и пр. В итоге люди пишут сначала на Python, а потом уже вызывают C/C++
А Lua часто рассматривают как бонус к C++, где вызываются кастомные вещи.
Очень долго я использовал Lua как штуку, которая в 99% случаев вызывала только C++ функции и на скриптовой стороне делала мало.
Но когда я понял, как легко можно на Lua стороне делать почти всё, моя жизнь стала в разы лучше. :D


Snusmumriken
12.11.2017
10:44:47

Daniel
12.11.2017
10:45:44
Хочу сделать шифратор
Пишешь слово оно возвращает тебе его в виде языка Морзы

Snusmumriken
12.11.2017
10:47:31
Только заменяешь каждый символ на соответствие в табличке.

Daniel
12.11.2017
10:49:38
https://pastebin.com/raw/GYBjUhUQ
Что-то не пашет ЖВ

Google

Daniel
12.11.2017
10:54:53
:d
?

Snusmumriken
12.11.2017
10:57:41

Daniel
12.11.2017
10:58:42
Вау

Snusmumriken
12.11.2017
11:00:41
Вау
https://pastebin.com/4M8vVZHw
Добавил пробелов в коды, чтобы разделять "буквы"

Elias
12.11.2017
11:02:23
Прекрасный тестовый пример

Snusmumriken
12.11.2017
11:03:36
У него мало букв, и они часто повторяются, легко проверять корректность трансляции. Хотя лучше было бы ещё добавить не только односимвольные замены.

Serge
12.11.2017
11:13:16

Elias
12.11.2017
11:14:29

Serge
12.11.2017
11:16:39
Да я бы и старые почитал... Но нет, так нет.

Elias
12.11.2017
11:22:50
В последних статьях я использовал LuaBridge, но теперь всем советую sol2, он гораздо лучше и удобнее. :)

Serge
12.11.2017
11:23:28


Snusmumriken
12.11.2017
11:26:52
В последних статьях я использовал LuaBridge, но теперь всем советую sol2, он гораздо лучше и удобнее. :)
Карочи, основная концепция связки "компилируемые + интерпретируемые":
Компилируемый язык - это типа автомобиль. Он быстр, мощен, у него есть руль, рычаги и прочая фигня, на нём можно быстро доехать из А в Б, и ещё привезти с собой кучу барахла.
Скрипт - это водитель. Он дёргает рычаги и крутит руль, загружает багажник и всё такое (может ещё кофе выпить в ближайшей забегаловке, или сменить машину на фуру, если есть необходимость и его мама это позволяет).
Если ты только дёргаешь сишные функции из скрипта - ты делаешь не автомобиль а поезд, у которого только одни рельсы, и он может гонять только по ограниченному пространству, а когда ты делаешь именно тачилу - у водителя больше свободы но и больше ответственности: куда повернуть в данный момент, или "что там на дорожных знаках? Главная дорога?" и приходится учитывать других водятлов, которые могут внезапно отожрать 100% проца и 99% памяти.
Мне нравится такая метафора, ибо гибкая достаточно.


Elias
12.11.2017
11:32:50
Да, хорошая метафора.
В принципе, если иметь хорошую C++ основу, то и из Lua можно делать автомобиль, что показывают проекты типа Love2D, который на самом деле SDL, и даёт возможность делать почти всё, что захочется.
Что мне ещё нравится в том, чтобы использовать Lua очень много, так это то, что отпадает необходимость писать адовые шаблоны в C++, которые потом ещё нужно как-то биндить к Lua. Почти любую функцию в Lua можно рассматривать как шаблонную + возможность добавить к любой таблице поля в зависимости от того, что хочешь делать - это то, что в C++ делается либо наследованием, либо магическими unordered_map.
Ну и поворотным событием для меня стало то, что из C++ вызывать Lua слишком часто не стоит. Это безумно медленною. Из Lua вызывать C++ - безумно быстро. Поэтому есть дополнительная мотивация в том, чтобы Lua управлял C++, а не наоборот. :)


Snusmumriken
12.11.2017
11:35:11
С++ выгружает в луа таблицу с таблицами, запоминает одну из таблиц которую выгрузил, и ищет в ней функции, которые пользователь может добавить, вызывая если они есть.
Да, это сократило мой предыдущий код с очередью событий во много раз, а ещё, колбеки вызываются только когда они есть. Просто в противном случае, какой-нибудь колбек выгружающий картинку на пару мегабайт будет висеть в памяти ненужным, пока не вызовут/не очистят.

Elias
12.11.2017
11:38:15
Я просто как-то вызывал из C++ Lua-функции "update" для каждой машины состояний. И когда Entity на экране было много, я почувствовал всю боль вызова Lua из C++.
Потом я решил изменить направление - кидал список Entity в Lua, и там вызывал в цикле "update" для каждой активной Entity. Профит был огромным и игра перестала тормозить вообще когда-либо. Ускорение раз в 100 было. :D

Snusmumriken
12.11.2017
11:38:36
Уу, да, тут офигенно высокая частота.
У меня где-то по колбеку в десять-двадцать секунд, почти пофигу насколько медленно.
Разве что при подключеннии к чату с 200 чел - будет чуть медленнее, с пол секунды отработает, ибо call а не pcall. Pcall - за пару-тройку секунд.

Google

Elias
12.11.2017
11:40:08
У меня сейчас за итерацию игрового цикла вызывается от силы 3-4 функции Lua из C++. Самый главнй монстр - функция "update", которая уже апдейтит все менеджеры на стороне Lua, которые управляют почти всей игровой логикой, а также обрабатывают ивенты
И да, редкие колбеки - это прекрасно. :D

Snusmumriken
12.11.2017
11:42:38
Ты знаешь как это решили в love2d?
Там С++-сторона вызывает два скрипта в принципе, и оба из них вшиты в память.
Основной прекол - скрипт-загрузчик, который делает всю необходимую дичь, и дёргает как раз update/draw:
https://love2d.org/wiki/love.run
https://bitbucket.org/rude/love/src/37e1ced87caf25db7b2a5a8f502af7f3b6eacbd2/src/scripts/boot.lua?at=default&fileviewer=file-view-default
То есть, C++ делает свою работу и вообще не отсвечивает, предоставляя только набор функций.
А у тебя - как будто машина сам говорит водителю: "Чел, ты сейчас будешь делать эту фигню, заткнулся и сделал, я сказал!"


Elias
12.11.2017
11:45:41
Ага, как-то читал исходный код Love2D и оценил эпичность всего этого.
Возможно и у себя так сделаю когда-нибудь. Потенциально это не так трудно и уже всё довольно близко к этому, потому что мой код выглядит примерно так:
while (game is running) {
update(dt);
updateLua(dt);
render(window);
}
Но ничто мне не мешает сделать сам цикл внутри Lua и вызывать update/render C++ через Lua :D

Snusmumriken
12.11.2017
11:46:02
Ну в love.run как раз это и есть, только чуть сложнее, ибо ещё события.
Со стороны скриптов, кстати, ничто не мешает переписать функцию love.run, или вообще убрать её. Она вызывается один раз, если есть.
Т.е. из love2d можно сделать прогу на одно исполнение без цикла, без проблем, или, например, убрать вызов луа-колбеков, благо они тоже вызываются с луа-стороны.
То что я из С++ вызываю луа-функции - это тоже луа-функция. Ну, можно не вызывать луа-функцию, и С++ не будет говорить что делать.


Elias
12.11.2017
11:48:49
Ну у меня события тоже есть, просто они внутри update. Там я просто обрабатываю ивенты, которые мне даёт SFML
И возможно, когда-нибудь я переберусь на Love2D окончательно. В принципе, он довольно мало ограничивает, и это круто. Разве что слишком много кода на C++/SFML уже написано, поэтому пока что не думаю такого делать. :D
Кстати, ты не видел каких-нибудь хорошо написанных игр на Love2D?
А то я много видел довольно ужасного кода, а красоты маловато. :D

Snusmumriken
12.11.2017
11:53:39
Ну, не совсем игра, но что-то похожее на движок:
https://bitbucket.org/MainTomato/tank-o-box/src/5629390212fec558a7ded405f754ab11a2524fe7?at=develop
boot.lua в корне не используется, как раз скопипастен с love2d.
Либы class, ffivec(vec), gamestate - мои.

Elias
12.11.2017
11:57:23
Заценю
А то как-то посмотрел на код mari0, самой популярной игры на love2d, и загрустил
Там прям вещи в духе
player.x = 5 + player.y * 3
И в целом очень всё захардкожено и вроде даже машин состояний нет, хотя игра довольно сложная

Snusmumriken
12.11.2017
12:01:16

Elias
12.11.2017
12:02:12
Что такое 0.2 и 1.5? :D

Snusmumriken
12.11.2017
12:03:39
Ну, фактор торможения, который заодно ограничивает максимальную скорость, и вектор торможения при движении "боком", т.е. угловое торможение.
Это же танчик, он не может боком ехать. А вперёд и жопой вперёд - пожалуйста. Но заносы присутствуют, и это как раз для входа в занос.

Elias
12.11.2017
12:05:20
Введи переменные
braking_factor
braking_side_factor
И всё прекрасно. :D
В Don't Starve таких было так много, что они их в большие отдельные файлы запихивали, которые называли "TUNING". И это хорошая философия, потому что быстро позволяла настраивать мелкие вещи в игре не копаясь в коде

Snusmumriken
12.11.2017
12:06:04
Дык чувак, это даже не игра а тест движка, для личного использования )))
Но тут очень грамотная архитектура, пусть это и самопеар.
Я несколько лет шёл к такой архитектуре, поглядывая по сторонам.

Elias
12.11.2017
12:08:03
Ну тогда всё ок.
Потом скажу, что о ней думаю. ;D
И если интересно, то могу кинуть приглашение в приватный репозиторий моей игры. Я тоже считаю, что у меня крутая архитектура. И да, я к ней ̶д̶ж̶в̶а̶ 4 года шёл, так что многое успел усовершенствовать. :3

Snusmumriken
12.11.2017
12:10:35
Вот самих игр на love не шибко много, да.
Спроси, кстати, у (@ Nefrace) из чата по love2d, у него много неплохих прототипов, правда, я смотрел в основном на графон а не на качество кода : )
https://t.me/love2d_ru

Philipp
12.11.2017
12:11:30

Google

Snusmumriken
12.11.2017
12:12:10
Я уточняю что это самопеар )))
А потом тыкаю человека, которого тоже можно спросить.
И, кто бы мог подумать, я - довольно донный человек, но я понять не могу, почему ты мне до сих пор не поклоняешься как божеству ))

Elias
12.11.2017
12:16:13
Я стараюсь вообще всё параметризировать в своём коде, поэтому делаю вот такие вещи, вместо хардкода:
-- pre attack animation (charge, etc.)
if attack.preAnimationName then
playAnimation(e, attack.preAnimationName)
end
-- main attack animation
e:setAnimation(attack.animationName)
-- wait for damage frame
if attack.damageStartFrame then -- otherwise damage starts from first frame
waitForAnimationFrame(e, attack.damageStartFrame)
end
-- create damage
if attack.createDamage then
attack.createDamage(e)
else
startPrimaryItemDamage(e, attack)
args.damageActive = true
end
*G E N E R I C S*
В итоге такие вещи используются не только для конкретных entity, а почти для всех. :D

Snusmumriken
12.11.2017
12:18:01
Хмм. Сложновато, в плане того что имхо, это эффективнее вынести в компоненты/миксины.
А потом такой:
for i, v in ipairs(obj.mixins) if ... then obj:update() end
И разом обработал сразу всё подряд, и только то что нужно для данного объекта.
*О П Т И М И З А Ц И Я*

Elias
12.11.2017
12:20:16
Это корутина, которая описывает процесс того, как происходит атака. Некоторые функции могут занимать несколько кадров, как например playAnimation
Просто здесь прям наглядно то, что сначала есть пред-атака, потом анимация атаки, далее создаётся дамаг и пр.
А так всё по компонентам раскидано, конечно.

Snusmumriken
12.11.2017
12:21:37
Норм : )
Пойду дальше стим делать, потому что я конечно сделал все колбеки, но их ещё стоит раскидать по файлам и заняться самими функциями стима.
Колбеки - это хорошо, у меня уже 2к строк колбеков, но остальное тоже нужно.
А потом - луа-оболочка, которая строит вокруг всего этого ООП.

Philipp
12.11.2017
12:39:16

Snusmumriken
12.11.2017
12:41:40
А чому бы и нет? )))

Philipp
12.11.2017
12:52:08
А чому бы и да? Не заслужил пока :D

Group Butler [beta]
12.11.2017
13:43:04
Добро пожаловать в чат pro.lua, NePutin_94! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Добро пожаловать в чат pro.lua, Kirill! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Vlad
12.11.2017
15:58:57
переход c GitForWindows на GitBash болезненный

Group Butler [beta]
12.11.2017
20:55:24
Добро пожаловать в чат pro.lua, dogecore! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Шар.
12.11.2017
20:56:35
Language:
lua
Source:
print'hello world'
Result:
hello world

Snusmumriken
12.11.2017
21:06:52
Language:
lua
Source:
print'И тебе привет'
Result:
И тебе привет

Шар.
12.11.2017
21:08:38
Language:
lua
Source:
print('А тебе ' .. ((math.random() > 0) and 'тоже привет') or 'непривет')
Result:
А тебе тоже привет

Snusmumriken
12.11.2017
21:17:13
Language:
lua
Source:
s = 'd09dd18320d0b820d0b8d0b4d0b820d0bdd0b0d184d0b8d0b3'
print(s:gsub('..', function(c) return string.char(tonumber(c, 16)) end) )
Result:
Ну и иди нафиг 25
Осталось только написать страницу кода, которая хитрыми манипуляциями выдаёт содержимое книги "война и мир"

Шар.
12.11.2017
21:19:34
И ещё
я вдруг вспомнил что тут нет выхода в интернет

Google

Snusmumriken
12.11.2017
21:21:16
И исчез.
Пока не помнил - интернет работал.
Как вспомнил что его нет - исчез.
Так и живём.

Шар.
12.11.2017
21:21:34

Snusmumriken
12.11.2017
21:23:39
Нет, просто нарушения законов вселенной по невнимательности.
Типа знаешь? Мультяшные персонажи которые ходят по воздуху до тех пор, пока не посмотрят вниз, и вселенная не вспомнит что им пора падать.

Group Butler [beta]
12.11.2017
21:28:58
Добро пожаловать в чат pro.lua, Вадим! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Snusmumriken
12.11.2017
21:35:28
Опять он?

Vlad
12.11.2017
21:36:44
как лучше реализовать такую вещь? :
у меня идет выбор в два этапа сначала указываем количество
а потом действие

Snusmumriken
12.11.2017
21:37:04
Консольное приложение?

Vlad
12.11.2017
21:37:08
да

Snusmumriken
12.11.2017
21:37:50
Ну по классике - объявляем пару переменных, потом спрашиваем "Чего изволите?", записываем в них переменные : )