Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » [C]Comment faire défiler une chaîne de caractères ?
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

[C]Comment faire défiler une chaîne de caractères ?

Posté le 04/07/2014 17:33

Bonjour, pour mon dernier jeu j'aurais besoin d'un bout de code en C qui me fasse défiler une chaîne de caractère (de taille variable) dans un rectangle dans l'écran.

Il se présenterais comme ça (en gros )
int Defilement=0;
const unisgned char *MaChaine[]={"Le truc que je veux afficher"};
while(1){
  [i]On copie le nombre de caractères à afficher de MaChain à partir de la variable de défilement dans MaChaineAffiche[/i];
  Txt_Text("MaChaineAffiche",x,y,TXT_MINISD,TXT_OR);
  Defilement++;
  if(Defilement==[i]Longeur de la chaine moins le nombre de caractères à afficher[/i])Defilement=0;  //Le défilement arrive au bout de la chaîne, on le remet au début de la chaîne.
}


Les trucs en italiques sont à remplacer par du code, mais je ne vois pas comment faire (pourtant j'ai essayé de comprendre sur le site du zéro ).


Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 17:34 | #


Il est inutile de faire de la copie.
D'abord, est-ce que l'espace à gauche du rectangle est utilisé ? Ce facteur pourrait simplifier l'algorithme -- et rendre le défilement plus agréable.
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 17:41 | #


J'ai pas trop compris ce que tu voulais dire
En gros je voudrais ça :
[Le truc a af] Défilement=0, petit temps de latence [e truc a aff] [ truc a affi] [truc a affic] ... [c a afficher] ici le défilement se réinitialise après un petit temps de latence, puis on recommence.
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 17:49 | #


Ok, j'avais pas compris ça.
Alors tu auras besoin de copie, mais c'est assez facile.
Voilà un code d'exemple, les seules valeurs que tu dois adapter sont celles que j'ai utilisées en define.
#define LENGTH 8
#define X 0
#define Y 0

const char *MaChaine[]={ "Le truc que je veux afficher" };
char buffer[LENGTH+1];
int i;
for(i=0;i<strlen(*MaChaine)-LENGTH;i++)
{
  strncpy(buffer,*MaChaine+i,LENGTH);
  buffer[LENGTH] = 0;
  Txt_Text(buffer,X,Y,TXT_MINISD,TXT_OR);
  GetKey(&key);
}
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 18:10 | #


Ok, merci Lephénixnoir, mais serait-ce possible de le mettre dans une boucle while ?
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 18:14 | #


Ben, tu sais une boucle for c'est juste une boucle while réduite.

#define LENGTH 8
#define X 0
#define Y 0

const char *MaChaine[]={ "Le truc que je veux afficher" };
char buffer[LENGTH+1];
int i = 0:
while(i<strlen(*MaChaine)-LENGTH)
{
  strncpy(buffer,*MaChaine+i,LENGTH);
  buffer[LENGTH] = 0;
  Txt_Text(buffer,X,Y,TXT_MINISD,TXT_OR);
  GetKey(&key);
  i++;
}
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 18:18 | #


...Désolé mais je me suis mal fait comprendre
Je veut dire que le texte défile et que lorsque le défilement arrive au bout de la chaine, on recommence comme ça :
"abcde"
[abc] [bcd] [cde] temps de latence [abc] [bcd] [cde] temps de latence etc...
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 18:27 | #


Ah, ok. Je te mets donc des Sleep().

#define LENGTH 8
#define X 0
#define Y 0

const char *MaChaine[]={ "Le truc que je veux afficher" };
char buffer[LENGTH+1];
int i;

while(IsKeyUp(30002))
{
  for(i=0;i<strlen(*MaChaine)-LENGTH;i++)
  {
    strncpy(buffer,*MaChaine+i,LENGTH);
    buffer[LENGTH] = 0;
    Txt_Text(buffer,X,Y,TXT_MINISD,TXT_OR);
    Bdisp_PutDisp_DD();
    Sleep(100);
  }
  Sleep(900); // + 100
}
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 18:41 | #


bon, j'ai trafiqué l'autre fonction (pas celle avec le sleep) et ça marche, car en fait, pendant le défilement je voulais d'autre actions (c'est un peu à l'arrache )
AffTxt=0;
Defilement=0;
while(!key_down(31)){            //Attend l'appuis de "EXE"
    ML_rectangle(64,43,126,61,0,0,0);    //Effaçage de la 3ème zone d'écriture
    if(AffTxt>=0 && AffTxt<1000)ML_bmp_or(ImTexteSucces[Z/3],65,44,61,7);    //Dessin du succè obtenu
    if(AffTxt>=1000)ML_bmp_or(ImExe,87,44,17,7);                        //Dessin de "EXE"

    strncpy(buffer,TextesSucces[Z]+Defilement,15);
    buffer[16]=0;
    Txt_Text(buffer,66,54,TXT_MINISD,TXT_OR);

    AffTxt++;
    if(AffTxt==1500)AffTxt=0;
    if(!(AffTxt%100))Defilement++;
    if(Defilement>strlen(TextesSucces[Z])-15)Defilement=0;

    ML_display_vram();                //Affichage du message de succè
    }

iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 18:45 | #


Est-ce que sans te casser la tête, tu pourrais me montrer ce que ça donne du coup ?
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 19:00 | #


Voici un
gif/vidéo
2048 Delux
alors, dans tout les cas, il faut que je rajoute les temps de latences ...
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 19:03 | #


Merci. Au début, je pensais que tu voulais faire un scrolling au pixel (ce qui est également faisable, quoique plus difficilement).
Ça rend plutôt bien, c'est cool.
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 19:06 | #


Ben merci Lephénixnoir, au pixel serrait pas mal, mais c'est pas moi qui chercherais comment faire (quoique je viens d'avoir une idée ). Maintenant je fais les latences pour avoir le temps de lire quand même .

