ПроектыФорумУтилиты

OS2D engine - 2d мобильные игры на языке ObjectScript (единый ланчер для всех примеров)

#0
16:37, 3 сен 2014

Все откомпилированные примеры по использованию OS2D теперь запускаются одним и тем os2d-launcher.exe. Подробности тут.

===========================

Предлагаю вам новое видео от простого, но интересного примера SeqTween, подробности тут:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

===========================

Новый пример AngryMonsters, подробности тут:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

===========================

Всем привет, кто-то тут спрашивал про использования Oxygine (см. соседняя тема) на скриптовом языке. Мне Oxygine понравился (респект автору - Denis Muratshin) и я занялся разработкой OS2D поверх Oxygine.

OS2D предназначен для разработки на языке ObjectScript 2d мобильных игр. Главной особенностью движка является простота и механизм его интеграции с C++ кодом таким образом, что это позволило сделать OS2D очень быстрым, как и нативный движок на C++. Вы можете как разрабатывать всю игру на ObjectScript, так и писать код на C++ и делать вызовы функций на ObjectScript (как и наоборот).

По умолчанию основной код игры запускается в скрипте data/main.os.

Основной репозиторий проекта находится тут https://github.com/unitpoint/os2d , там же все необходимые библиотеки: SDL и Oxygine. В ходе разработки пришлось внести изменения в Oxygine во множество файлов, поэтому пропатченный фреймворк лежит в том же репозитории.

Достаточно открыть в студии examples\DemoOS\proj.win32\Demo_vs2010.sln и запустить. Чтобы попробовать OS2D, просто поменяйте что хотите в демке или скопируйте каталок с демкой для новой разработки.

Что интересно, можно разрабатывать на OS2D вообще без студии и компиляции C++ кода. Нужно просто один раз скомпилировать exe и положить его в data, после чего можно просто программировать на ObjectScript и запускать exe-шник для старта игры.

В случае каких-либо проблем, смотрим файл data-ram\out.txt, скролимся в самый низ, там наверняка будет полезная информация об ошибке. В ходе разработки папку data-ram можно чистить.

Начал подвязывать классы к ObjectScript, выглядит это так (см. ox-binder.h). Если вы хотите подключить класс, который еще не подключен, нужно сделать следующее:

