Totoro 3 562 Опубликовано: 26 июня, 2015 (изменено) Как-то раз я писал программку на Луа, и вдруг подумал: "А что, если взглянуть на процесс с другой стороны? Вместо скрипта для программы - написать программу для скрипта. " В качестве платформы, я решил взять Java Swing, потому что в тот момент под рукой была только шестая Java, и никаких библиотек. А в качестве программы - игру. Как многие знают, Луа - традиционный язык скриптования во многих играх. Игра располалагется в репозитории: https://github.com/MoonlightOwl/LittleTanks Последняя версия может быть скачана здесь:https://github.com/MoonlightOwl/LittleTanks/releases Проект представляет собой аркаду, с редактируемыми уровнями, и скриптованием этих уровней на Lua 5.2. Игрок управляет одним танком, и должен уничтожить все другие танки на уровне. (Правила конкретного уровня могут быть изменены его скриптом.) Редактирование уровней Создавать и редактировать карты можно в любом блокноте. (Памятка: http://pastebin.com/eW1PTzUB ) Уровни образуют пакеты, или "миссии". Название файла имеет такой формат: "<название_миссии><номер_уровня_начиная_с_1>.dat" (например base1.dat, и т.д.) Скрипт к уровню должен лежать в папке /levels/script/. Он должен называться так же как и сам уровень, только с расширением lua вместо dat. Скриптование Игра обращается к скрипту через следующие методы: * init(world) Вызывается один раз, при загрузке уровня. Объект world - это "игровой мир". Он содержит методы для обращения к игре, карте уровня. * updateTank(tank) Этот метод вызывается для каждого вражеского танчика в игре, каждый раз, как он завершает очередное действие. Через объект tank скрипт может обратиться к танку, и задать ему новое действие (двигаться, стрелять). * updateWorld(world) Этот метод вызывается каждый тик и передает объект игрового мира. Описание всего доступного интерфейса на текущий момент, можно найти здесь: http://pastebin.com/SYRSnar2 Пример скрипта, который загружается по умолчанию: function init(world) math.randomseed(os.time()) end local function randomBool() return math.random(0,1) == 1 end function updateTank(tank) local action = math.random(1, 20) if action == 1 then local dx, dy = 0, 0 if randomBool() then if randomBool() then dx = 1 else dx = -1 end else if randomBool() then dy = 1 else dy = -1 end end tank:move(dx, dy) elseif action == 2 then tank:fire() end end function updateWorld(world) end (https://github.com/MoonlightOwl/LittleTanks/blob/master/levels/script/default.lua) Здесь танк движется совершенно рандомно, время от времени стреляя. Таков его ИИ на большинстве уровней =) Итак Игра чертовски сырая, геймплей не сбалансирован, скриптовые интерфейсы требуют серьезной доработки, и английский язык хромает. Но тем не менее оно уже работает. Буду рад любым советам (может даже pull-реквестам ))), багрепортам, и предложениям. Изменено 26 июня, 2015 пользователем Totoro 8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arteminecrafter 74 Опубликовано: 21 июля, 2016 Сетевуху добавить надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 562 Опубликовано: 21 июля, 2016 Сетевуху добавить надо Мультиплеер? Гм. Это потребует основательной перестройки кода. Эта игрушка рассчитана чисто на сингл. Но если есть желание запилить поддержку самому - добро пожаловать! C радостью приму пулл-реквесты на GitHub. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Гость Kartze Опубликовано: 22 июля, 2016 Мультиплеер? Гм. Это потребует основательной перестройки кода. Эта игрушка рассчитана чисто на сингл. Но если есть желание запилить поддержку самому - добро пожаловать! C радостью приму пулл-реквесты на GitHub. Слишком тонко. А результат твоей работы очень мил на вид. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arteminecrafter 74 Опубликовано: 28 июля, 2016 (изменено) Notch же както зделал мультиплеер в Minecraft Изменено 28 июля, 2016 пользователем Arteminecrafter Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro Автор темы 3 562 Опубликовано: 28 июля, 2016 Notch же както зделал мультиплеер в Minecraft Чувак, ты о чём вообще? Да, сделать мультиплеер возможно. Да, можно сделать мультиплеер и в LittleTanks. Но! Это потребует довольно сильно переписать код игрушки, потому что, когда я её писал, я не включил мультиплеер в ТЗ. Была цель сделать синглплеерную аркаду. Если есть желание, ты можешь сам попробовать это сделать, и убедиться в моей правоте. (Ну или доказать обратное. =)) В случае Майнкрафта мультиплеер был заложен в проект с самого начала. И даже несмотря на это, они очень сильно, и не один раз, переписывали код по мере выхода новых версий. 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах