1

Je debute avec TIGCC et je suis face a un probleme insoluble pour un newbie ;-)

je me suis fixé un objectif simple mais posant des problemes qui me permettront de maitriser certaines techniques de base pour la suite: un sprite en niveaux de gris qui se balade dans l'ecran (sans jamais s'arreter, genre snake) grace aux touches directionnelles.

Pour cela j'utilise _rowread et je redirige donc AUTO_INT_1 comme l'indique la doc TIGCC.
Par contre on me dit qu'il faut desactiver egalement l'AUTO INT 5.

Et en effet si je me contente de devier l'auto int 1, l'anim' marche tres bien mais au moment ou je quitte le prog, j'ai une belle barre noire avec une ADDRESS ERROR.
Je suppose que ca vient de mon oubli de traiter la cas de l'auto int 5 ?

Comment fais-je (j'ai eu beau chercher dans le forum, comme on me l'a préconisé, je n'ai pas trouvé...) ?

naholyr

P.S: demandez moi le source si vous le voulez, je ne le joins pas a mon message, le dernier me semblait bien trop long.
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

2

>Et en effet si je me contente de devier l'auto int 1, l'anim' marche tres bien mais au moment ou je quitte le prog, j'ai une belle barre noire avec une ADDRESS ERROR.
>Je suppose que ca vient de mon oubli de traiter la cas de l'auto int 5 ?

Non, c'est puisqu'il faut remettre l'interruption d'origine à la fin du programme.

INT_HANDLER SaveInt1;
INT_HANDLER SaveInt5;
SaveInt1=GetIntVec(AUTO_INT_1);
SaveInt5=GetIntVec(AUTO_INT_5);
SetIntVec(AUTO_INT_1,DUMMY_HANDLER);
SetIntVec(AUTO_INT_5,DUMMY_HANDLER);
GrayOn();
/* Ton programme */
GrayOff();
SetIntVec(AUTO_INT_1,SaveInt1);
SetIntVec(AUTO_INT_5,SaveInt5);

[edit]Edité par Kevin Kofler le 01-09-2001 à 22:45:38[/edit]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Y a un exemple qui fait ca avec genlib.

4

>Racin: Y a un exemple qui fait ca avec genlib.

(attention Pub détectée! rage)

Peut-être, mais je ne crois pas qu'il y ait des doûtes à ce que naholyr veuille le faire sans genlib!
Et puis, pour un débutant, genlib est beaucoup trop difficile à utiliser et n'a pas vraiment d'intérêt.
Si les fonctions graphiques de TIGCCLIB ne suffisent pas, il y a ExtGraph.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

OK. T 'avais raison pour la pub (je me suis fait avoir!)
Mais copier/coller les sources de genlib est à la portee de tt le monde.
Et si il utilise genlib, il a plus rien à faire.

(OUI, il peut surement aussi utiliser Ext Graph, mais j 'en sais rien. Moi je sais que mes jeux (en developpenment, utilisent genlib. Je conseille, c 'est tout.)

6

Hum... j'ai "dévié" l'auto int 5 comme le 1.
Je precise que je n'oubliais pas de remttre l'int a son etat d'origine a la fin.

Et maintenant le sprite ne demarre plus...
Je vous donne le source, je commence a desesperer !
Me suis-je fixé un objectif si compliqué ?

#define OPTIMIZE_ROM_
#define SAVE_
#include <tigcclib.h>
short _ti89;

// Effacer tous les ecrans (nuances de gris)
short ClrScrGray() {
  TRY
    if (IsGrayMode()) {
      SetPlane(LIGHT_PLANE);
      ClrScr();
      SetPlane(DARK_PLANE);
      ClrScr();
    }
    else {
      ClrScr();
    }
    return(1);
  ONERR
    return(0);
  ENDTRY
}

// Afficher le sprite
void DispSprite (short x, short y, short h, unsigned char *Light, unsigned char *Dark) {
  Sprite8 (x, y, h, Light, GetPlane(LIGHT_PLANE), SPRT_XOR);
  Sprite8 (x, y, h, Dark, GetPlane(DARK_PLANE), SPRT_XOR);
}

// Attend x /20 secondes
void delay(short x) {
  OSFreeTimer(USER_TIMER);
  OSRegisterTimer(USER_TIMER, x);
  while (!OSTimerExpired(USER_TIMER));
}

// Main Function
void _main(void)
{
  short fin=0;
  short x=0, y=0;
  signed char xx=1, yy=0;
  unsigned char Curs_LIGHT[] = {0x3C,0x42,0x99,0xBD,0xBD,0x99,0x42,0x3C};
  unsigned char Curs_DARK[] = {0x3C,0x7E,0xE7,0xC3,0xC3,0xE7,0x7E,0x3C};
  // on redirige AUTO INT 1 & 5 vers "rien" pour utiliser a la fois les
  // niveaux de gris et _rowread.
  INT_HANDLER save_int_1;
  INT_HANDLER save_int_5;
  save_int_1 = GetIntVec (AUTO_INT_1);
  save_int_5 = GetIntVec (AUTO_INT_5);
  SetIntVec (AUTO_INT_1, DUMMY_HANDLER);
  SetIntVec (AUTO_INT_5, DUMMY_HANDLER);
  // On peut envoyer le GrayOn sans problemes maintenant.
  GrayOn();
  ClrScrGray();
  DispSprite(x, y, 8, Curs_LIGHT, Curs_DARK);
  // boucle de deplacement
  while (fin!=1) {
    delay(1);
    if (_rowread(0x7E)&0x2) {
      // gauche
      xx=-1; yy=0;
    }
    if (_rowread(0x7E)&0x8) {
      // droite
      xx=1; yy=0;
    }
    if (_rowread(0x7E)&0x1) {
      // haut
      xx=0; yy=-1;
    }
    if (_rowread(0x7E)&0x4) {
      // bas
      xx=0; yy=1;
    }
    if (_rowread(0x3F)&0x1) {
      fin=1;
    }
    // on efface le sprite.
    DispSprite(x, y, 8, Curs_LIGHT, Curs_DARK);
    // on change les coordonnées.
    x+=xx;
    y+=yy;
    // on vérifie qu'on ne sort pas de l'écran.
    // si c'est le cas on reparait de l'autre coté.
    if (y>92) y=0;
    if (x>152) x=0;
    if (y<0) y=92;
    if (x<0) x=152;
    // on affiche le sprite aux nouvelles coordonnées.
    DispSprite(x, y, 8, Curs_LIGHT, Curs_DARK);
  }
  SetIntVec (AUTO_INT_1, save_int_1);
  SetIntVec (AUTO_INT_5, save_int_5);
  GrayOff();
}
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

7

Il faut mettre GrayOff(); avant les 2 derniers SetIntVec.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

pour débuter avec rowread(), je te recommande d'utiliser ngetdelay() (dispo sur ticalc) et tu ne prend que ce dont tu as besoin smile
En HIBERNATION !
C'est une façon pour moi de dire merde à la société :D

MERCI sBibi ENCORE ET ENCORE POUR ...

From Grenoble.

9

raaaaah !!!
c'est enervant de simplicité...
Et bien merci beaucoup happy
(j'aurai surement besoin de vous bientot ;-))

ced38, kezaco (je ne trouve pas de lib ngetdelay chez ticalc, ni de prog asm chez ticalc, ni de fonction de ce nom dans tigcc) ?
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

10

Raté !
j'ai mis GrayOff() avant les deux derniers SetIntVec(...) mais ca ne fonctionne pas.
Au depart du programme le sprite ne bouge plus. Et on ne peut plus quitter le prog.
Comme si rowread ne fonctionnait plus en fait (je suppose que c'est ca).

Comment faire ? j'ai beau etudier les sources de jeux qui marchent, je ne trouve pas mon probleme ici !
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !

11

Enlève le delay(1). Tu utilises les timers de AMS là-dedans, et ils ne marchent qu'avec les interruptions activées.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

13

Mais alors comment faire une fonction du type:
void delay (short d) // wait for d/100 seconds
sans utiliser les timers ?!
Je commence a reussir a faire bouger un sprite. Ou bah je suis content !