Как обмениваться данными между двумя сценариями Lua

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

Итак, я и мои школьные друзья собираем игровой автомат, и я планирую собрать основной графический интерфейс, который позволит пользователю выбирать разные игры и загружать их, если у него достаточно жетонов. Однако эти отдельные окна должны будут использовать некоторые переменные, в основном количество жетонов в машине. Я подумал, что отдельная программа на Lua может хранить такую ​​переменную, а также отправлять ей запросы для выполнения других функций, таких как открытие и закрытие разных окон. Кроме того, если важно отметить, мы будем использовать движок Love2D для игр и запускать все это на машине с Linux.

Судя по тому, что я читал, кажется, что в этом задействован некоторый код C и C++. Я почти ничего не знаю о C или C++, и мы пытаемся продвигать этот проект, поэтому, если бы вы могли включить в свой ответ некоторый код и проинструктировать меня, как его использовать, это было бы потрясающе. Я могу вернуться позже и немного изучить C или C++, но сейчас Lua — мой главный приоритет.

Мои вопросы:

  1. Есть ли лучший способ выполнить то, что я пытаюсь сделать?
  2. Как мне это сделать?
  3. Можно ли это сделать исключительно с помощью Lua или с помощью C, C++ или любого другого внешнего языка программирования/утилиты/и т. д. требуется?

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

Еще раз извините, если я немного расплывчата.

Заранее спасибо!


person SadBlobfish    schedule 26.11.2013    source источник
comment
Что именно вы пытаетесь сделать на более высоком уровне; Какую проблему ты пытаешься решить? Я предполагаю, что у вас уже есть какой-то код. Не могли бы вы свести это к одному конкретному, ясному и лаконичному вопросу? Обмен данными между двумя Lua-скриптами не так уж и сложен. Это то, для чего нужен require. больше здесь.   -  person Ryan Stein    schedule 26.11.2013
comment
На самом деле... У меня еще нет кода. Честно говоря, я действительно не знаю, что я делаю. Наверное, поэтому я здесь :P. По сути, я хочу знать: как мне создать переменную, которая будет совместно использоваться двумя программами во время их работы?   -  person SadBlobfish    schedule 26.11.2013
comment
Это немного яснее. Это смотря какие программы. Я предполагаю, что вы имеете в виду разные игры, созданные с помощью Lua с использованием Love2D, поскольку вскоре после этого вы упомянули разные игры, а затем отдельные окна. Есть ли причина, по которой они должны быть совершенно отдельными программами, нуждающимися в общении друг с другом? Возможно, это поможет вам опробовать руководство или два и сначала написать код, чтобы получить представление о том, как все работает на менее абстрактном уровне.   -  person Ryan Stein    schedule 26.11.2013
comment
У меня есть некоторые базовые знания Lua, Love2D и предыдущий (хотя и ограниченный) опыт программирования, так что это не слишком большая проблема. Меня беспокоит то, что между закрытием графического интерфейса и открытием игры — и наоборот — могут возникнуть проблемы с передачей данных. Я не уверен, прав ли я в этом или нет. Я полагал, что какая-то фоновая программа/движок устранит любую такую ​​неисправность. Я, возможно, быть осторожным?   -  person SadBlobfish    schedule 26.11.2013
comment
Я, вероятно, должен добавить, на случай, если я не был достаточно ясен ранее. Фоновый скрипт/движок будет открывать и закрывать графический интерфейс и игры. И я планировал просто написать его как сценарий .lua, а не запускать его через Love2D, так как, похоже, ему не нужна вся эта дополнительная структура.   -  person SadBlobfish    schedule 26.11.2013
comment
Еще одна вещь, которую я забыл добавить, это то, что это также помогло бы загружать таблицы рекордов и отправлять данные таблицы в графический интерфейс для отображения. Я подумал, что это ускорит загрузку графического интерфейса, поскольку мы не хотим, чтобы пользователям приходилось ждать дольше, чем они.   -  person SadBlobfish    schedule 26.11.2013
comment
Почему бы не сделать все это одной программой Lua, использующей Love2D, которая повторно использует одно и то же окно и процесс для нескольких игр? Тогда не было бы данных для передачи, потому что все в одном месте. Я извиняюсь, если я кажусь немного педантичным, но быстрее, чем что? Вы сказали, что еще ничего не написали, поэтому я не думаю, что вам есть с чем сравнивать. Это звучит почти как случай преждевременной оптимизации.   -  person Ryan Stein    schedule 26.11.2013
comment
Вы рассматривали базу данных? Однако совместное использование может принести неприятности, особенно если вы наивно пытаетесь подойти к проблеме.   -  person Dmitry Ledentsov    schedule 26.11.2013
comment
@RyanStein Я не думал, что можно повторно использовать одно и то же окно для нескольких игр. Это бы сильно упростило и ускорило работу. И не бойтесь показаться педантичным. В любом случае я пытаюсь найти наиболее эффективный способ сделать это, и я здесь, чтобы учиться :). Хотя я склонен много обдумывать, я больше просто пытаюсь найти способ (во всяком случае, на самом деле) выполнить то, что я пытаюсь сделать. Не могли бы вы вкратце объяснить, как я могу повторно использовать одно и то же окно для нескольких игр? Если нет, то могу попробовать поискать.   -  person SadBlobfish    schedule 27.11.2013
comment
Кратко? Конечно, разделите процедуры рисования, ввода, звука и т. д. для каждой игры и подключайте их только при необходимости. В будущем вы, возможно, захотите сделать свои вопросы SO более конкретными. Отвечать на них будет намного проще, так как у них будет менее основанный на мнении ответ. Я думаю, что если вы потратите некоторое время на API рисования и окон для Love2D, это поможет вам лучше понять предмет.   -  person Ryan Stein    schedule 27.11.2013
comment
Спасибо за терпеливость! Ага... Мне нужно немного поработать, чтобы обобщить вещи, в общем.   -  person SadBlobfish    schedule 27.11.2013