1. в C++ классе добавить макрос OS_DECLARE_CLASSINFO(ClassName), класс должен быть унаследован от Object, например:

  class Event: public Object
  {
  public:
    OS_DECLARE_CLASSINFO(Event);

2. в ox-binder.h написать функцию регистрации класса в ObjectScript, примерно так:

+ Показать

Что есть на данный момент?

На данный момент есть несколько демок, которые запрограммированы полностью на ObjectScript (проверил их на Windows и Android), вот что получилось:

Код демки на ObjectScript тут https://github.com/unitpoint/os2d/tree/master/examples/DemoOS/data

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Еще видео:

+ Показать

Как выглядит код на ObjectScript?

Логически код выглядит идентично на C++, структурно ObjectScript похож на JavaScript, например, создать и проинициализировать спрайт основными свойствами можно так:

        var sprite = Sprite().attrs {
            // устанавливает картинку
            resAnim = res.getResAnim("light-red"),
            // позиция кнопки
            pos = vec2(@width/2 - offs, y),
            // пивот - логический центр кнопки
            pivot = vec2(0.5, 0.5),
            // добавляем кнопку в this
            parent = this,
            // немного расширим области для клика, т.к. сама кнопка маленькая
            extendedClickArea = 20,
            // приоритет сортировки кнопки
            priority = 10,
            // пример пользовательского свойства
            btnIndex = 0,
        }

А вот так подвесить слушателя на событие:

@addEventListener(TouchEvent.CLICK, function(ev){
    // ваш код тут
    // ...
})

Для более детального изучения кода, см. файлы data\*.os в демках.

Буду рад ответить на вопросы.

#1
19:35, 3 сен 2014

оо!! круто, я хотел скрипты для oxygine!
обязательно попробую и на тему попишусь.
надеюсь, что по скорости не уступает хотя бы луа?

#2
11:43, 5 сен 2014

Можно посмотреть демку с описанием исходников в этой теме.

Чтобы попробовать поюзать ObjectScript, возьмите откомпилированную версию демки DemoFloorOS и запустите DemoFloorOS\run.cmd

Вы можете изменить скрипты на ObjectScript (см. DemoFloorOS\data\*.os) и запустить вашу версию игры без перекомпиляции exe! Измененные скрипты откомпилируются автоматически при запуске.

Вот небольшое видео "игры" DemoFloorOS, но там специально не показано само прохождение (см. DemoFloorOS\run.cmd).

+ Показать
#3
23:21, 9 сен 2014

Ребят, залил большое обновление:

1. перенес скрипты OS2D engine в папку data/os2d, чтобы не путать с основной игрой
2. портировал с кокоса часть action-ов, что позволяет заворачивать одни экшины в другие.

Например, если у нас готов некий экшен определенной продолжительностью, то чтобы сделать его бесконечно повторяющимся, достаточно обернуть в RepeatForeverAction:

  fan.addAction(RepeatForeverAction(TweenAction{
    duration = 3.5, 
    angle = {from = 0, to = 360*2, ease = Ease.BACK_OUT}
  }))

Все экшины находятся в папке data\os2d\actions. При этом TweenAction предназначен для анимации любых свойств игрового объекта, причем в одном TweenAction можно задать сразу много свойств. Следующий пример демонстрирует анимацию двух свойств - pos и angle за две секунды:

  TweenAction {
      duration = 2,
      pos = {to = vec2(0, stage.height)},
      angle = {to = 45, fixRotation = true},
    }

А этот пример запускает бесконечную последовательность анимаций (взят из демки SeqTweenOS):

+ Показать

3. добавлены методы по запуску экшенов и заданий (см. data\os2d\std.os):

function Actor.addAction(action) - добавить и запустить экшен
function Actor.addTweenAction(duration, prop, from, to) - добавить и запустить TweenAction, это просто хелпер
function Actor.removeAction(action) - остановить и удалить у объекта экшен
function Actor.removeActionsByName(name) - остановить и удалить все экшены по имени

function Actor.addTimeout(delay, func) - запустить один раз функцию через таймаут в секундах
function Actor.removeTimeout(t) - удалить таймаут
function Actor.addUpdate(dt, func) - вызывать функцию обновления каждые dt секунд
function Actor.removeUpdate(t) - удалить функцию обновления

4. сохранены нативные tween-ы (addTween, removeTween, removeTweensByName), но duration теперь задается в секундах

5. исправлено падение ObjectScript

6. добавлен новый пример работы с экшенами SeqTweenOS:

7. добавлен новый пример ElasticTransitionOS:

8. добавлены все стандартные функции ease, включая Elastic, Bounce, Quart, Back и др., в том числе модификации In, Out, InOut и OutIn.

Например, Ease.ELASTIC_IN_OUT имеет следующий график:

qeasingcurve-inoutelastic | OS2D engine - 2d мобильные игры на языке ObjectScript (единый ланчер для всех примеров)

Эти функции можно использовать как в виде отдельных экшинов (EaseAction(action, easeType)), так и напрямую в TweenAction.

#4
20:11, 18 сен 2014

Привет всем!

Добавил новый пример AngryMonsters, видео:

+ Показать

Вы можете посмотреть исходники примера на OS тут https://github.com/unitpoint/os2d/tree/master/examples/AngryMonsters/data (конечно, все исходники на C++ тоже есть).

Чтобы самому скомпилировать пример, склонируйте (рекомендую SmartGit) репозиторий проекта OS2D и откройте в студии: examples\AngryMonsters\proj.win32\AngryMonsters_vs2010.sln

Если компилировать возможности нет, посмотрите уже запускаемый пример: https://github.com/unitpoint/os2d-bin-win/tree/master/AngryMonsters

Напоминаю, что можно менять скрипты без перекомпиляции exe, т.е. Вы можете что-то изменить и тут же попробовать результат, например, найдите в файле examples/AngryMonsters/data/main.os код:

for(var i = 0; i < 50; i++){
  createMonster()
}

и замените на

for(var i = 0; i < 150; i++){
  createMonster()
}

чтобы увеличить количество монстров с 50 до 150.

#5
4:59, 21 сен 2014

Привет всем!

Предлагаю вам новое видео от простого, но интересного примера SeqTween, видео:

+ Показать

Чтобы самому скомпилировать пример, склонируйте репозиторий проекта OS2D и откройте в студии: examples\SeqTween\proj.win32\SeqTween_vs2010.sln

Если компилировать возможности нет, посмотрите уже запускаемый пример: https://github.com/unitpoint/os2d-bin-win/tree/master/SeqTween

В примере показано

- как создавать спрайты
- как их позиционировать
- как работать с пивотом объекта
- как делать иерархию из спрайтов
- как делать твины разных свойств объектов, например, позиция (pos) и вращение (angle)
- показаны бесконечные и конечные во времени твины
- использование функций ease при интерполяции свойств твинов

Например, откроем main.os и найдем:

fan.addAction(RepeatForeverAction(TweenAction{
    duration = 3.5, 
    angle = {from = 0, to = 360*2, ease = Ease.BACK_OUT}
  }))

Здесь duration задает время твина в секундах, angle - свойство объекта (угол вращения вокруг пивота). При задании любого свойства можно задать начальное (from) значение, конечное (to), метод ease, а также просто конечное значение, например:

fan.addAction(RepeatForeverAction(TweenAction{
    duration = 3.5, 
    angle = 360*2,
  }))

Предлагаю вам самостоятельное сделать в примере эти изменения и посмотреть, какие будут отличия во вращении от первоначальной версии.

Так что интересного еще есть в этом примере?

Кроме обычной интерполяции значений свойств объекта, для свойства angle можно задать fixRotation, если поставить true, то вращение произойдет по ближайшему маршруту, т.е. как именно вращать, по часовой стрелке или против часовой такой твин определит автоматически. Поставьте в примере fixRotation в false, чтобы более детально увидеть разницу.

TweenAction {
      duration = 2,
      pos = {to = vec2(0, stage.height)},
      angle = {to = 45, fixRotation = true},
    },

Кроме этого система TweenAction в реальности ничего не знает о самих свойствах, она позволяет интерполировать любые свойства, в том числе не известные на текущий момент. Главное, чтобы у типа данных, представляющего это свойство был реализован оператор - (минус для вычитание двух значений свойства) и умножение на число. Поэтому сам код TweenAction одинаковый, что для opacity (тип float), что для pos (тип vec2), что для color (тип Color).

#6
17:50, 21 сен 2014

два вопроса:
1) есть ли редактор для OS (хотя бы фал настройки под Geany,Notepad++,Sublimate или подобный)
2) есть ли в запущеном приложении дебажный вывод команд скрипта (для отладки приложения)

