PasjaGSM.pl
  Jesteś w: Forum > Licznik punktów.


Licznik punktów.

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Programowanie » Licznik punktów.
Poprzedni temat «» Następny temat
Autor Wiadomość
 
bobek_wb 
Starszy Użytkownik



Telefon: DCT-3
Operator: Era
Pomógł: 8 razy
Wiek: 29
Dołączył: 16 Wrz 2005
Posty: 232
Wysłany: 2006-01-14, 13:40   Licznik punktów.

Witam!!!

Wziołem się za zkończenie mojej gry. I chciałem dodać dwa liczniki jeden liczący strzały a drugi liczący punkty. Zajrzałem do źródeł Puzzli i zrobiłem dwie procedury.

PIERWSZA:
Kod:
//PROCEDURA LICZĄCA STRZAŁY
static void rysuj_shot(int shot)
{
 char shot_wynik[3];
 ltoa(shot,shot_wynik);
 freegfx_begin(FALSE);
 own_print_string(shot_wynik,60,10,own_get_font("tiny/plain"),DM_CLEAR);
 freegfx_end(FALSE);
}


DRUGA:
Kod:
//PROCEDURA LICZĄCA PUNKTY
static void rysuj_punkty(int punkty)
{
 char punkty_wynik[3];
 ltoa(punkty,punkty_wynik);
 freegfx_begin(FALSE);
 own_print_string(punkty_wynik,0,0,own_get_font("tiny/plain"),DM_CLEAR);
 freegfx_end(FALSE);
}


Tą funkcje ltoa wziołem właśnie z Puzzli bo pisało że zamienia z postaci liczbowej na postać tekstową.

A teraz problem: jak klikam F5(kompilacja skryptu) to wywala mi taki błąd:
Kod:

game.c: In function 'rysuj_shot':
game.c:66: warning: implicit declaration of function 'ltoa'
game.c:68: warning: passing argument 1 of 'own_print_string' from incompatible pointer type
game.c: In function 'rysuj_punkty':
game.c:78: warning: passing argument 1 of 'own_print_string' from incompatible pointer type


Czy ktoś wie co jest grane?
Ostatnio zmieniony przez mdawidm 2006-02-06, 18:31, w całości zmieniany 1 raz  
^
 
 
 
     
AdSense


yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-01-14, 17:43   

Oficjalnie funkcja ltoa() nie istnieje w NokiXie. Kiedys nazwalem tak jedna z funkcji znalezionych w firmwarze ale jej dzialanie nie bylo zgodne ze standardem ANSI (a ltoa() jest funkcja standardowa) wiec w inkludach jej nie ma. Mimo to skrypt powinien nadal dzialac bo LOCATE.rx nadal ja znajduje (dla kompatybilosci ze starymi skryptami). Oficjalnie nalezy uzyc funkcji ntoa() lub ntoa2(). Ich skladnia jest taka sama jakiej uzyles ty przy funkcji ltoa().

ntoa(int n, char *buf)
zamienia liczbe (0-65535) na string

ntoa2(int n, char *buf)
robi to samo ale liczby 0-9 zamienia na 00-09

drugi warning (assing argument 1 of 'own_print_string' from incompatible pointer type) jest spowodowany tym, ze funkcja own_print_string() rysuje nie tylko zwykle stringi ASCII ale takze Unicode oraz teksty z PPM'a. Dlatego jako pierwszego parametru oczekuje wskaznika na stała typu nokstr_t. aby pozbyc sie warninga nalezy zrobic rzutowanie:

own_print_string((const nokstr_t *)shot_wynik,60,10,own_get_font("tiny/plain"),DM_CLEAR);

Na koniec chcialbym zauwazyc, ze jako dmode podajesz DM_CLEAR - jesli nie rysujesz na czarnym tle to w takim wypadku nic sie nie narysuje.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
bobek_wb 
Starszy Użytkownik



Telefon: DCT-3
Operator: Era
Pomógł: 8 razy
Wiek: 29
Dołączył: 16 Wrz 2005
Posty: 232
Wysłany: 2006-02-06, 16:57   

I jeszcze jedno pytanko/problem: jak zrobić taki 5-cyfowy licznik punktów jak jest np. breaker'rze?
^
 
 
 
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-02-06, 20:31   

