( gsimon | 2008. 02. 02., szo – 09:11 )

Az 'interval' az SDL_AddTimer() első paraméterében megadott időzítési érték, azért van rá szükség, mert ennek a 'timer' rutinnak vissza kell adnia, hogy a futása után mennyivel később kéri a köv. ráhívást, és ha egyenlő időközönként szeretnéd hívatni, akkor ugye ugyanazt az értéket kell visszaadni - és ha már egyszer megmondtad az AddTimernél, akkor miért kelljen külön tárolnod :).
A 'void*' param azért van, hogy te magad is tudj általad tetszőlegesen felhasználható adatot csatolni az időzítéskéréshez, ugyanis ez a mező azt kapja meg, amit az SDL_AddTimer() utolsó paraméterének megadtál.
Ez arra jó, hogy ha pl. játékot írsz és a szörnyeket mozgatod időzítővel, akkor tudsz ilyet csinálni:


typedef struct _szorny_t
{
  ...
  int x, y;
  ...
} szorny_t;

...
UInt32 szorny_leptet(UInt32 interval, void *p)
{
  szorny_t *sz = (szorny_t*)p; /* lehetne 'this' is :) */

  ...
  sz->x ++;
  sz->y = 100 + 20*sin(sz->x);
  ...
  return interval;
}

...
szorny_t * sz[42];
int i;
...

for (i = 0; i < 42; i++)
{
  sz[i] = (szorny_t*)malloc(sizeof(szorny_t));
  sz[i]->x = 0;
  sz[i]->y = 0;
  SDL_AddTimer(100, szorny_leptet, sz[i])
}
...

Ezzel ugyanazt a timer rutint használhatod a szorny_t típus összes példányának a mozgatására, ugyanis a rutin az utolsó paraméterben megkaphatja az aktuális példány mutatóját. Félig-meddig ez már oop :).