Posar un temporitzador en els emuladors
Introducció
Hi ha emuladors on s'ha de posar moneda, i d'altres que no cal moneda. En aquests casos, el joc és lliure i pot haver-hi la necessitat de limitar la durada de les partides. Per exemple, una moneda, 20 minuts, independentment de les partides que es juga.
Desenvolupament
S'ha de modificar el frontend de manera que abans de llençar l'emulador, llenço un script que, en background, compta N segons (per exemple 20 minuts), i finalment mata el procés.
system("/path_to_frontend/kill_emulator.sh mame4all &");
system("/path_to_mame4all/mame4all rom")
kill_emulator.sh seria tan senzill com això:
#!/bin/bash t=$1 #echo $t sleep 10 killall -9 $t
Aquesta és una manera bèstia de sortir de l'emulador, però ha de funcionar.
A més, el front-end s'ha de modificar per tenir en compte el número de monedes/crèdits que tinc. De fet, es podria passar un segon paràmetre per dir el número de crèdits que tinc i fer num_credits*num_segons_per_credit.
En aquests casos, el botó Coin/Sel (tecla 5) ha de ser lliure, i el moneder físic ha d'estar associat a una altra tecla disponible. Si tots els pins GPIO estan utilitzats, com passa en les màquines de dos jugadors, es pot utilitzar el bótó menys utilitzat (el f, per exemple, l'últim botó del segon jugador).
Canvis en el front-end per gestionar el número de crèdits, i que el número de crèdits surti en pantalla:
#define NUM_CREDITS_X 0
#define NUM_CREDITS_Y 750
#define KEY_COIN SDLK_f
SDL_Surface *srf_num_credits;
SDL_Rect rect_num_credits;
int num_credits;
num_credits = 0;
quan volem pintar la primera pantalla, ha de sortir num_credits=0
//num_credits
string str_num_credits = "Num Credits: " + IntToString (num_credits);
srf_num_credits = TTF_RenderUTF8_Blended(font1, str_num_credits.c_str(), fgcolor_negre );
rect_num_credits.x = NUM_CREDITS_X;
rect_num_credits.y = NUM_CREDITS_Y;
rect_num_credits.w = srf_num_credits->w;
rect_num_credits.h = srf_num_credits->h;
SDL_FillRect (screen, &rect_num_credits, color_fons_taronja);
SDL_BlitSurface(srf_num_credits,NULL,screen,&rect_num_credits)
case KEY_COIN: //SDLK_f
if(key.state == SDL_PRESSED) {
num_credits++;
string str_num_credits = "Num Credits: " + IntToString (num_credits);
srf_num_credits = TTF_RenderUTF8_Blended(font1, str_num_credits.c_str(), fgcolor_negre );
rect_num_credits.x = NUM_CREDITS_X;
rect_num_credits.y = NUM_CREDITS_Y;
rect_num_credits.w = srf_num_credits->w;
rect_num_credits.h = srf_num_credits->h;
SDL_FillRect (screen, &rect_num_credits, color_fons_taronja);
SDL_BlitSurface(srf_num_credits,NULL,screen,&rect_num_credits);
SDL_UpdateRect(screen,0,0,0,0);
break;
}
quan llenço un emulador, estic gastant un crèdit
if (num_credits > 0) {
num_credits--;
string str_num_credits = "Num Credits: " + IntToString (num_credits);
srf_num_credits = TTF_RenderUTF8_Blended(font1, str_num_credits.c_str(), fgcolor_negre );
system("/home/joan/joanillo_arcade_frontend/kill_emulator.sh test_02 &");
system("/home/joan/joanillo_arcade_frontend/test_02");
}
A actualitzar_llista() i actualitzar_llista2():
SDL_BlitSurface(srf_num_credits,NULL,screen,&rect_num_credits);
SDL_UpdateRect(screen,0,0,0,0);
creat per Joan Quintana Compte, setembre 2016