Poniewaz nie ma w firmwarze takiej malej czcionki licznik ten rysowany jest pewnym trikiem. Otórz do projektu dołączona jest bitmapa (bmap_little_font.bmp). Zawiera ona cyferki 0-9 narysowane jedna przy drugiej.

Bitmapa oczywiscie dolaczona jest do pliku C:
Kod:
extern const struct bitmap bmap_little_font;


Do rysowania sluzy funkcja:
Kod:
/* draws a string (only digits supported) using our own small font */
static void own_print_small(STRPTR s, ULONG x, ULONG y)
{
 struct bitmap b={NULL,0,3,5};

 y-=5;
 while(*s)
 {
  if((*s>='0')&&(*s<='9'))
  {
   b.data=(unsigned char *)(bmap_little_font.data+(*s-'0')*3);
   own_draw_bitmap(&b,x,y,DM_SET);
  }
  s++; x+=4;
 }
}


Jako parametrów oczekuje napisu (nie liczby!) oraz pozycji (x/y).

Przykladowo punkty (bo uzyte jest to tez do żyć oraz levelu) rysowane są funkcją:

Kod:
/* draws the number of collected points */
static void draw_points(void)
{
 char buf[6];
 freegfx_begin(FALSE);
 own_print_small("00000",7,5);
 ntoa(game->points,buf);
 own_print_small(buf,27-(strlen(buf)*4),5);
 freegfx_end(FALSE);
}


Jak widać funkcja rozpoczyna sesję rysowania (freegfx_begin()). Następnie rysuje same zera. Robi to po to, żeby jak mamy np. 15 punktów to po narysowaniu było "00015" a nie samo "15". Te zera są następnie nadrysowywane punktami. Do konwersji liczby punktów na napis użyłem funkcji ntoa() (opis w poprzednim poście). Ta kalkulacja pozycji X (27-(strlen(buf)*4)) służy do tego, aby tekst wyrównany był do prawej krawędzi. Po narysowaniu punktów z lewej strony będą wystawać spod nich te zera - i o to nam chodziło :D. Na koniec sesja rysowania jest konczona funkcja freegfx_close().
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 32
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-02-06, 20:54   

no i obecni można taką małą czcionkę samemu sobie zrobić i doać do projektu dzięki programowi Mikesza - sam kończę właśnie fonta do moich skryptów wysokiego na 5pikseli. zamieszczam tutaj fonta którego zrobiłęm włąsnie w ciągu 5 minut, tylko cyfry kropka spacja i dwukropek, jakbyś chciał :D

praktycznie identyczna do fontu digi_08 z N3410 : )
a tu link do fonta digi_05.font

pozdrawiam

[ Dodano: 2006-02-06, 20:58 ]
no i jedyne 131 bajtów :D
^
 
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-02-07, 01:53   

Tak, zalecam metodę którą przedstawił druidbartek. Jak powstawał Breaker to edytora jeszcze nie było. Fajna rzecz mieć taki program. Dziękujemy Mikeszowi :D.

Dodam, że aby dodać taką czcionkę do gry należy wrzucić ją do katalogu z projektem i do pliku _project.nrx dodać dyrektywę:

Kod:
#link_data digi_05.font


Następnie do pliku C dodać:

Kod:
extern const struct font digi_05;


Potem możemy już używać:

Kod:
own_print_string((const nokstr_t *)"1234", x, y, &digi_05, DM_SET);


Zaletą takiego rozwiązania jest to, że nasza czcionka będzie ściśle prywatna dla naszego skryptu (więc na pewno z niczym się nie pogryzie). Muszę jednak przyznać, że jeszcze tego w ten sposób nie testowałem. Ale to musi działać :D.

Pozdrawiam
[Yak]
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
_Brutus 
Moderator
dragon podśmiechujek



Telefon: Samsung Ace II
Operator: Plus
Pomógł: 49 razy
Wiek: 27
Dołączył: 20 Lis 2005
Posty: 1191
Skąd: Łódź
Wysłany: 2006-02-08, 17:01   

A ja mam takie pytanie, yak, mówisz, że nie ma takiej czcionki, a jednak z podobnej korzystają org. gry w nokii, np. snake... Czy to działa na podobnej zasadzie, jak z robieniem własnej, cz bitmapy? Zastanawiałeś się nad tym?
^
 
  Skype
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-02-09, 00:07   

nie wiem jak to tam jest zrobione ale to zabiera minimalna ilosc miejsca takze nigdy tego nie szukalem, szkoda mi bylo czasu.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: