Создать игру, создание игр, конструктора игр, игровые движки, разработка игр, сделать игру
Приветствую Вас Гость · Вход · Регистрация  ·  Новые сообщения · Участники · Правила · Поиск · RSS
  • Страница 1 из 1
  • 1
Форум разработчиков игр » Программирование » C, C++, C# » Создание dll библиотеки для расширения функций движка.
Создание dll библиотеки для расширения функций движка.
_¿_ Дата: Воскресенье, 05.02.2012, 13:49 | Сообщение # 1
Просмотр профиля: _¿_

Сообщений: [1192]
Ресурсы для расширения функций 3d Rad



Многие меня спрашивали:
Если же Angel Script так похож на си что он прост,то на 3d RAD
можно работать на Си, и будет ли он считывать его?



Чтож,тема важная,так как мало кто знаком с подобным Языком
программирования
как Angel Script.Большинство игроделов знакомы
с гораздо более распростронённым его аналогом,С++.Нет движок не
будет видеть другой Язык программирования,только Angel Script.Но не
отчаивайтесь
дорогие программисты...Для даннного движка можно написать
свою .dll библиотеку, которая позволяет работать в 3d RAD

на C++.


Автор идеи и её исполнения пользователь с офицального сайта 3d Rad (cсылка на оффицальный сайт движка)
его никнеим jestermon

Цитирую:
Quote
"Я вижу много вопросов на форумах в отношении того, как используя сторонние .dll, расширить возможности 3D Rad. Так как я для разнообразия увлеклась с++, то подумала - сварганю-ка я небольшую демку в помощь тем, кто этим интересуется.

Идея в том, чтобы написать .dll, которая действует как мостик между 3D Rad и сторонними .dll и упаковывает стороннюю .dll в вашу собственную .dll. Затем использовать скрипт, чтобы упаковать вашу .dll. Надеюсь, всё понятно... "


Пример скрипта на 3d Rad
Code
//Example project for setting up a dll bridge call to another dll  

  //global dll handle  
  int DLLHandle = 0;  

  //------------------------------------------  
  //return the ascii value of a character  
  int ascii(string s)  
  {  
     string ASCIISET = " !'#$%&`(*+'-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_'abcdefghijklmnopqrstuvwxyz{|}~";  
     int p = iStringFind(ASCIISET,s,0,true);  
     return p+32;  
  }  

  //------------------------------------------  
  //set string in dll  
  void DllSetString(string txt)  
  {  
     int i, asc;  
     string s;  
     for(i=0;i<iStringLen(txt);i++)  
     {  
        iStringMid(s,txt,i+1,1);  
        asc = ascii(s);  
        iDLLArraySet(i,asc);  
     }  
     iDLLArraySet(iStringLen(txt),0); //null terminate string  
     iDLLCall(DLLHandle,"SetString",0);  
  }  

  //------------------------------------------  
  //set int in dll  
  void DllSetInt(int n)  
  {  
     iDLLArraySet(n,0);  
     iDLLCall(DLLHandle,"SetInt",0);  
  }  

  //------------------------------------------  
  //get string from dll  
  string DllGetString()  
  {  
     int i;  
     string str="";  
     float f;  
     bool done = false;  
     i=0;  
     while(!done)  
     {  
        f=iDLLArrayGet(i);  
        i++;  
        if(f != 0)  
        {  
           str+=" ";  
           str[i] = f;  
        }  
        else  
           break;  
        if(i>1000) break;  //limit release  
     }  
     return str;  
  }  

  //------------------------------------------  
  void DllDosomething()  
  {  
        iDLLCall(DLLHandle,"ExecSomething",0);  
  }  

  //========================================  
  void Main()  
  {  

     if (iInitializing())  
     {  
        DLLHandle = iDLLLoad(".\\3DRad_res\\objects\\Script\\raddllbridge.dll");  
        if (DLLHandle != 0)  
        {  
           string txt = "This is some text to write to a file";  
           int len = iStringLen(txt);  
           DllSetString(txt);  
           DllSetInt(len);  
           DllDosomething();  
        }  
     }  
     else if (iDeinitializing())  
     {  
        if (DLLHandle != 0) iDLLUnload(DLLHandle);  
     }  
  }


