У Милены появились новые возможности, и реализация интерфейса ТОМ+Милена может быть легче и красивее) и текст при прокрутке теперь не будет дёргаться. Нужно ли вообще это в данный момент или подождать стабильной версии (хотя вполне вероятно, к тому времени затея будет не актаульна)?
ТОМ+Милена
Сообщений 1 страница 4 из 4
Поделиться22010-11-14 19:23:01
У Милены появились новые возможности, и реализация интерфейса ТОМ+Милена может быть легче и красивее)
Поздравляю! Прогресс - это всегда хорошо и всегда радует!
Нужно ли вообще это в данный момент или подождать стабильной версии
В данный момент доступны 2 версии:
v.0.9.3.1 beta, которая не изменилась с начала года, и
v.0.9.4.7 alpha, которая вполне стабильна и скоро будет официально рекомендована для использования.
Для интеграции с Миленой важно то, что в новой версии ТОМа API кардинально изменился.
Новый API обкатан и в дальнейших версиях меняться не будет (если только расширяться).
Собственный графический интерфейс я также буду развивать. В частности будут возможности задать фоновую картинку, указать положение выводимого текста, вставка картинок в текст и т.п., но приоритет всё-же ставится на развитие парсера.
А в Милене это всё уже сейчас есть и работает. Поэтому интеграция была бы полезна.
Поделиться32010-11-14 19:49:20
Вот код интерфейса для работы с движком:
//...
//переменные для dll текстового движка
HINSTANCE EngineDll=0;
//ANSI функции текстового движка
typedef bool __stdcall (*InitFn)(void);
InitFn TomInit =NULL;
InitFn TomExit =NULL;
typedef const char* __stdcall (*strFn)(const char*,const char*,const char*);
typedef int __stdcall (*strRegFn)(const char*,strFn,int);
strRegFn RegFunction=NULL;
enum{ FnInput=1, FnOutput=2, FnOther=3 };
bool Exit=false;
bool KeyIsPressed;
//---------------------------------------------------------------------------
//...
//==============================================================================
// интерфейсные функции
//-------------------------------
const char* __stdcall PutText(const char*Login,const char*Text,const char*)
{ if(Text&&Text[0]) PutStr(Text); //выводим непустой текст
return 0;
}
//-------------------------------
const char* __stdcall PutDebug(const char*Login,const char*Text,const char*Color)
{ if(Text&&Text[0])
{ fly_control::curColor = GetColor(Color, strlen(Color), 0xFF008000); //зеленый
fly_control::curScale = 0.75;
Hyphenation(Text,strlen(Text)); //теги в тексте не обрабатываем!
fly_control::curColor = 0xFFC0C0C0; //серебро
fly_control::curScale = 1;
}
return 0;
}
//-------------------------------
const char* __stdcall PutError(const char*Login,const char*Error,const char*Code)
{ PutStr("\n\n");
if(Code&&Code[0])
{ //fly_control::curScale = 0.75;
PutStr("<font color=green>");
Hyphenation(Code,strlen(Code)); //без обработки тегов
PutStr("</font>\n");
}
//fly_control::curScale = 1;
PutStr("<font color=red>");
PutStr(Error);
PutStr("</font>");
return 0;
}
//-------------------------------
const char* __stdcall Pause(const char*Login,const char*,const char*)
{ //ждем нажатия клавиши
Disable=true;
KeyIsPressed=false;
do Sleep(500); while(!KeyIsPressed);
return 0;
}
//-------------------------------
const char* __stdcall InputCommand(const char*Login,const char*Invit,const char*)
{
if(InputOk)
{ //выводим командную строку
PutStr("\n<font color=silver>");
// PutStr(ComLine);
Hyphenation(ComLine,strlen(ComLine)); //без обработки тэгов
PutStr("\n");
//выставляем флаги
InputOk=false;
Disable=true;
//возвращаем введенную строку
return ComLine+ComLineInvit;
}
else if(Disable)
{ //устанавливаем приглашение
bool OkInvit=false;
if(Invit&&Invit[0])
{ ComLinePos=strlen(Invit);
if(ComLinePos<50)
{ memcpy(ComLine,Invit,ComLinePos);
OkInvit=true;
}
}
if(!OkInvit)
{ ComLine[0]='>';
ComLine[1]=' ';
ComLinePos=2;
}
ComLine[ComLinePos]='_';
ComLine[ComLinePos+1]=0;
ComLineInvit=ComLinePos;
//даем доступ к строке
Disable=false;
}
return 0; //не нажат enter
}
//-------------------------------
const char* __stdcall FnExit(const char*Login,const char*Text,const char*)
{ Exit=true; //глобальная переменная
return 0;
}
//==============================================================================
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR CmdLineArgs, int nCmdShow)
{ //----------------------------------
//запустим игру из командной строки
if(CmdLineArgs&&CmdLineArgs[0])
{ int L=strlen(CmdLineArgs);
if(L<90)
{ memcpy(ComLine+ComLineInvit,"run ",4);
memcpy(ComLine+ComLineInvit+4,CmdLineArgs,L+1);
InputOk=true;
}
}
//----------------------------------
//загружаем текстовый движок
EngineDll=LoadLibrary("tom.dll");
if(!EngineDll)
{ MessageBox(NULL, "Не удалось загрузить tom.dll!", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
return 0;
}
//получаем функции
RegFunction = (strRegFn)GetProcAddress(EngineDll,"RegFunctionANSI");
TomInit=(InitFn)GetProcAddress(EngineDll,"Init");
TomExit=(InitFn)GetProcAddress(EngineDll,"Exit");
if(RegFunction&&TomInit&&TomExit)
{ //регистрируем интерфейсные функции
RegFunction("print",PutText,FnOutput);
RegFunction("input",InputCommand,FnInput);
RegFunction("debug",PutDebug,FnOther);
RegFunction("error",PutError,FnOther);
//пауза
RegFunction("pause",Pause,FnInput);
RegFunction("пауза",Pause,FnInput);
//выход из программы
RegFunction("exit", FnExit,FnOther);
RegFunction("quit", FnExit,FnOther);
RegFunction("выход",FnExit,FnOther);
}
else
{ MessageBox(NULL, "Не найдены функции tom.dll!", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
return 0;
}
//----------------------------------
//загружаем графический движок
//...
if(TomInit()) //Starts running TOM
{ hge->System_Start(); //Starts running FrameFunc()
TomExit(); //Stop running TOM
}
//...
//Clean up and shutdown
//...
if(EngineDll) FreeLibrary(EngineDll);
return 0;
}
//==============================================================================Если что-то непонятно, спрашивайте...
Поделиться42010-11-14 20:28:41
В принципе, всё понятно... на следующей неделе может скрещу их. А может, и сегодня ночью)