Autor Zpráva
Tona
Profil *
Zdravim. Mam naprogramovanou hru v Visual C++. Pouzil jsem funke Win32 API. Co by obnasole predelani kodu, kdybych chtel aby sel kompilovat pod linuxem ? Alespn strucene. Specha. Diky
thingwath
Profil
Těžko říct, bylo by třeba zhruba vědět co a jak, to se nedá z jedné věty vytušit :-) Možná změnit malou část, možná to přepsat celé. Projekt wine poskytuje každopádně i knihovnu (winelib) kde implementuje nějaký díl WinAPI. Použití ovšem nemusí být triviální (nikdy jsem to teda neviděl).
Bubák
Profil
Možná ti bude stačit, když hra půjde spustit pod wine. Víc bohužel nevím, tak neporadím.
WanTo
Profil
Tona
Záleží na tom, které funkce používáš. Doporučuji podívat se na multiplatformní knihovnu SDL, ta ve hrách dokáže nahradit přímé volání Win32 API (popř. API X serveru na Linuxu).
Tona
Profil *
Problem je v tom, ze ja jsem to delal jako bakalarskou praci a dotaz od oponenta zni, jak by to bylo asi slozite predelat kod, nebo musel by se vubec prdelavat aby sel ZKOMPILOVAT pod Linuxwm? Jelikoz nejsem vubec kovanej v programovani pod linuxem, tak vubec nevim.



Pridavam kus kodu.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg;
static int iTickTrigger = 0;
int iTickCount;

if (GameInitialize(hInstance))
{
// Inicializace herního stroje
if (!GameEngine::GetEngine()->Initialize(iCmdShow))
return FALSE;

// funkce pro kontrolu zpráv systému Windows
while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// zpraconání zprávy
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// Kontrola zda není program pozastaven
if (!GameEngine::GetEngine()->GetSleep())
{
// kontrola zda již nenastal nový cyklus
iTickCount = GetTickCount();
if (iTickCount > iTickTrigger)
{
iTickTrigger = iTickCount +
GameEngine::GetEngine()->GetFrameDelay();
HandleKeys(); //kontrola klávesnice
GameCycle();
}
}
}
}
return (int)msg.wParam;
}

// konec hry
GameEnd();

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Přesměrovíní všech zpráv systému Windows hernímu stroji
return GameEngine::GetEngine()->HandleEvent(hWindow, msg, wParam, lParam);
}


GameEngine::GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass,
LPTSTR szTitle, WORD wIcon, WORD wSmallIcon, int iWidth, int iHeight)
{
// nastavení členských proměných
m_pGameEngine = this;
m_hInstance = hInstance;
m_hWindow = NULL;
if (lstrlen(szWindowClass) > 0)
lstrcpy(m_szWindowClass, szWindowClass);
if (lstrlen(szTitle) > 0)
lstrcpy(m_szTitle, szTitle);
m_wIcon = wIcon;
m_wSmallIcon = wSmallIcon;
m_iWidth = iWidth;
m_iHeight = iHeight;
m_iFrameDelay = 50; // 20 snímků za vteřinu
m_bSleep = TRUE;
m_vSprites.reserve(50);
m_uiMIDIPlayerID = 0;
}
thingwath
Profil
No jestli asi... tak to se dá odhadnout. Podle toho kódu bych řekl, že relativně dost, ale moc se v něm nevyznám (právě proto soudím tolik :-)). S winelib by to možná šlo bez úprav (nebo s málem), ale provést to by bylo dosti nejednoduché, tipuju.

Nevypadá to, že by stačilo přepsat jenom kousek, moje odpověď na takovou otázku by zněla buď (možná) s winelib, nebo těžko a po nemalých úpravách.
jozob
Profil
OT: Ja budem ďaľší oponent. Čo by bolo treba prepísať, aby si to mohol skompilovať na Macu? :o)
WanTo
Profil
jozob
Se SDL to půjde zkompilovat téměř všude (cituji SDL supports Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. The code contains support for AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, and OS/2, but these are not officially supported.). A jak zkoumám ten kód, mám pocit, že by byl se SDL asi třikrát kratší.
jozob
Profil
WanTo
SDL je super vec. ;o)
WanTo
Profil
Mimochodem, SDL se může pyšnit takovými projekty, jako je třeba UnrealTournament 2003.
Toto téma je uzamčeno. Odpověď nelze zaslat.