Ресурсы для расширения функций 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