#7
19:59, 21 сен 2014

divol13

1. Синтаксис ObjectScript на 99% совместим с JavaScript, поэтому достаточно использовать в вашем любимом редакторе для файлов *.os подсветку JS. Для редактора vim есть готовая подсветка синтаксиса objectscript.vim, разработанная hoopoepg.

2. Дебажный вывод сваливается в data-ram\out.txt и в консоль студии (в дебажной сборке). Можно самому туда скидывать дебаг из программы на OS функциями print, printf или echo. При запуске программы, предыдущий файл data-ram\out.txt переименовывается в data-ram\out-prev.txt.

Например, сделаем что-нибудь нехорошее "случайно" в нашей программе. Возьмем уже откомпилированный пример SeqTween, затем в файле SeqTween/data/main.os внесем ошибку в код. Для этого найдем:

  base.addAction(RepeatForeverAction(SequenceAction(
    TweenAction {
      duration = 2,
      pos = {to = stage.size, ease = Ease.BACK_IN_OUT},
      angle = {to = -45, ease = Ease.BACK_IN_OUT},
    },

и заменим stage.size на stage.size2. После чего сохраним файл и запустим SeqTween\SeqTween.exe. Демка перестанет работать, как мы планировали. Открываем файл SeqTween\data-ram\out.txt и наблюдаем:

--
[start] 2014-09-21 19:51:58.828

Unhandled exception: 'property "size2" not found in stage'

#0 os2d/std.os(535,2): {userdata#3325}.__get, args: {"i":"size2"}
#1 main.os(47,22): {{main}}, args: {}
#2 {{CORE}}: require, args: {"filename":"main.os","required":false,"source_code_type":0,"check_utf8_bom":true} 
#8
21:06, 21 сен 2014

ок, значит дебажный ехе-шник уже входит в сборку
то есть я могу переписать уже имеющийся скрипт и получить результат, после сохранения скрипта?
или надо будет перезапускать ехе-шник?

#9
21:21, 21 сен 2014

divol13

После изменения скрипта, нужно перезапустить exe-шник.

#10
18:56, 22 сен 2014

Все откомпилированные примеры по использованию OS2D теперь запускаются одним и тем же os2d-launcher.exe (раньше каждый пример содержал свой запускаемый файл и набор dll-ок). Такой подход существенно уменьшил размер репозитория OS2D binaries.

Как это возможно?

Теперь все сборки приложений OS2D под windows поддерживают дополнительные параметры командной строки. Ключом -a добавляется папка с ресурсами проекта. Указав папку примера, мы фактически только его и запускаем. Например, демка AngryMonsters запускается файлом AngryMonsters.cmd, который имеет следующее содержание:

start os2d-launcher.exe -a AngryMonsters/data

Соответствующие файлы есть и для остальных примеров (SeqTween.cmd, DemoFloor.cmd и др.).

Что это дает?

1. Можно программировать на OS2D в быстром режиме, даже не использовав студию.

2. Можно добавлять или изменять уже готовые проекты, не меняя оригинал. Просто разместите новые файлы скриптов в отдельную папке и подключите ключом -a папку оригинала, а затем опять ключом -a новую папку. Те папки, которые идут позже в командной строке, имеют больший приоритет. Когда идет открытие файла, происходит его поиск по всем папкам ресурсов, начиная от большего приоритета к меньшему.

#11
20:39, 22 сен 2014

это хорошо, теперь еще добавить кнопку для перезапуска игры с новым(отредактированным) скриптом
чтоб каждый раз не тыкать в ехе-шник, а в идеале чтоб движок сам следил за обновлением папки проекта
и перезагружал игру при каждом сохранении файла - как это в корона СДК.

#12
18:28, 23 сен 2014

Ну это все же не IDE для разработки, а приложение сделанное на OS2D в штатном исполнении.

ПроектыФорумУтилиты

Тема в архиве.