PS : c'est la Dernière étape avant le test final de débogage après, c'est le post sur le site.
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 19:08 | #


En fait, il y a un problème avec le scrolling au pixel.
Le problème, c'est que la libText va toujours afficher le premier caractère en entier. Comme il devra disparaître progressivement, il faudra que tu effaces le début gênant ; mais pour cela, il te faut au moins 3-1 = 2 pixels "constants" à gauche du dernier pixel dans lequel le texte du scroll appraîtra.
Est-ce le cas ?
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 19:12 | #


Hum, je pensais à la même chose ... et oui, j'ai même 3 pixels constant à gauche .
Mais après pour pas s'embêter il en faudrais 4 à droite (si tu comprend ce que je veux dire) et il se trouve que la droite importe peux donc ça passerait .
Mais là j'ai la flemme, mais si tu veux me le faire, pas de soucis .
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 19:16 | #


Ben, il suffit de remplacer la commande Txt_Text() par une boucle à 4 itérations.
Là comme ça, je ne sais pas si ça va fonctionner -- de tout façon ça n'effacera rien -- mais tu peux toujours essayer.

int j;

AffTxt=0;
Defilement=0;
while(!key_down(31)){            //Attend l'appuis de "EXE"
    ML_rectangle(64,43,126,61,0,0,0);    //Effaçage de la 3ème zone d'écriture
    if(AffTxt>=0 && AffTxt<1000)ML_bmp_or(ImTexteSucces[Z/3],65,44,61,7);    //Dessin du succè obtenu
    if(AffTxt>=1000)ML_bmp_or(ImExe,87,44,17,7);                        //Dessin de "EXE"

    strncpy(buffer,TextesSucces[Z]+Defilement,15);
    buffer[16]=0;
    for(j=0;j<4;j++) Txt_Text(buffer,66-j,54,TXT_MINISD,TXT_OR);

    AffTxt++;
    if(AffTxt==1500)AffTxt=0;
    if(!(AffTxt%100))Defilement++;
    if(Defilement>strlen(TextesSucces[Z])-15)Defilement=0;

    ML_display_vram();                //Affichage du message de succè
    }
Kirafi Hors ligne Membre Points: 2174 Défis: 10 Message

Citer : Posté le 04/07/2014 19:17 | #


Ouai, ton truc pourrais fonctionner mais ce serait trop rapide
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 20789 Défis: 143 Message

Citer : Posté le 04/07/2014 19:23 | #


Pas moyen de mettre un Sleep() je suppose ?
Bon... je vais y réfléchir, mais je pense que je sais comment faire.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 48 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd