Aller au menu - Aller au contenu

Icône Les timers

Avatar
Avatar
Mise à jour : 14/10/2009
Difficulté : Difficile Difficile
282 visites depuis 7 jours, classé 354/786
Nous avons appris beaucoup de choses jusqu'à maintenant, mais nous n'avons pas encore vu comment créer des timers. Par exemple, vous faites un jeu dans lequel les personnages meurent quand ils n'ont plus de vie (logique :) ), et vous voulez qu'ils disparaissent 3 secondes plus tard, donc il faut utiliser les timers !
Sommaire du tutoriel :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les timers PALib

La première méthode est : utiliser les compteurs de PALib.
Pendant que vous faites appel à PA_WaitForVBL, les compteurs actifs augmentent de 1. Ainsi, vous pouvez connaître le nombre de VBL depuis le lancement du timer (il ne reste plus qu'à diviser par 60 pour avoir un nombre de secondes).
Mais, s'il y a un compteur, il doit y avoir risque de dépassement, non ?

En fait, si le type est un int, vous pouvez attendre 414 jours, 6 heures, 3 minutes et 14.133 secondes environ. Si c'est un unsigned int, vous aurez le droit au double. Donc je pense qu'il n'y a pas de soucis de ce côté là :p ...

Voici le prototype de la fonction permettant de démarrer/redémarrer un compteur : void PA_VBLCounterStart(u8 c); c est le numéro du compteur (doit être compris entre 0 et 15 inclus). Pour mettre un compteur en pause, on utilisera void PA_VBLCounterPause(u8 c); , et pour qu'un compteur reprenne le compte, on utilisera void PA_VBLCounterUnpause(u8 c); . Enfin, pour accéder au contenu du compteur, il faut écire PA_VBLCounter[c] (le résultat est en VBL).
Voici un petit exemple :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <PA9.h>

int main(int argc,char **argv)
{
	PA_Init();
	PA_InitVBL();
	
	PA_InitText(1,0);
	
	PA_VBLCounterStart(0);
	
	while(1)
        {
	    PA_OutputText(1,0,0,"%d secondes",PA_VBLCounter[0]/60);	
	    PA_WaitForVBL();
	}
	return 0;
}


Vous ne pouvez utiliser que 16 compteurs en même temps. De plus, supposez que vous ayez un gros calcul à faire et qu'il vous prenne une seconde (sans appel à PA_WaitForVBL), votre compteur ne sera pas mis à jour, mais une seconde sera quand même passée. Donc vous aurez un contrôle du temps limité. La deuxième méthode, elle, évite ce problème.

La récupération directe du temps

C'est celle que j'utilise. Elle consiste à récupérer la durée en secondes depuis le 1er Janvier 1970 (c'est l'équivalent de la fonction time(NULL); qui ne fonctionne pas sur DS).
Voici la fonction (au départ je l'ai conçue en C++) :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int bi(int y)
{
    if((!(y%4)&&!(y%1000))||(!(y%4)&&(y%100)))
        return 1;
    else
        return 0;
}
unsigned int getTicks(void)
{
    unsigned int ret=0;
	int i;
	unsigned int mois[12]={31,0,31,30,31,30,31,31,30,31,30,31};
    for(i=0;i<30+PA_RTC.Year;i++)
        ret+=(bi(1970+i)?366:365)*24*3600;
    for(i=0;i<PA_RTC.Month-1;i++)
    {
        mois[1]=(bi(2000+PA_RTC.Year)?29:28);
        ret+=mois[i]*24*3600;
    }
    ret+=(PA_RTC.Day-1)*24*3600;
	ret+=PA_RTC.Seconds+PA_RTC.Minutes*60+(PA_RTC.Hour-1)*3600;
    return ret;
}

La fonction bi sert juste à savoir si une année est bissextile ou pas ; c'est la fonction getTicks qui nous intéresse.
Ainsi, nous pouvons faire le code suivant :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <PA9.h>

int main(int argc, char ** argv)
{
	PA_Init();
	PA_InitVBL();
	
	PA_InitText(1,0);
	
	PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL();
	
	unsigned int debut=getTicks();
	
	while(1)
	{
		PA_OutputText(1,0,0,"%d",getTicks()-debut); // Affiche le nombre de secondes depuis que le jeu est lancé
		PA_WaitForVBL();
	}
	
	return 0;
}

Voilà, vous connaissez les deux méthodes, à vous de choisir :) !
A présent, vous contrôlez le temps :diable: ...
Chapitre précédent Sommaire Chapitre suivant

Partager

Il n'y a pas encore de commentaire pour ce tuto.