1

Bonjour,


j'ai un petit programme contenant une simple boucle while, dans laquelle on affiche un caractère qu 'on deplace en fonction des touches appuyés:

  while(quit == 0)
  {
    ClrScr();
    if(_keytest (RR_ESC))
      quit = 1;

    if((_keytest (RR_RIGHT)) && (xHero < HEIGHT))
    {
      xHero += 1;
      //printf("x =%d", xHero);
    }

    if((_keytest (RR_LEFT)) && (xHero > 0))
    {
      xHero -= 1;
      //printf("x =%d", xHero);
    }

    DrawChar(xHero, 30, 169, A_NORMAL);


Mais un problème: le caractère déssiné à l' écran clignote. Je pense que cela est du a un manque de vitesse, et, je crois que ce problème est résolu par le double buffer, du moins sur pc. Donc existerait-il un "double buffer sur TI", et si non, comment régler mon problème ?



Merci d'avance.

2

Ca clignote car juste après avoir affiché ton caractère tu l'efface dans ta boucle.
pour faire un double buffer c'est simple il suffit de preparer le nouvel ecran dans un buffer virtuel pendant que le réel est affiché.

regarde la doc de PortSet et tu aura ce qu'il te faut smile
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/

3

Ton caractère clignote parce que tu l'efface immédiatement après l'avoir dessiné (la première instruction de la boucle while sert à effacer l'écran).
Pour éviter ce désagrément, tu peux utiliser un écran virtuel. La technique du double buffering classique n'est malheureusement pas appliquable telle quelle en noir et blanc (sur HW2). Le principe de ton écran virtuel srea simple : tu prends le temps de dessiner ce que tu as besoin d'y dessiner, puis quand tu as fini tu le copies sur l'écran réel. Ainsi, quand tu effacera ton écran virtuel au début, pour réafficher le caractère à sa nouvelle position, tu n'affecteras pas l'écran réel, donc il n'y aura pas de clignotement.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

ou simplement mettre à jour le caractère si c'est nécessaire de le déplacer embarrassed

5

squalyl^2 :
ou simplement mettre à jour le caractère si c'est nécessaire de le déplacer embarrassed

Sauf que dès qu'il y a bcp d'éléments, ça devient gourmand happy
avatar

6

Hum, j 'ai mis en place ce bout de code:

  unsigned char sprite1[] =
  {
    0xC3, 0x3C, 0xC3, 0x3C, 0xC3, 0x3C, 0xC3, 0x3C
  };
  char fScreen[LCD_SIZE];
  char sScreen[LCD_SIZE];
  char *aScreen[LCD_SIZE];
  memset(fScreen, 0, LCD_SIZE);
  memset(sScreen, 0, LCD_SIZE);
  memset(aScreen, 0, LCD_SIZE);
  PortSet(fScreen, 159, 99);
  PortSet(sScreen, 159, 99);
  PortSet(aScreen, 159, 99);

  unsigned short quit = 0;
  unsigned short screen = 1;
  while ( quit == 0 )
  {
    ClrScr();
  /*
    if(screen == 1)
    {
      aScreen = &fScreen;
      screen = 2;
    }else {
      aScreen = &sScreen;
      screen = 1;
    }
  */
    if ( _keytest( RR_ESC ) )
      quit = 1;

    if ( ( _keytest( RR_RIGHT ) ) && ( xHero < HEIGHT ) )
      xHero += 1;


    if ( ( _keytest( RR_LEFT ) ) && ( xHero > 0 ) )
      xHero -= 1;

    if(screen == 1)
    {
      Sprite8( xHero, 30, 8, sprite1, fScreen, SPRT_XOR );
      LCD_restore(fScreen);
      screen = 1;
    }else {
      Sprite8( xHero, 30, 8, sprite1, sScreen, SPRT_XOR );
      LCD_restore(sScreen);
      screen = 2;
    }
  }
  PortRestore();


Mais quant le sprite reste quelques temps immobile (disons 1/2 sec...) le sprite ne s'efface pas de l' écran !
J' ai essayer une autre solution: http://pub26.ezboard.com/ftichessteamhqfrm15.showMessage?topicID=110.topic (la première provient de la mêmepage), mais pour le même resultat....


Merci d' avance.

7

C'est n'importe quoi ce code.
Je ne comprends même pas comment tu as pu le faire tourner sans déclencher une "Protected Memory Violation" confus
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

8

Pour résoudre ton problème : déclare un écran virtuel ; redirige les opérations graphiques d'AMS dessus (avec PortSet) ; dessine ton image ; copie la à l'écran réel (LCD_MEM).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Hum oui en effet ca marche beaucoup mieux avec un seul ecran ! Mais question par simple curiosité: pourquoi mon exemple precedent ne marchait pas ( je le remets, j'avais oublié d' enlevez un ecran inutile grin ):
  unsigned char sprite1[] = 
  { 
    0xC3, 0x3C, 0xC3, 0x3C, 0xC3, 0x3C, 0xC3, 0x3C 
  }; 
  char fScreen[LCD_SIZE]; 
  char sScreen[LCD_SIZE]; 
  memset(fScreen, 0, LCD_SIZE); 
  memset(sScreen, 0, LCD_SIZE); 
  PortSet(fScreen, 159, 99); 
  PortSet(sScreen, 159, 99); 
 
  unsigned short quit = 0; 
  unsigned short screen = 1; 
  while ( quit == 0 ) 
  { 
    ClrScr(); 
    if ( _keytest( RR_ESC ) ) 
      quit = 1; 
 
    if ( ( _keytest( RR_RIGHT ) ) && ( xHero < HEIGHT ) ) 
      xHero += 1; 
 
 
    if ( ( _keytest( RR_LEFT ) ) && ( xHero > 0 ) ) 
      xHero -= 1; 
 
    if(screen == 1) 
    { 
      Sprite8( xHero, 30, 8, sprite1, fScreen, SPRT_XOR ); 
      LCD_restore(fScreen); 
      screen = 1; 
    }else { 
      Sprite8( xHero, 30, 8, sprite1, sScreen, SPRT_XOR ); 
      LCD_restore(sScreen); 
      screen = 2; 
    } 
  } 
  PortRestore(); 

?

10

L'utilisation d'un ecran virtuel se ferait plutôt comme ça:

//début du programme
LCD_BUFFER virtual;         //On declare un ecran virtuel
memset(LCD_MEM,0,LCD_SIZE);  //effacer l'écran
memset(virtual,0,LCD_SIZE); //effacer l'écran virtuel
PortSet(virtual,239,127);   //a présent les fonctions graphiques dessinent dans virtual

while(condition)
{
  //afficher des choses sur l'écran virtuel
  //avec Sprite8 par exemple 
  memcpy(LCD_MEM,virtual,LCD_SIZE); //on copie l'ecran virtuel sur l'écran
}

//fin du programme
PortRestore();  //à présent les fonctions graphiques dessinent sur l'écran
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

11

Il y a une petite erreur [que tu viens d'éditer, donc c'est bon smile] à la ligne 3 : c'est memset(LCD_MEM,0,LCD_SIZE); qu'il faut écrire. Mais en fait, cette ligne est un peu inutile : on peut tout aussi bien la supprimer.
Sinon, le modèle est bon wink
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

12

lol je viens à la seconde de le modifier en alignant mieux mes commentaires !
(faut dire que c'est dur de faire un DM de maths, guetter les réponses sur mon topic et répondre à un autre en même temps happy )
cette ligne est un peu inutile : on peut tout aussi bien la supprimer.
ouais c'est vrai.
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?