Hirdetés

Alkalmazásfejlesztés badára: Hello Bada, avagy az első futtatható alkalmazásunk

A mai bejegyzés alkalmával megvizsgáljuk, hogy miként is néz ki egy badás alkalmazás “kerete”. Akik már fejest ugrottak a bada fejlesztés rejtelmeibe, azoknak valószínűleg nem sok plusz információt fogok tudni összeszedni, de tekintettel azokra, akik most szeretnék elkezdeni, úgy gondoltam, hogy szükség van egy ilyen témájú postra is. Egy "Hello World" típusú alkalmazás bemutatása már megtörtént a Developer Day-en is, ill. szinte minden, a témával foglalkozó fórumon találhattok forrásokat, tehát nem szándékozom feltaláni újra a spanyolviaszt, az SDK egyik projekt sablonját vesszük elő. Ennek kapcsán átvesszük a badás alkalmazások tipikus életciklusának fázisait. Essünk is neki!

Az SDK 1.0.0b3-as verzióját fogjuk használni, ennek beszerzését itt tudjátok megejteni. A fejlesztőkörnyezet  indítás után rákérdez az ún. workspace útvonalára, ahová dolgozni szeretnénk. Minden eclipse alapú környezet workspace-ekbe dolgozik, ez tulajdonképpen egy mappa lesz, ahová kerülnek a projektjeink, illetve az eclipse beállításai.

Figyelem: amennyiben áttérünk egy másik workspace-re, minden eclipse-es beállításunk visszaáll az alapértelmezettre (a környezet megjelenésével kapcsolatos beállítások, az alapértelmezett C++ fordító, kódformázás, stb.).

Az eclipse részletes bemutatása meghaladja ennek a bejegyzésnek a kereteit, így csak a fontosabb dolgokról ejtenék szót. A felületen látható elemek alapvetően két csoportba sorolhatóak, az egyik a view-k, a másik az editorok (ez esetünkben gyakorlatilag a C++ kódszerkesztő). A kezdőképernyőn egyelőre csak view típusú elemet látunk. Ezek közül a fontosabbak: Project Explorer, Resource Explorer, Console (a többit majd később). A Project Exporerben látszanak a workspace-ünkben található projektek, a Resource Explorerben jelennek meg az aktuálisan kiválasztott projekthez tartozó erőforrások (pl. form alapú alkalmazás esetében a felhasználói felület leírásáért felelős xml, vagy a lokalizációhoz szükséges fordításokat tartalmazó nyelvi állomány), a Console-t pedig az alkalmazásunk futtatásakor, illetve debugolásokar fogjuk haszánlni.

A következő lépésben létrehozunk egy új bada projektet. Ehhez nincs más dolgunk, mint rákattintani a File / New / bada Application Project menüpontra.

Itt a bada Frame Based Applicataion-t válasszuk, majd adjunk neki egy tetszőleges nevet (nálam FrameDemo).  A Finish gombra kattintva elkészül első bada alkalmazásunk. Ebben az állapotban a projekt még nem futtatható. Ahhoz hogy ki tudjuk próbálni, válasszuk a Project / Build Projekt menüpontot, majd ezt követően a Run / Run opciót. Itt ki kell választanunk, hogy szimulátorban, vagy konkrét eszközön kívánjuk-e futtatni a programot. Gyanítom, hogy nem sokatok rendelkezik egy Wave-vel, ezért válasszuk nyugodtan a szimulátoron való futtatást. Ha minden jól sikerült, akkor a következő képet kell látnunk magunk előtt rövid (vagy nem  is olyan rövid) idő után.