Пример 3D Rad упаковщика .dll на С
Code
#include <windows.h>  
  #include <stdio.h>  
  #include <string.h>  
  #include <stdlib.h>  

  //reference to function in worker dll (remember to set the lib/a link)  
  extern int DoSomething(char* name,int length);  

  //3D Rad dll wrapper for DoSomething function above  
  __declspec(dllexport) void ExecSomething(float* myData);  

  //export for 3D Rad dll calls  
  __declspec(dllexport) void SetString(float* myData);  
  __declspec(dllexport) void GetString(float* myData);  
  __declspec(dllexport) void SetInt(float* myData);  
  __declspec(dllexport) void getInt(float* myData);  
  __declspec(dllexport) void SetFloat(float* myData);  
  __declspec(dllexport) void GetFloat(float* myData);  
  __declspec(dllexport) void SetChar(float* myData);  
  __declspec(dllexport) void GetChar(float* myData);  

  char bridgeStr[1000];  
  float bridgeF;  
  int bridgeI;  
  char bridgeC;  

  //----------------------------------------  
  //Accepts float array from 3D Rad, and stores it as a char array  
  void SetString(float* myData)  
  {  
     int i;  
     char c;  
     for(i=0;i<1000;i++)  
        bridgeStr[i]=0;  
     for(i=0;i<1000;i++){  
        c = myData[i];  
        if(c)  
           bridgeStr[i]=c;  
        else  
           break;  
     }  
  }  

  //----------------------------------------  
  //returns a char array as a float array to 3D Rad  
  void GetString(float* myData)  
  {  
     int i,L;  
     char c;  
     L = strlen(bridgeStr);  
     for(i=0;i<L;i++){  
        c = bridgeStr[i];  
        myData[i] = c;  
     }  
     myData[L]=0;  
  }  

  //----------------------------------------  
  void SetInt(float* myData)  
  {  
     bridgeI = myData[0];  
  }  

  //----------------------------------------  
  void GetInt(float* myData)  
  {  
     myData[0] = bridgeI;  
  }  

  //----------------------------------------  
  void SetFloat(float* myData)  
  {  
     bridgeF = myData[0];  
  }  

  //----------------------------------------  
  void GetFloat(float* myData)  
  {  
     myData[0] = bridgeF;  
  }  

  //----------------------------------------  
  void SetChar(float* myData)  
  {  
     bridgeC = myData[0];  
  }  

  //----------------------------------------  
  void GetChar(float* myData)  
  {  
     myData[0] = bridgeC;  
  }  

  //----------------------------------------  
  void ExecSomething(float* myData)  
  {  
     //int not retuened in this example, but simple  
     //to return to 3D Rad with GetInt()  
     int res;  
     res = DoSomething(bridgeStr,bridgeI);  
  }

Пример: возможная сторонняя .dll на С
Code
#include <windows.h>  
  #include <stdio.h>  
  #include <string.h>  
  #include <stdlib.h>  

  __declspec(dllexport) int DoSomething(char* name,int length);  

  int DoSomething(char* name,int length)  
  {  
     FILE *fp;  
     fp = fopen("test.dat","w");  
     fprintf(fp,"I received %s,%d\n",name,length);  
     fclose(fp);  
     return 0;  
  }



Копиласт с сайта www.3drad.com/forum
перевод юзера Alec
Форум разработчиков игр » Программирование » C, C++, C# » Создание dll библиотеки для расширения функций движка.
  • Страница 1 из 1
  • 1
Поиск:

При полном или частичном копировании материалов сайта ссылка на Make-Games.ru обязательна. Make-Games.ru © 2008 - 2024 Хостинг от uCoz
Топ Разработка игр