Bobby Sixkilla
19/09/2006, 01h03
Afficher des scores avec Ximox
Auteur : rmstudiogames
Bon alors voilà le tuto est double en fait. La premiere partie montre comment afficher du texte en utilisant Ximox. Vous allez voir que c'est extremement simple
La deuxieme montre comment transformer un nombre (par exemple un score a 1942 au bout de 3mn de jeu pour un acharne ) en chaine de caracteres. J'ai codé ça car comme vous allez le voir, le sprintf est dramatiquement lent (mais c'est normal car il fait beaucoup de choses dont nous n'avons absolument pas besoin). Et le temps, c'est de l'argent, euh des fps pardon.
D'ailleurs, regardez les résultats avec un timer qui chronomètre à la vitesse du système (grosso modo à la fréquence du microprocesseur), c'est flagrant, on a un rapport 26!!!
http://rmstudiogames.free.fr/images/misc/Sprintf.png
Bon alors le but du jeu surtout, c'est d'eviter les divisions et les modulos qui viennent tout de suite à l'esprit quand on veut coder ça. Ces deux opérations sont EXTREMEMENT lentes sur la GBA ! Il faut donc s'en passer coute que coute. Restent donc la multiplication et l'addition. Ca tombe bien, ça suffit amplement.
Alors maintenant, passons au code, c'est quand même ça le plus intéressant
#include "Graphics.h"
#include "Text.h"
#include "Timer.h"
#include "stdio.h"
using namespace graphics;
using namespace text;
using namespace timer;
void xsprintf(char *string, long number, long numDigits)
{
long comp;
short iter;
while(numDigits != 0)
{
*string = '0';
for(comp = 1, iter = 1; iter < numDigits; comp *= 10, iter++)
;
while(number >= comp)
{
(*string)++;
number -= comp;
}
numDigits--;
string++;
}
*(++string) = 0;
}
int main(void)
{
long test, time1, time2, scan;
char string[10], string1[10], string2[10];
// On choisit le mode 0 et on active le background 0
SetMode0();
// On reserve le background 0 pour le text manager.
AllocateBackground(background::nBack0);
// On choisit une des deux fontes disponibles en standard.
InstallDefaultFont(dfFont1);
// On cale le timer 0 sur la frequence du systeme.
SetProperties(tTimer0, fSystem);
test = 124650;
// On resette le timer et on le demarre.
SetCount(tTimer0, 0);
Start(tTimer0);
xsprintf(string, test, 6);
Stop(tTimer0);
// Quand c'est termine, on stoppe le timer et on recupere sa valeur.
time1 = GetCount(tTimer0);
// Meme chose ici.
SetCount(tTimer0, 0);
Start(tTimer0);
sprintf(string, "%d", test);
Stop(tTimer0);
time2 = GetCount(tTimer0);
sprintf(string1, "%d", time1);
sprintf(string2, "%d", time2);
// On utilise les commandes du text manager pour afficher tous les resultats.
PrintCenter(2, "TEST D'AFFICHAGE DE NOMBRE !");
Print(2, 3, string);
Print(1, 5, "XIMOX SPRINTF");
Print(2, 6, string1);
Print(1, 7, "C LIBRARY SPRINTF");
Print(2, 8, string2);
while(1);
}
Voilà, j'ai laissé le code du xsprintf non commenté, ce n'est pas très compliqué.
Auteur : rmstudiogames
Bon alors voilà le tuto est double en fait. La premiere partie montre comment afficher du texte en utilisant Ximox. Vous allez voir que c'est extremement simple
La deuxieme montre comment transformer un nombre (par exemple un score a 1942 au bout de 3mn de jeu pour un acharne ) en chaine de caracteres. J'ai codé ça car comme vous allez le voir, le sprintf est dramatiquement lent (mais c'est normal car il fait beaucoup de choses dont nous n'avons absolument pas besoin). Et le temps, c'est de l'argent, euh des fps pardon.
D'ailleurs, regardez les résultats avec un timer qui chronomètre à la vitesse du système (grosso modo à la fréquence du microprocesseur), c'est flagrant, on a un rapport 26!!!
http://rmstudiogames.free.fr/images/misc/Sprintf.png
Bon alors le but du jeu surtout, c'est d'eviter les divisions et les modulos qui viennent tout de suite à l'esprit quand on veut coder ça. Ces deux opérations sont EXTREMEMENT lentes sur la GBA ! Il faut donc s'en passer coute que coute. Restent donc la multiplication et l'addition. Ca tombe bien, ça suffit amplement.
Alors maintenant, passons au code, c'est quand même ça le plus intéressant
#include "Graphics.h"
#include "Text.h"
#include "Timer.h"
#include "stdio.h"
using namespace graphics;
using namespace text;
using namespace timer;
void xsprintf(char *string, long number, long numDigits)
{
long comp;
short iter;
while(numDigits != 0)
{
*string = '0';
for(comp = 1, iter = 1; iter < numDigits; comp *= 10, iter++)
;
while(number >= comp)
{
(*string)++;
number -= comp;
}
numDigits--;
string++;
}
*(++string) = 0;
}
int main(void)
{
long test, time1, time2, scan;
char string[10], string1[10], string2[10];
// On choisit le mode 0 et on active le background 0
SetMode0();
// On reserve le background 0 pour le text manager.
AllocateBackground(background::nBack0);
// On choisit une des deux fontes disponibles en standard.
InstallDefaultFont(dfFont1);
// On cale le timer 0 sur la frequence du systeme.
SetProperties(tTimer0, fSystem);
test = 124650;
// On resette le timer et on le demarre.
SetCount(tTimer0, 0);
Start(tTimer0);
xsprintf(string, test, 6);
Stop(tTimer0);
// Quand c'est termine, on stoppe le timer et on recupere sa valeur.
time1 = GetCount(tTimer0);
// Meme chose ici.
SetCount(tTimer0, 0);
Start(tTimer0);
sprintf(string, "%d", test);
Stop(tTimer0);
time2 = GetCount(tTimer0);
sprintf(string1, "%d", time1);
sprintf(string2, "%d", time2);
// On utilise les commandes du text manager pour afficher tous les resultats.
PrintCenter(2, "TEST D'AFFICHAGE DE NOMBRE !");
Print(2, 3, string);
Print(1, 5, "XIMOX SPRINTF");
Print(2, 6, string1);
Print(1, 7, "C LIBRARY SPRINTF");
Print(2, 8, string2);
while(1);
}
Voilà, j'ai laissé le code du xsprintf non commenté, ce n'est pas très compliqué.