Ответы (1)


(этот метод представляет собой комбинацию предложения @Puzzlem00n и чтения комментариев, поэтому я вообще не должен придавать этому большого значения)

Размещение нескольких игр в одной программе lua!

В main.lua:

require("spaceInvaders") --require all the other Lua files
-- without the ".lua" at the end!

gamestate=spaceInvaders

function love.load()
--all the setup things
end

function love.update()
 gamestate.update()
end

function love.draw()
 gamestate.draw()
end

function love.keypressed(key)
 gamestate.keypressed(key)
end

--and so on for the rest of the love callbacks that you need (such as love.keyreleased())

Затем в каждой игре (это отдельный файл Lua, такой как spaceInvaders.lua):

spaceInvaders = {}

function spaceInvaders.draw()
 --your draw code
end

function spaceInvaders.update()
 --your update code
end

--and so on for every other callback you want to use

Этот код дает каждой игре собственный набор любовных функций. Если вы хотите играть в эту игру, вы должны установить в gamestate название этой игры. Строка spaceInvaders={} определяет spaceInvaders как таблицу, в которой хранится каждая функция на своем месте. Когда вы определяете переменную как существующую переменную, вы фактически создаете ссылку на нее, например:

t = {}
table.insert(t,1) --place 1 inside t
table.insert(t,3) --also place 3 inside t
s = t
print(s[1]) --will print 1, the first value of t
t[1]=2
print(s[1]) --will print 2, as it refers to t[1], which has just been changed

Обмен переменными! (Я поработал над этим!)

СЕЙЧАС это означает, что вы можете отправлять переменные в программу с помощью другой функции. Если вы хотите разделить счет между играми, вы можете сделать следующее:

в main.lua:

function love.update()
 gamestate.update()
 score = gamestate.returnScore() --score will always equal to the current score being returned by the game
end

в игре, такой как spaceInvaders.lua:

function spaceInvaders.returnScore()
 return score --or whatever the score is stored in
end

Это позволит вам получить переменную, такую ​​как счет, из одной игры в main.lua! Извините, если это немного сбивает с толку, но, надеюсь, это то, что вы ищете! :)

person finnbar    schedule 01.01.2014