dissabte, 21 de març de 2009

Qui vol fer JailGames?

Be, com sempre en vacances es quan menys temps se té per a fer coses d'estes. Entre arreglar la casa, estar amb el nano, eixir per ahí, etc... No obstant, he continuat perfilant les APIs internes. Es el treball menys divertit, pero en algun moment s'ha de fer.

Amb el nou DrawManager, carregar una imatge es tan senzill com:

TextureInfo *perico = drawManager->Load("prueba.png");

Internament controle si la imatge s'ha de carregar desde arxiu, desde un arxiu de recursos like faig en el Arounders, o desde on siga. Després, per a pintar l'imatge:

perico->Draw(xd, yd, wd, hd, xs, ys, ws, hs, angle);

On xd, yd, wd i hd son les coordenades de l'imatge al destí (al donar un ample i un alt es pot escalar al gust) i xs, ys, ws i hs son les coordenades de l'imatge a l'origen (per a agafar el tile que interese), i angle es l'angle de rotació. Use PNGs i així la transparencia ja ve fixada en l'arxiu. Molt cómode. A més, tambe permet fer espill invertint les coordenades de l'oritge.

Si es vol fer un fade desde negre, pos:

drawManager->FadeIn();

I per al fade a negre igual pero amb FadeOut. Els fades son asincrons, o siga, que se li diu que el faça pero l'execució i pintat de l'escena continua com si res. Per al fadein no importa, pero el fadeout es sol fer al acavar, pel que despres de ordenar el fadeout, i abans de finiquitar, s'ha de comprovar que no estiga encara fent-se. Per a tal cosa he preparant un mètode que ens diu si s'està fent un fade (o el que siga):

if (exitSignal && !drawManager->Working()) exit = true;

Per suposat, quan acavem de pintar l'escena hem de fer el tipic:

drawManager->Flip();

Respecte al teclat, primer hem de actualitzar-lo:

exit = !inputManager->Update();

Aquest mètode torna false si s'ha pulsat el botó de tancar finestra, pel que es deu controlar per a actuar consequentment, sino no es podrà tancar la finestra amb l'aspa.

Una vegada actualitzat el teclat, nomes tenim que comprovar si la tecla pertinent està polsada:

if ( inputManager->IsUp() ) y-=2;

He preferit fer comprovacions genèriques (si s'ha pulsat la tecla o botó del pad que siga asignada a anar amunt) que no específiques (si s'ha polsat la tecla de cursor amunt) per a que el codi quede mes boniquet. Per suposat, la clase tindrà un mètode per a comprovar si s'ha polsat qualsevol tecla. Pero les comprovacions genèriques estàn per a les tecles usuals, que a més podràn ser configurades amb un mètode del tipus:

inputManager->SetUp(SDLK_UP);

On SDLK_UP es el codi de la tecla (en aquest cas correspon al cursor amunt).

La música es igual de senzilla. Un mètode per a carregar, altre per a play altre per a stop i poc més.

Amb açò es pot fer quasi qualsevol jailgame. Al pròxim post parlaré de tota la infrastructura que hi ha per baix per a poder programar un joc sense preocuparse de tot el voltant. Un bucle de joc simple, amb un sprite que no para de rotar, que pots moure amb els cursor, i que comença amb un fadein i acava amb un fadeout quedaria mes o menys així (la indentació no es veu be, pero com es un codi molt simple...):

void GameController::Go(GameInfo *pGameInfo)
{
bool exit = false; // Acavar el bucle principal
bool exitSignal = false; // Senyal de que l'acavada es imminent
int angle = 0; // Angle de gir de l'sprite
gameInfo = pGameInfo; // Info del joc, ja ho explicaré

int x = 0; // Coordenada x del sprite
int y = 0; // Coordenada y del sprite

TextureInfo *perico = drawManager->Load("prueba.png"); // Carreguem el dibuix
drawManager->FadeIn(); // Començarem amb un fadein

while (!exit) {
exit = !inputManager->Update();

if ( inputManager->IsUp() ) y-=2;
if ( inputManager->IsDown() ) y+=2;
if ( inputManager->IsLeft() ) x-=2;
if ( inputManager->IsRight() ) x+=2;

if ( inputManager->IsESC() ) {
exitSignal = true;
drawManager->FadeOut();
}

perico->Draw(x, y, 32, 32, 0, 0, 32, 32, angle);

drawManager->Flip();

angle+=2;
if (angle == 360) angle = 0;

if (exitSignal && !drawManager->Working()) exit = true;
}
gameInfo->estado = ESTADO_SALIR;
}

Prou simple, no?

3 comentaris:

  1. A vore .. per tal de poder anar compilant coses i anar fent proves like amb els manuals de basic de l'spectrum ... que necesite per a poder anar tirant? Es el que hi ha a la wiki?
    Així almenys deixe l'entorn preparat per anar fent cosetes. Per suposat el primer sería fer la clasica pilota que rebote per pantalla o es moga ('moc moc') a les ordres del pad o teclat.

    ResponElimina
  2. Per cert, estic rejugant-me el Starcraft (ara que el tinc en formato descargable) per anar fent camí al 2 :)

    ResponElimina
  3. Ah, i si, tens rao. En eixir-se'n de la rutina es quan menys temps tens de fer les coses que sols fer en els huequets que traus del dia a dia.

    ResponElimina