Forum Graph100

Forum Graph100

Vous n'êtes pas identifié.

Annonce

Bonjour et bienvenue sur le nouveau Forum Graph100 !
L'intégralité des données a été transférée sur un forum PunBB et tout les comptes sont fonctionnels avec le même nom d'utilisateur et mot de passe.
Un wiki est aussi disponible avec le même compte ! N'oubliez pas de remettre votre avatar, bon surf !
Pour plus d'informations, consultez ce post.

#1 02 Aug 2006 16:59:59

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

gxLib, Memzones, [et tous les autres petits problèmes]

Bon voila, j'ouvre ce topic car je débute la prog Casio, et j'ai des problème avec la GX-Lib :

Code:

#include <casio2.h>
#include <gxlib10.h>

/*Du code, et encore du code */

// dessine le plateau de jeu dans le buffer
void draw_plateau(void){
gxVLine(1,1,64,GX_BLACK);
gxVLine(128,1,64,GX_BLACK);
gxHLine(1,1,128,GX_BLACK);
gxHLine(64,1,128,GX_BLACK);
}

int main()                 // d‚but du programme
{
gxSetMode(true);       // passe en mode 5 couleurs




menu:    /*Du code, et encore du code */
    
jeu:
gxClearBuff;                  //éfface l'écran
draw_plateau();            // met le plateau de jeu dans le buffer
gxRefresh();               // rafraichis le buffer
getch();                   // attend la pression d'une touche


fin:
gxSetMode(false);       // repasse en mode C3
return(0);                 // quitte/retour au menu principal
}

Mais dans WinG100, j'ai un écran noir puis plus rien, au lieu d'avoir des lignes tout au tour de l'écran. Je sais bien que gxLib ne fonctionne pas avec Wing100, mais normalement, j'ai une image qui clignote, mais qui ressemble à quelque chose au moins...La j'ai...rien, du noir...

Quelqu'un a une idéee? Merci d'avance

Hors ligne

 

#2 03 Aug 2006 04:04:20

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

les gotos et les labels -en dehors des switch case break- c'est MAL.

J'vois pas de routine claire d'initialisation (les init(), quit() que tout programme G100 devrait avoir).

Coordonnées de l'écran de la G100:
0-127 en X
0-63 en Y

Ca veut dire qu'on ne dépasse pas ces nombres la! (excepté si les routines sont munies EXPLICITEMENT d'un clipping)

Et toi déjà tu écris en dehors de l'écran, d'ou résultats imprévisibles:

Code:

gxVLine(1,1,64,GX_BLACK);
gxVLine(128,1,64,GX_BLACK);
gxHLine(1,1,128,GX_BLACK);
gxHLine(64,1,128,GX_BLACK);

Aller hop, on corrige!


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#3 03 Aug 2006 14:26:15

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

128 pixels de large, 64 de haut. Les coordonnées débutant à 0, coordonnée maximale de (127,63).
C'est d'une telle logique que je ne sais pas pourquoi je n'ai pas trouvé ca tout seul... Merci Azor


Pas : tu peut me parler de ce que tu appellle les routines d'initialisation?

Hors ligne

 

#4 03 Aug 2006 16:45:33

nykosledieu
Team G100
Lieu: Strasbourg
Date d'inscription: 29 Jan 2002
Messages: 3028
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]


void draw_plateau(void)

mouarf la fonction mi-français mi-anglais
au moins ya pas de jaloux big_smile


Nykosledieu
nykosJEMMERDELESPAM@graph100.com - http://team.graph100.com
Venez sur le chat !!

Hors ligne

 

#5 03 Aug 2006 16:59:07

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

bah, du moment que c'est comprehensible.... roll

Hors ligne

 

#6 04 Aug 2006 02:51:18

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

bin disons, pour éviter les oublis perso, je fais toujours 2 fonctions Init() et Quit() qui permettent d'initialiser et de remettre la G100 en état de refonctionner normalement après... C'est question de structure deprogramme après


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#7 04 Aug 2006 09:45:49

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

