Кто хорошо знает Lua?
Можно ли как-то сократить такое длинное слово как function?
В Tic-80 и Pico-8 это очень актуально, ибо очень большое ограничение символов.
1) Было бы неплохо, если бы можно было бы писать так код:
func HelloWorld ()
print («Hello World!»)
end
2) Ещё одна вещь которая раздражает в Lua, это то что нельзя сделать вот так с goto:
goto «name»
print (1)
::name::
print (2)
- 10 сентября 2019, 07:55
- 00
хотел вначале сделать вот так, но оно не работает, к сожалению(
а было бы прикольно сокращать такую частую опцию
или даже лучше вот так)
Такого уровня метапрограммирование (я про первое) в луа не реализуешь.
В пико ведь ограничение на количество токенов, а не символов. Func и function будут считаться за один, если вообще считаются.
Жаль нельзя такое сделать :<
Не знал про Pico-8.
Думал там также, как и в Tic-80, в нём каждый символ на счету,
хотя их там до 65000 можно вводить, но мне этого мало, ибо обычно я использую много кода,
люблю разные фичи добавлять в проект.
В принципе, кое-что сделать можно... ;) Но это изврат. Концепта ради:
Прикольно!
Спасибо, надо потестить! :3
Gamemaker тебе брать надо :)
Там вообще не надо писать function, да. Но goto там нету. Впрочем, в примере выше достаточно просто закомментировать print (1) чтобы его пропустить. Можно, как и в обычных ЯП, комментировать целыми блоками много строк подряд.
goto мне нужна, чтоб по методу Axma что-то спрограммировать, то есть хочу придумать
можно ли как-то в Lua методом комнат программировать, как было в Аксма,
если б goto можно было бы видеть в другой функции, то я бы как минимум придумал бы такой вариант
но в Lua невозможно goto использовать находясь в разных функциях,
поэтому я подумал, было бы прикольно тогда сделать так чтобы goto была с переменной текста,
но так тоже нельзя((
иначе можно было бы тогда представить каждую комнату как отдельную функцию,
но тогда мне нужно как-то сократить это долгое слово function или придумать что-то ещё
но в идеале я хочу, чтобы было вот так) чтобы не писать ничего лишнего
и при встрече следующей ссылки, код бы возвращался откуда пришёл к оператору goto
Ну ты можешь каждую "комнату" хранить как объект, каждой комнате написать свой аналог update или что надо, напихать при желании своих методов для каждой комнаты, и в текущем кадре апдейтить текущую комнату. Или не апдейтить, а делать что нужно, не важно в этом смысле. Чудеса ООП (не совсем)!
Или тупо хранить текущую комнату как число (есть ли в lua enum?), а в одной общей функции этот номер передавать аргументом и проверять свитчем.
Да зачем? (Свитча из коробки тоже нет)
С объектами более гибко все. Плюс можно при желании классы реализовать, насколько луа это позволяет, и пользовать соответствующие приколы, если надо.
Чтобы простые вещи писать простым образом и не ловить потом гибкие баги :)
Как раз с кучей if else if и будут баги) Ладно 2 комнаты. А 200? 199 else if делать?)
А чем это хуже двухсот классов? :) Наследование - это такое же ветвление, только вид сбоку. Группируй комнаты по похожести кода, если их стало много.
Да по-всякому можно, это понятно. Просто мне кажется удобно тут использовать объекты, так как по сути на луа можно реализовать классы так (в некоторых готовых решениях так и есть), что между наследованием и использованием примесей не будет особой разницы, и потому можно достаточно удобно и логично переиспользовать код и все такое.
А как такое кодить?
Пока что самый удобный способ написания большого количества комнат,
это большой список, как в Аксма идущий по порядку без сложных ООП приёмов,
я по минимуму стараюсь использовать ООП, ибо не очень силён в нём.
В юнити это кстати легко, каждая комната это отдельный префаб или объект со скриптом,
чисто визуально для художника это приемлемо, но если писать чистым кодом,
то наверное хочется такой стиль как в Аксма, жаль что нельзя
Если для ИЛ, то можно взять INSTEAD ;) Раз уж я здесь. Там как раз и Lua и комнаты. =)
Не совсем ИЛ, скорее больше графики, пиксельарт комикс с элементами ИЛ,
мне пока в Instead не особо понятно, можно ли там сделать Perfect Pixelart графику,
чтобы прям всё было в чётких пикселях, включая шрифт и любые рамочки с низким разрешением
вплоть до 64 на 64 или хотя бы около 200*100 или 320*200, чтобы всё одним стилем было с LowRes
например в RPG Maker по умолчанию - совмещение пиксельарта и плавной 2д графики,
что очень больно бьёт по глазам для общего стиля,
лучше бы они выбрали либо всё в пикселях, либо всё в высоком разрешении.
А то портреты и шрифт с большим разрешением, а фигуры и тайлсэт в пиксельарте.
Ну, это не основное назначение INSTEAD, но там есть такой объект pixels, на котором ты можешь работать с пикселями напрямую (rgba компоненты) + графические примитивы. Ну или блитить туда картинки + шрифты. При этом потом этот pixels можно растянуть в кратное число раз. В самом же INSTEAD можно задать режим масштабирования "только кратно". Вероятно это и будет тот самый Perfect Pixelart. Но в таком режиме это все превращается в просто 2d движок типа Love2d или тех же pico/tic. Так что это не основное направление движка, хоть и аркады/казуалки на нём есть.
Когда-нибудь точно доберусь до гамака)
зачем тебе godot если есть switch? или нет? или есть? lua ведь хорош еще использованием метатаблиц:
только это обычная таблица, а не метатаблица
ага. только потом можно вызвать таблицу как функцию и все, предварительно описав ее конечно же.
А подробнее можно? Пока не похоже на метатаблицы.
Да это ясно, но это не метатаблица. Это просто использование гибкости таблиц в луа) Метатаблица, грубо говоря, указывает что делать с таблицей, когда мы пытаемся применить к ней какую-то "нестандартную" операцию, непредусмотренную для таблицы - типа сложения, и так далее. То есть если мы пытаемся применить к таблице какую-то "особую" операцию, то программа полезет в ее метатаблицу, чтобы посмотреть что делать-то.
а как вызывать такое?
тут же можно кучу условий написать внутри функций, которые находятся в таблице,
включая функции оттуда же в другие комнаты?
Ну, подозреваю, что как-то так
Ну а то, что я писал выше, может выглядеть так:
На выходе будет
Ну это просто пример, чтобы показать принцип. goto не особо нужно для такого. При желании можно сделать класс комнаты. Масса вариантов.
спасибо) прикольно, хотя наверное для 100-200 комнат это будет не очень
Сделать класс для комнаты (от него можно сделать класс для каких-то особых комнат), и от них наследовать уже. Или не наследовать, а делать экземпляры класса "Комната", для каждого прописывая функцию свою. Опять же, много вариантов. Но писать огромное ветвление с if-ами на 100-200 комнат тоже не особо здорово будет, если подумать.
Большое ветвление можно разбить на подфункции, и будет совершенно такой же алгоритм, что с виртуальными функциями, только без создания экземпляров. :)
Если мне надо поделить игру на локации или комнаты, я делаю так:
На диске одна папка с именем комнаты содержит скрипт с кодом этой комнаты и все используемые в ней ресурсы.
Этот скриптовой файл - содержит один список комнаты. Внутри списка - все переменные, все объекты, функции, в т. ч. функции рисования и обновления, все что сейчас находится в этой комнате и может меняться. По сути каждая комната - это отдельная "мини-игра". В основном скрипте level хранишь ссылку на список текущей комнаты и уже вызываешь ее обновление и рисование, функции входа в комнату и выхода из нее.
Если тебе надо сделать ветвление типа switch, то лучше сделать отдельный список где хранятся функции для кажого конкретного значения.
Это не подходит для Tic-80, но всё равно спасибо.
Там просто всего 1 скрипт в 65000 символов максимум и никаких отдельных папок.
Это фентези консоль по типу Pico-8.
Тогда и 200 комнат под вопросом в принципе. Хотя была полноценная РПГ на тик80, там чел написал виртуальную машину, интерпретирующую ассемблер или уже транслированный код (не помню точно), чтобы компактно написать много кода потом, у. Ссыль сейчас с телефона лень искать, но при желании можно. Но это скорее просто програмерский челенж такой.
https://medium.com/@btco_code/why-i-spent-almost-a-year-building-an-rpg-game-for-a-fantasy-console-2bbe2e1d8cb8
Нашел, нашел! Всё не совсем так, как я написал, но принцип схож почти что.
видел эту игру) почти TES) ну или ближе к старым играм типа Lands of Lore
Храни комнаты как массивы строк, где каждый символ будет означать определенный спрайт или объект.
Вы тут INSTEAD изобретаете что ли? =)
Я просто хочу удобную структуру придумать для лёгкого программирования на фентези консоли Tic-80)
Как художник я не люблю сложное программирование и хочу найти способы упростить в разы это)
недавно вспоминал, что мне в Аксма очень легко давалось писать истории, там очень простой функционал:
1) показать текст, показать картинку, сыграть музыку
2) кнопка, которая ведёт либо в другую/ту же комнату и меняет одну переменную
3) это всё обновляется только один раз, когда подгружается новая комната.
такого функционала достаточно чтобы писать достаточно мощные вещи) но на практике
сложно придумать такое упрощение, вот сейчас думаю, как один раз написать, чтобы потом было легко
программировать)
Ещё достаточно легко программировать в Bitsy, но там немного другая система. Тоже думаю над реализацией своего движка в духе Битси, но с цветной графикой, просто для того чтоб упростить процессы, хочется делать игры, а не движки( я уже задолбался, хочется один раз всё настроить и потом просто делать игры
PS на Instead пока только документацию читал, не добирался до практической части)
Ну я непрезентативный конечно, ибо с 12 года пишу только на инстеде. Но скажу сразу чем хорош инстед. Тем что если вдруг хочется заморочиться, то тебе есть куда заморочиться. Вот генерирую я карту местности например, а в чем её хранить? Можно конечно просто в куче текстовых строк, но проще открыть справочник ЛУА и почитать про массивы например. Пишу сейчас гамес, захотелось мне сделать титр типа как в Секретных Материалах в начале описания локации: Аляска, секретная база ВМФ №77, 7.30 утра. Иду в справочник и нахожу функцию выдающую системное время. В итоге можно бродить туда-сюда по локациям и время действительно меняется =).
Для рисования кстати я часто использую просто тупо составную картинку. Мои потребности это закрывает полностью.