?

Log in

No account? Create an account
9 ноя, 2005 @ 23:31 LinderScript
Сегодня заработал наконец-то первый вариант скриптовой системы интегрированной в engine. Можно сказать, что удалось полностью интегрировать все наработки, кроме виртуальной машины и компилятора (ну он вообще и дальше будет жить отдельно).

Вот как всё это выглядит:



1) Где-то в глубине кода на С++ объявлен интерфейс:

class iApplet: public iScriptable
{
public:
    virtual void TestFloat(Lfloat P0) = 0;
    virtual void TestString(LString P0) = 0;
    virtual void TestRefString(LString& P0) = 0;
    virtual void TestConstRefString(const LString& P0) = 0;
    virtual void TestPtrString(LString* P0) = 0;
    virtual void TestFloatStr(Lfloat P0, LString P1) = 0;
    virtual void TestStrFloat(LString P0, Lfloat P1) = 0;
};


2) Пишем скриптовый файлик (пока на асме):

!!StaticClass0.1

StaticClass("TestClass")
{
  Extends iApplet
  Tunneler iApplet_Tunneler
  States()
  {
   State("Default")
   {
    Method("TestFloat")
    {
     ResultSize 0
     Parameters()
     {
      float 4
     }
     Code()
     {
     }
    }
    Method("TestString")
    {
     ResultSize 0
     Parameters()
     {
      string
     }
     Code()
     {
     }
    }
    Method("TestRefString")
    {
     ResultSize 0
     Parameters()
     {
      string
     }
     Code()
     {
     }
    }
    Method("TestConstRefString")
    {
     ResultSize 0
     Parameters()
     {
      string
     }
     Code()
     {
     }
    }
    Method("TestPtrString")
    {
     ResultSize 0
     Parameters()
     {
      ptr
     }
     Code()
     {
     }
    }
    Method("TestFloatStr")
    {
     ResultSize 0
     Parameters()
     {
      float 4
      string
     }
     Code()
     {
     }
    }
    Method("TestStrFloat")
    {
     ResultSize 0
     Parameters()
     {
      string
      float 4
     }
     Code()
     {
     }
    }
   }
  }
}


3) Дальше в С++ коде пишем:

Environment.Linker->LoadStaticClass( "test.staticclass" );

iApplet* Applet = Environment.Linker->Instantiate( "TestClass" );


printf( "Class name : %s \n", Applet->ClassName().c_str() );
printf( "Native class name: %s \n", Applet->NativeClassName().c_str() );

LString TestStrRef = "Hello LinderScript by reference";
LString TestStrPtr = "Hello LinderScript by pointer";

Applet->TestFloat( 0.1f );
Applet->TestString( "Hello LinderScript" );
Applet->TestRefString( TestStrRef );
Applet->TestConstRefString( "Hello LinderScript by const reference" );
Applet->TestPtrString( &TestStrPtr );
Applet->TestFloatStr( 0.2f, "String1" );
Applet->TestStrFloat( "String2", 0.3f );

4) Запускаем, отлаживаем, смотрим в отладчике как передаются параметры (сейчас поддерживается передача любых POD типов по значению + отдельный случай для std::string, указателей на любой тип, ссылки на любой POD тип и std::string). Вобщем, для дальнейшего кода на С++ совершенно не видно, что класс TestClass написан вроде как бы совсем и не на С++... :)

Скачать кое-что из исходников можно здесь: http://www.gamedev.ru/proj/?id=9



Crossposted to: ru_oo_scripting
corporateshark:
[User Picture Icon]
From:nikon_nlg
Date:Ноябрь, 9, 2005 12:45 (UTC)
(Ссылка)
можно под кат, да?
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:roboscop
Date:Ноябрь, 9, 2005 14:34 (UTC)
(Ссылка)
гламурно...
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:rageous
Date:Ноябрь, 9, 2005 18:15 (UTC)
(Ссылка)
очень готично
но мож все-таки под кат? :)
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:corporateshark
Date:Ноябрь, 10, 2005 02:06 (UTC)
(Ссылка)
Упс. Сорри, исправил.
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:rageous
Date:Ноябрь, 10, 2005 02:10 (UTC)
(Ссылка)
а вообще вцелом на самом деле действительно неплохо
компилятор-то уже написан или еще пишется?
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:corporateshark
Date:Ноябрь, 10, 2005 06:22 (UTC)
(Ссылка)
Да, написан. Это самое первое, что было написано, и самое простое, как потом выяснилось :(

Теперь вот надо автоматизировать экспорт классов из движка (т.е. в идеали хочется экспортировать всё и обновлять эту инфу автоматически, перед компиляцией) и обработку её компилятором скриптов.
(Ответить) (Уровень выше) (Ветвь дискуссии)