D'ailleur, j'ai un pb avec inter(0); qui est censé desactivé l'APO et le clavier (j'ai trouvé ca dans une source d'un exemple)
"Undefined symbole _inter in module..etc"
J'ai pourtant regardé dans l'exemple, ils n'avaient aucun header que je n'ai pas...  :?


Et aussi, une petite question :
Julien m'a dit qu'il n'y avait aucune fonction pour ecrire du texte avec gxLib, qu'il fallait que je m'en fasse une. Ok, aucun problème, j'ai pris ma matinée et une bonne partie de l'apres midi (cf heure du post) pour me créer mes petites fonction, il y en a une qui gere l'affichage de chaines de caracteres, et l'autre qui gère l'affichages des valeurs numeriques naturelles, mais le problème, c'est que cela utilise des virgules...

J'ai donc reglé TurboC en conqéquence (Floating point : emulation) mais j'ai lu que

Il est fortement déconseillé de cocher "Émulation" car cela augmente considérablement la taille de l’ "exe"

Cela augmente t'il de beaucoup la taille de l'exe? (le jeu en vaut il la chandelle ? :P  )

Hors ligne

 

#8 04 Aug 2006 18:24:50

Julien
C++iste convaincu
Lieu: Waterloo (Be)
Date d'inscription: 29 May 2002
Messages: 1456
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Code:

void interrupt intnulle(...) {}

void inter(bool active)
{
    static ptr_inter  oldint9  = _dos_getvect(0x9),
                      oldint4A = _dos_getvect(0x4A);

    _dos_setvect(0x9,active ? oldint9 : intnulle);
    _dos_setvect(0x4A,active ? oldint4A : intnulle);
}

Il est fortement déconseillé d'utiliser les floats, également parce que ça entraîne une chute drastique des performances. Il y a très souvent moyen de s'en passer, avec un peu d'ingéniosité wink
Dans quel but as-tu besoin de nombres à virgule?

A part ça, Azor a raison: les fonctions ne sont pas là que pour contenir des morceaux de code qu'on appelle plusieurs fois, elle permettent aussi de masquer une partie du code a exécuter pour ne pas avoir à tenir compte de l'écriture exacte de ce code. Elles permettent de mettre en évidence la structure de ton programme en dissimulant un certain nombre d'opérations smile N'hésite pas à y recourir chaque fois que tu te dis "bon maintenant j'écris le code qui fait telle tâche" : écris une fonction qui réalise la tâche en question, et appelle cette fonction (celle-ci devant le plus souvent appeller un certain nombre de fonctions qui réaliseront de tâches plus simples lol )


Pensez à surveiller mes releases wink

Hors ligne

 

#9 11 Aug 2006 14:58:16

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Le problème d'aujourd'hui concerne....(suspens :tourne:)Les Memzones.

Code:

void highscores(unsigned int score){
  struct memory_zone bf;
  unsigned int Score1,Score2,Score3,Score4,Score5;
  int i;
  if((search_mem_zone(12,"DOBAHIGH", &bf)==-1)){      // si la zone n'existe pas
    if((create_mem_zone(12,"DOBAHIGH", 214, CREATE_ZONE))==-2){ //on la créé
      write(2,2,"Pas assez de memoire");              // sauf s'il n'y a pas assez de memoire
    }
  }

  read_mem_zone(&bf,&Score1,0,40);
  writevalue(20,0,Score1);

  read_mem_zone(&bf,&Score2,40,40);
  writevalue(20,6,Score2);

  read_mem_zone(&bf,&Score3,80,40);
  writevalue(20,12,Score3);

  read_mem_zone(&bf,&Score4,120,40);
  writevalue(20,18,Score4);

  read_mem_zone(&bf,&Score5,160,40);
  writevalue(20,24,Score5);

  gxRefresh();

}