Nézzük meg, hogy pontosan mi mindent generált nekünk az eclipse. A projektet kibontva, találunk néhány mappát ill. állományt. Első körben, amivel tüzetesebben fogunk foglalkozni, az src és inc mappákban található FrameDemo.h, FrameDemo.cpp és FrameDemoEntry.cpp fájlok lesznek. A .h kiterjesztésű header fájlban található az alkalmazás fő osztályának a definíciós része, az alapvető dolgokon kívül, mint konstruktor, destruktor, található néhány függvény, melyek implementálása szorosan hozzátartozik programunk "éles környezetben" való helyes működéséhez. Hogy mit is értek éles környezet alatt? Képzeljük el, hogy mi történik akkor, amikor éppen frissen elkészült bada játékunkkal játszunk, az utolsó pályán vagyunk, epikus csatát vívunk a főellenséggel, pattanásig feszülnek az idegek, majd az "Anyu hív" felirat jelenik meg a kijelzőn, kizökkentve minket a mámorító pillanatból... Kedvesen elbeszélgetünk vele, elköszönünk és nyilván azt várnánk, hogy visszacsöppenünk a diadal előtti utolsó képkockákhoz, ehelyett viszont a "GAME OVER" felirat fogad minket. Erre szokták mondani, hogy olyan a szituáció, mint hiányos alsó öltözetben beleugrani egy csalánosba. A bada specifikációjának megfelelően saját alkalmazásunk semmiképpen sem akadályozhatja egy beépített funkció működését. Amennyiben ilyen esemény történik (telefon hívás érkezik, sms-t kaptunk, merül az akkumulátor, stb.), a mi felelősségünk ezek megfelelő kezelése. Jelen esetben a játék állásának elmentése, majd az aktuális állapot visszatöltése. Nézzük meg, hogy milyen az életciklusa egy bada alkalmazásnak.

Ha egy picit tanulmányozzuk a képet, akkor szembe fog tűnni, hogy a rajta található kis dobozok kísértetiesen hasonlítanak a header fájlban található függvényekre. Ha megnyitjuk a hozzá tartozó .cpp fájlt, láthatjuk, hogy a függvények nagy része nincs ténylegesen megírva, csak egy TODO felirat virít minden függvénytörzsben, ill. egy rövid leírás, hogy mi is volna a teendőnk. Mivel jelen alkalmazás semmilyen komoly logikát nem tartalmaz, ezért nem fogunk hozzá nyúlni ezekhez a függvényekhez, a későbbiekeben viszont, ahogy haladunk játékunk fejlesztésével, vissza fogunk térni ehhez a témához.

Az alábbi kódrészlet produkálja a program vizuálisan is érzékelhető működését. Amennyiben az alkalmazásunk előtérbe kerül (pl. rögtön induláskor), inicializálunk egy betűtípust, majd kiírjuk az alkalmazás nevét a vászonra.

void
FrameDemo::OnForeground(void)
{
// TODO:
// Start or resume drawing when the application is moved to the foreground.

Canvas* pCanvas = GetAppFrame()->GetCanvasN();
Font font;
font.Construct(FONT_STYLE_PLAIN | FONT_STYLE_BOLD, 50);
pCanvas->SetFont(font);
pCanvas->DrawText(Point(30, 30), GetAppName()); pCanvas->Show();
delete pCanvas;
}

Egy fájlról még nem esett szó, a FrameDemoEntry.cpp-ről, ez tulajdonképpen a program belépési pontja. Itt nem történik sok minden, amennyiben a programot paraméterekkel futtatjuk, először ezeket összegyűjtünk egy tömbbe, majd elindítjuk az alkalmazást.

int
OspMain(int argc, char *pArgv[])
{
result r = E_SUCCESS;

// kiirjuk a console-ra, hogy alkalmaz·sunk elindult
AppLog("Application started.");

// inicializ·ljuk a futtat·si paramÈtereket
ArrayList* pArgs = new ArrayList();
pArgs->Construct();
for (int i = 0; i < argc; i++)
pArgs->Add(*(new String(pArgv[i])));

// elinditjuk az alkalmazast, amennyiben sikertelen a futtatas, jelezzuk a hibat
r = Osp::App::Application::Execute(FrameDemo::CreateInstance, pArgs);
if (IsFailed(r))
{
AppLogException("Application execution failed-[%s].", GetErrorMessage(r));
r &= 0x0000FFFF;
}

pArgs->RemoveAll(true);
delete pArgs;
AppLog("Application finished.");

return static_cast(r);
}

Mára ennyi, a következő postban pedig egy hasonló komolyságú programot fogunk megnézni, ami már OpenGL parancsokat futtat. Mint látni fogjuk, a program funkciója valóban nem fogja meghaladni a mostani "Hello World"-öt, de a kód tekintetébben jóval több minden szorul majd magyarázatra.

Gyufa

UI: Aki teheti, hagyja a bada fejlesztést borongósabb napokra, irány a vízpart!

Azóta történt

Előzmények