J'explique un peu la fonction(qui ne fait pas encore ce qu'elle doit faire) :
On créé une Memzone si elle n'existe pas
Cette memzone est fait pour contenir 5 highscore de 5 chiffres
sous la forme 00000,00000,00000,00000,00000 mais sans les virgules (pour garder la place, et pasque c'est plus simple à gerer ^^)
Ca fait donc 5*5 charas *8 bit par chara, ca nous fait 200 bit + les 14 du header (pasque je suis pas en zone 1)(si j'ai bien tout saisis)

Ensuite elle place dans Score 1 les 5 premiers chiffres,; dans score 2 les 5 suivants, dans score 3 ...etc et affiche ces chiffres

Lorsque j'appelle cette fonction dans mon main(), tout marche impec jusque à la } finale, ou le prog s'arrete (sous WinG100, je suis pas suicidaire, j'ai pas essayé sur ma Graph)
L'erreur que l'on m'affiche dans le panneazu erreurs est tres explicite :P :P : ????

J'ai certainement oublié une subtilité, mais je ne voit pas quoi

Hors ligne

 

#10 11 Aug 2006 16:44:52

2072
Programmeur Graph100
Lieu: Somewherebourg
Date d'inscription: 29 Jan 2002
Messages: 2056
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

3 choses:

1, utilise une structure au lieu de 5 int en l'air ce sera plus simple
2, un int fait 2 octets, pas 40
3, tu ferais mieux d'utiliser la version beta avec les fonctions d'accès de type fichier (mopen, mwrite etc...).

le code:

Code:

read_mem_zone(&bf,&Score1,0,40);

écrit 40 octets à l'adresse de Score1 qui ne peut en contenir que 2... donc ça écrit n'importe où dans la mémoire...

Voici un exemple de fonction de highscore (celle de Formula 1 dans TOUCHE):

http://www.2072productions.com/test/memzexample.c.html


-~2072~-
Paid Emails
[URL=http://www.2072productions.com]2072productions.com[/URL]
[URL=http://www.casiocalc.org]casiocalc.org[/URL]

Hors ligne

 

#11 12 Aug 2006 02:24:41

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

ah, et au passage.

Que ce soit avec les memzones ou autre, quand on écrit la valeur d'un objet X, on écrit sizeof(X) octets...

Sur G100, sizeof(int)= 2

Une structure qui contient 5 champs à fonctions strictement identique tel 5 score est aussi du gachis, c'est mieux d'écrire un tableau directement...

Pour ce genre de "fichier" statique, j'pense qu'il faut se faire un plan de mémoire:

Scores: Offset 0, Taille 2*5 = 10o, Fonction "Permet de sauvegarder les scores du jeu"

Et donc:

Code:


#define MEMMAP_SCORES_OFFSET 0

#define SCORES_MAX 5
int Scores[SCORES_MAX];

...

// Lire le tableau
// La memzone doit etre ouverte dans Zone, et etre au BON FORMAT comme indiqué précédemment.
// Dès lors, la routine ne devrait pas subir d'échec. On pourrait se permettre de sauter le test de valeur de retour.
// On position (eventuellement on pourrait sauter, si on est sur que c'est bien positionné)
simple_mseek(MemZone, MEMMAP_SCORES_OFFSET);
mread(&Scores, sizeof(Scores), 1, &Zones);

// Ici ton jeu se déroule, etc, etc

...

// Fin du jeu, on sauvegarde les scores!
// Bin oui, sinon, y'aura pas les bons scores pour après...
// Au passage, soit on referme et on réouvre le fichier, soit on repositionne:
simple_mseek(MemZone, MEMMAP_SCORES_OFFSET);
mwrite(&Scores, sizeof(Scores), 1, &Zone);

De surcrois, quelques remarques:
> Un score sur un int16, ça va de -32768 à 32767. Ni plus, ni moins, prends en bien compte!
> On pourrait tricher éventuellement, mais bon... si on devait tout proteger, on ne pourrait faire qu'un pong...
> Il est préférable de travailler sur un tampon plutôt que directement sur le fichier... ça t'éviteras d'appeller msimple_seek, mread, mwrite comme un bourrin.

2072> Tu sauvegardait les rangs aussi? c'est marrant ça...


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#12 12 Aug 2006 05:57:02

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Une structure qui contient 5 champs à fonctions strictement identique tel 5 score est aussi du gachis, c'est mieux d'écrire un tableau directement.

Exact, mais elle va contenir aussi le nom des scorer, mais je verais ca apres

Un score sur un int16, ça va de -32768 à 32767. Ni plus, ni moins, prends en bien compte!

Donc sur un unsigned int (comme c'est le cas) jusqu'a 64 000 et des brouettes, et le mec qui fait 64 000 a Falldown, je lui offre ma calculette

On pourrait tricher éventuellement

Si il modifie la valeur avec un utilitaire coimme touche par exemple?


_________________


tu ferais mieux d'utiliser la version beta avec les fonctions d'accès de type fichier (mopen, mwrite etc...).

J'ai lu que les test que tu avait éfectué n'étaient pas tres poussées :?  :?




Je vais refaire ma fonction, et je vous dirais quoi. Merci à vous deux

Hors ligne

 

#13 12 Aug 2006 11:50:43

2072
Programmeur Graph100
Lieu: Somewherebourg
Date d'inscription: 29 Jan 2002
Messages: 2056
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]


J'ai lu que les test que tu avait éfectué n'étaient pas tres poussées   

ils sont assez poussés, mais j'ai pas fait de stress tests... mais c'est ce qui est utiliser dans TOUCHE et y'a pas de problème.


Si il modifie la valeur avec un utilitaire coimme touche par exemple?

voilà, c'est pour á que ma fonction de highscore fait un test CRC pour éviter les tricheurs^^


2072> Tu sauvegardait les rangs aussi? c'est marrant ça...

ouais^^ c'est pour afficher les scores dans l'ordre sans devoir les classer, le rang c'est la ligne où le nom et le score s'affiche sur la calto


-~2072~-
Paid Emails
[URL=http://www.2072productions.com]2072productions.com[/URL]
[URL=http://www.casiocalc.org]casiocalc.org[/URL]

Hors ligne

 

#14 12 Aug 2006 13:09:53

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Code:

if(search_mem_zone(12,"DOBAHIGH",bf)==-1){            // si la zone n'existe pas
     if(create_mem_zone(12,"DOBAHIGH",5*sizeof(int)+5*sizeof(char[4]),RESIZE_ZONE)==-2){// on la créé
        write(2,20,"Pas assez de memoire");             // sauf s'il n'y a aps assez de memoire
        return(-1);                                     // on renvoie alors -1
     }
     for(i=0;i<=4;i++){                                 // et on la remplie avec les valeurs par défaut : 0 pour les scores, AAA pour les noms
       write_mem_zone (bf, &Scores.score[i], i*sizeof(unsigned int), sizeof(unsigned int));
     }
     for(i=0;i<=4;i++){
       write_mem_zone (bf, &Scores.nom[i], 10+i*sizeof(unsigned char[4]), sizeof(unsigned char[4]));
     }
  }

Ce code est cencé creer un fichier DOBAHIGH s'il n'existe aps déjà, et s'il y a assez de memoire et de le remplir avec les scores par défaut 5 int qui valent 0, et les noms par défaut 5 char[4] qui valent 'AAA'. Mais je constate avec des utilitaires comme 'touche' que ce code ne marche pas, aucun fichiers n'est créé en definitive.

En fait j'ai bossé toute l'apres midi sur ma fonction, et je me suis rendu compte qu'elle ne marche pas. (logique  :P ) au moment d'afficher les high scores, il n'affiche rien. (normal, ya pas le fichier.)

Hors ligne

 

#15 12 Aug 2006 16:23:25

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

rohlala.... C'est quoi cette horreur...

Code:

for(i=0;i<=4;i++){
write_mem_zone (bf, &Scores.score[i], i*sizeof(unsigned int), sizeof(unsigned int));
     } 

Mets directement:
write_mem_zone(bf, &Scores, 0, sizeof(Scores))

Ensuite... après avoir créé ton fichier memzone, tu dois le rechercher à nouveau!
Tu remarqueras que la fonction de création de memzone ne prend pas le descripteur de memzone en compte!
Donc celui ci ne "pointera" aucunement vers le nouveau fichier.
Donc hop, tu refais un search_mem_zone après create_mem_zone...

Edit: Punaise, mais c'est qu'il m'redonnerait presque envie d'm'y remettre...


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#16 12 Aug 2006 17:45:51

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Code:

f(search_mem_zone(12,"DOBAHIGH",bf)==-1){            // si la zone n'existe pas
     if(create_mem_zone(12,"DOBAHIGH",5*2+5*4,RESIZE_ZONE)==-2){// on la créé
        write(2,20,"Pas assez de memoire");             // sauf s'il n'y a aps assez de memoire
        return(-1);                                     // on renvoie alors -1
     }
     write_mem_zone(bf,&Scores, 0, sizeof(Scores));
  }
  search_mem_zone(12,"DOBAHIGH",bf);
  read_mem_zone(&bf,&Scores, 0, sizeof(Scores));   // on lit tous les scores & noms
 
/* on affiche les scores, on insere le score du joueur et son nom si necessaire dans Scores.score et Scores.nom, on fait bien attention à ne pas ecrire hors de ces tableaux */

  write_mem_zone(bf,&Scores, 0, sizeof(Scores));  // on ecrit le nouveaux tableau des scores

  mclose(bf);       // on ferme le fichier
  return(0);        // on indique que la fonction s'est bien passée
}

Voila, je vous ai donné la fonction en entiere, ca va peut etre plus vous aider. J'ai refait un search mem zone, mais ca n'a pas aidé, le probleme est que la zone ne se créé pas, je ne la voie aps avec Touche (alors que la zone TEST, on la voie (zone créé avec l'exemple du readme)

Edit: Punaise, mais c'est qu'il m'redonnerait presque envie d'm'y remettre...

Te gène pas, je suis sur que ya plein de gens qui attendent que ca...
Tu pourrais en faire baver des Tiistes.... :P  :P  :P  :P  :P


rohlala.... C'est quoi cette horreur...

POurquoi faire simple quand on peut faire compliqué???

















Ok, je sort ------------------> []

Hors ligne

 

#17 13 Aug 2006 04:52:20

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

sur G100 t'es forcé d'utiliser le moins d'instruction -donc le moins d'appel de fonctions- possible pour garder la taille de la mémoire correcte...

tu devrais écrire la valeur de retour exacte de create_mem_zone, au lieu de penser qu'elle ne sera que 2... ça t'aidera surement plus!


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#18 13 Aug 2006 09:21:18

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Finalement, j'ai réussi, il m'a fallut du temps, mais j'ai compris!

Aussi bizarre que ca puisse parraitre, les scores n'apparaissent pas en clair dans Touche. J'ai les noms, qui se succedent, mais les scores quand à eux semble materialisés par des caracteres illisibles. Remarque, ce n'est pas plus mal, mais ca m'étonne. Je sortirais tres prochainment une version contenant les highscores, ainsi que la correction de quelques bug (aha, vous les avez pas vu!!) roll


EDIT : ya pas moyen de faire en sorte de ne pas compiler des fonction dans memzones .h autremùent que de les metre en commentaire dans le h et le c?
Ce serait kewl...

Hors ligne

 

#19 13 Aug 2006 13:35:44

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

normalement, si elles ne sont pas appellées, le compilo est censé ne pas linker les fonctions en question.
Mais c'est peut etre pas le cas, y'a peut etre une option à cocher...

Sinon, Touche affiche la mémoire sous forme de caractere (bien que dans mes souvenirs, il est possible de regarder sous d'autres formes), c'est pourquoi au lieu d'un score sous la forme 00000, t'auras 2 caractères (puisqu'un int16 est codé sur 2 char) affichés.


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#20 13 Aug 2006 13:57:01

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Donc on ne peut pas modifier de maniere directe les chiffres, donc la triche est de ce cas limité! A moins de modifier comme ca les 2chara et d'en mefttre 2 auitres au pif en esperant que ca fera un score important. Sinon il faut savoir comment sont codés tel et tel caractéer, et savoir ce que ces chara donneront une fois codé en int

(ca doit aps etre tres clair, tu comprend?)

Hors ligne

 

#21 14 Aug 2006 03:35:58

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

de toute manière, pour tricher sur G100, faut vraiment rien avoir à faire... hmm


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#22 14 Aug 2006 07:44:13

tonton1664
Membre
Lieu: Somme (80)
Date d'inscription: 22 Jul 2002
Messages: 217
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Azor, le linker est un poil plus con que ça : il est capable de virer les objets non utilisés dans une librairie, mais pas les fonctions, il faudrait pour cela qu'il vérifie qu'il n'y a pas de jmp vers une autre fonction a l'intérieur de l'objet, ce qui est quasiment impossible à faire. C'est pour cela que les librairies (par exemple la libc de DM) sont en général découpées en beaucoup de petits fichiers.

Hors ligne

 

#23 14 Aug 2006 07:45:11

EldAnar
Membre
Lieu: 127.0.0.1
Date d'inscription: 31 Jul 2006
Messages: 60

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Alors, la fonction en question, la voila :
Tout d'abord faut definir une structure highscore comme telle

Code:

struct Highscore
{
    char nom[5][4];
    unsigned int score[5];
};

Ensuite, faut déclarer une fonx qui va etre utilisé plus tard, elle permet au joueur de rentrer son nom dans Scores.nom, avec uine serie de getkey(2), elle prend comme parametre i, qui est la position du joueur dans le tableau des highscore (si il a fait le meilleur score, i=0, si il a fait le dernier score, i=4. Une variable compteur permet de faire en sorte que le nom qu'il, renttre soit de 3charas.

La fonx ne renvoie rien, elle change directement la valeur concernée avec  un pointeur sur struct nommé Ptr_Scores

Code:

//  fonction qui permet à l'utilisateur de rentrer son nom dans les highscores
void enter_your_name(struct Highscore* Ptr_Scores ,char i){
  char compteur=0;
  write(2,49,"Entrez votre nom :");
  Ptr_Scores->nom[i][0]=' ';
  Ptr_Scores->nom[i][1]=' ';
  Ptr_Scores->nom[i][2]=' ';
  Ptr_Scores->nom[i][3]='';

  while (compteur<=2){
    switch(getkey(2)){
      case 61:
      Ptr_Scores->nom[i][compteur]='A';
      compteur++;
      break;
      case 62:
      Ptr_Scores->nom[i][compteur]='B';
      compteur++;
      break;
      case 63:
      Ptr_Scores->nom[i][compteur]='C';
      compteur++;
      break;
      case 64:
      Ptr_Scores->nom[i][compteur]='D';
      compteur++;
      break;
      case 65:
      Ptr_Scores->nom[i][compteur]='E';
      compteur++;
      break;
      case 66:
      Ptr_Scores->nom[i][compteur]='F';
      compteur++;
      break;
      case 51:
      Ptr_Scores->nom[i][compteur]='G';
      compteur++;
      break;
      case 52:
      Ptr_Scores->nom[i][compteur]='H';
      compteur++;
      break;
      case 53:
      Ptr_Scores->nom[i][compteur]='I';
      compteur++;
      break;
      case 54:
      Ptr_Scores->nom[i][compteur]='J';
      compteur++;
      break;
      case 55:
      Ptr_Scores->nom[i][compteur]='K';
      compteur++;
      break;
      case 56:
      Ptr_Scores->nom[i][compteur]='L';
      compteur++;
      break;
      case 41:
      Ptr_Scores->nom[i][compteur]='M';
      compteur++;
      break;
      case 42:
      Ptr_Scores->nom[i][compteur]='N';
      compteur++;
      break;
      case 43:
      Ptr_Scores->nom[i][compteur]='O';
      compteur++;
      break;
      case 31:
      Ptr_Scores->nom[i][compteur]='P';
      compteur++;
      break;
      case 32:
      Ptr_Scores->nom[i][compteur]='Q';
      compteur++;
      break;
      case 33:
      Ptr_Scores->nom[i][compteur]='R';
      compteur++;
      break;
      case 34:
      Ptr_Scores->nom[i][compteur]='S';
      compteur++;
      break;
      case 35:
      Ptr_Scores->nom[i][compteur]='T';
      compteur++;
      break;
      case 21:
      Ptr_Scores->nom[i][compteur]='U';
      compteur++;
      break;
      case 22:
      Ptr_Scores->nom[i][compteur]='V';
      compteur++;
      break;
      case 23:
      Ptr_Scores->nom[i][compteur]='W';
      compteur++;
      break;
      case 24:
      Ptr_Scores->nom[i][compteur]='X';
      compteur++;
      break;
      case 25:
      Ptr_Scores->nom[i][compteur]='Y';
      compteur++;
      break;
      case 11:
      Ptr_Scores->nom[i][compteur]='Z';
      compteur++;
      break;
      case 12:
      Ptr_Scores->nom[i][compteur]=' ';
      compteur++;
      break;
    }
    write(96,49,Ptr_Scores->nom[i]);
    gxRefresh();
  }
}

Et voila la fonx en elle meme, je pense que vous comprendrez le principe, elle est assez explicite

Code:

//Lit les highscores, met le score du joueur en memoire si necessaire et affiche les highscores
char highscores(unsigned int score){
  struct memory_zone bf;
  struct Highscore Scores;
  struct Highscore *Ptr_Scores = &Scores;
  char i,j;
  unsigned int k=0;
  for (i=0;i<=4;i++){
    for (j=0;j<=2;j++){
       Scores.nom[i][j]='A';
    }
    Scores.nom[i][3]='';
    Scores.score[i]=k;
  }

  // Dessine le cadre
  gxHLine(0,127,0,GX_BLACK);          // Les lignes horizontales de haut en bas
  gxHLine(0,127,8,GX_BLACK);
  gxVLine(0,0,8,GX_BLACK);            // Les lignes verticales de gauche à droite
  gxVLine(127,0,8,GX_BLACK);
  write(40,2,"HighScores");


  if(search_mem_zone(12,"DOBAHIGH",&bf)==-1){            // si la zone n'existe pas
     if(create_mem_zone(12,"DOBAHIGH",sizeof(Scores)+14,CREATE_ZONE)==-2){// on la créé
        write(2,20,"Pas assez de memoire");             // sauf s'il n'y a aps assez de memoire
        return(-1);                                     // on renvoie alors -1
     }
     write_mem_zone(&bf,&Scores, 0, sizeof(Scores));
  }
  search_mem_zone(12,"DOBAHIGH",&bf);
  read_mem_zone(&bf,&Scores, 0, sizeof(Scores));   // on lit tous les scores & noms
  for(i=0;i<=4;i++){                               // et on les affiches à l'écran
     writevalue(40,11+i*7,Scores.score[i]);
     write(75,11+i*7,Scores.nom[i]);
  }

  for(i=0; i<=4; i++){                           // pour chaque highscore
    if(score>Scores.score[i]){                   // on teste si le score du joueur est plus grand
       for(j=0; j<=4-i; j++){                    // on décale tous les scores et les noms depuis la position de celui du joueur, en commencant par la fin(evidemment)
          Scores.score[4-j]=Scores.score[4-j-1];
          Scores.nom[4-j][0]=Scores.nom[4-j-1][0];
          Scores.nom[4-j][1]=Scores.nom[4-j-1][1];
          Scores.nom[4-j][2]=Scores.nom[4-j-1][2];
          Scores.nom[4-j][3]=Scores.nom[4-j-1][3];
       }
       Scores.score[i] = score;                    // et on insere le score du joueur a la bonne place
       enter_your_name(Ptr_Scores ,i);             // ainsi que son nom
       break;                                      // on sort du for()
    }
  }
  write_mem_zone(&bf,&Scores, 0, sizeof(Scores));

  return(0);        // on indique que la fonction s'est bien passée
}

Hors ligne

 

#24 15 Aug 2006 03:07:03

Azor
Le Coté Obscur De La G100
Lieu: glop glop!
Date d'inscription: 04 May 2002
Messages: 5479
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]

Ouaille.

Stop, on arrete, et on réfléchis la!

Ta structure switch case, regardes bien:
-> il manque le cas "default"
-> dans tout les autres cas, des instruction communes:

Code:

Ptr_Scores->nom[i][compteur]= CHARACTER;
compteur++; 

Faut savoir que (Ptr_Scires->nom[i][compteur]) va te faire pleiiiin d'opérations!

Bon sinon, le switch case, c'est loouuuuuuuuurd pour autant de cas... Reflechissons un peut plus...
N'y a t il pas des similitudes?

Code:


61 'A'
62 'B'
63 'C'
64 'D'
65 'E'
66 'F'
-> c vaux ('A' + Code - 61) si (61 <= Code <= 66)

51 'G'
52 'H'
53 'I'
54 'J'
55 'K'
56 'L'
-> c vaux ('G' + Code - 51) si (51 <= Code <= 56)

41 'M'
42 'N'
43 'O'
-> c vaux ('M' + Code - 41) si (41 <= Code <= 43)

31 'P'
32 'Q'
33 'R'
34 'S'
35 'T'
-> c vaux ('P' + Code - 31) si (31 <= Code <= 35)

21 'U'
22 'V'
23 'W'
24 'X'
25 'Y'
-> c vaux ('U' + Code - 21) si (21 <= Code <= 25)

11 'Z'
12 ' '
-> c vaux ('z' + Code - 11) si (11 <= Code <= 12)

Sinon l'autre méthode qui peut prendre -ou pas- plus de place, mais qui en tout cas sera la plus rapide: le mapping de touches maison!
Ton code vaux de 11 à 66...

Tu créer un tableau, comme ceci:

Code:

char KeyMapper[]=
{
 'Z', ' ', 0, 0, 0, 0, 0, 0, 0, 0,
 'U', 'V', 'W', 'X', 'Y', 0, 0, 0, 0, 0,
 'P', 'Q', 'R', 'S', 'T', 0, 0, 0, 0, 0,
 'M', 'N', 'O', 0, 0, 0, 0, 0, 0, 0,
 'G', 'H', 'I', 'J', 'K', 'L', 0, 0, 0, 0,
 'A', 'B', 'C', 'D', 'E', 'F',
}

Pour y acceder, c'est simple:

Code:

if ((Code >= 12) && (Code <= 66))
  Character= KeyMapper[Code - 11];
else
  Character= 0;

Et la, si Character est NULL, c'est qu'aucune touche valide n'a été appuyée.

Soit dit en passant: avec le tableau KeyMapper, tu peux aussi implémenter des caracteres maisons... Eventuellement tu peux avoir plusieurs tableau KeyMapper en fonction, par exemple, si t'as un mode SHIFT ALPHA, etc!

(Sous reserve d'erreurs, vérifier le code avant de l'implémenter)


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#25 17 Aug 2006 19:25:44

2072
Programmeur Graph100
Lieu: Somewherebourg
Date d'inscription: 29 Jan 2002
Messages: 2056
Site web

Re: gxLib, Memzones, [et tous les autres petits problèmes]


Donc on ne peut pas modifier de maniere directe les chiffres, donc la triche est de ce cas limité! A moins de modifier comme ca les 2chara et d'en mefttre 2 auitres au pif en esperant que ca fera un score important. Sinon il faut savoir comment sont codés tel et tel caractéer, et savoir ce que ces chara donneront une fois codé en int

(ca doit pas etre tres clair, tu comprend?)

oh là là, tu devrais te renseigner un petit peu sur le fonctionement interne d'un ordinateur hmm

Et si, avec touche tu peux modifier de manière direct les chiffres, et même les chercher... (Write a value et search a value) Sans ça je n'aurais jamais pu comprendre la structure des memzone et créer la lib du même nom...

Et pense que create_mem_zone peut retourner -1 (si la zone n'existe pas, avec le flag RESIZE_ZONE, si la zone exist déjà, avec CREATE_ZONE si la taille est incorrect...)

La version beta de memzone est plus simple pour tout ça.


-~2072~-
Paid Emails
[URL=http://www.2072productions.com]2072productions.com[/URL]
[URL=http://www.casiocalc.org]casiocalc.org[/URL]

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr