Bonjour,
Ben voilà, je suis en train d'essayer de coder un jeu en C (pour apprendre le C), comme je l'ai déjà dit précédemment, et j'ai quelques autres question :
Mes niveaux sont stockés dans des matrices (niveau1, niveau2, niveau3, ...)
voilà, alors comment faire pour qu'à partir d'une variable portant le numéro du niveau je puisse copier la matrice correspondante dans une autre, allouée en RAM (car je ne veux pas modifier le niveau directement puisque les changements seraient sauvegardés, sauf si le fichier est archivé) ?
Et puis aussi, y a un bug graphique bizarre qui n'apparaît pas sur vti mais par contre il est sur ma vraie TI : le niveau est affiché correctement sauf les 2 dernières lignes (qui devraient être blanches) dont on a l'impression que la ligne supérieure à coulé dessus. (je ne sais pas si c'est très clair, mais je ne sais pas trop comment l'expliquer et je n'arrive pas à prendre de screenshot de ma TI pendant que le jeu fonctionne).
Vala, c'est tout...
[edit]Edité par jackiechan91 le 23-11-2001 à 23:03:50[/edit]
C'est bizarre : si je fais un reset sur ma TI, le bug graphique disparaît, mais si je lance un jeu, n'importe lequel, qu'il soit _nostub ou kernel, et qu'après je réessaie mon jeu, le bug revient...
est-ce que qq1 peut m'aider ?
ben le mieux serait de stocker tes niveaux ds une matrice 3D
et pour copier tu fais un truc du genre
short mat[10][10];
short niveau[nb_niveau][10][10];
for(n=0; n<10; n++)
memcpy(mat[n], niveau[numero][n],20);
[edit]Edité par obza_Fazer le 24-11-2001 à 11:47:25[/edit]
sinon, tu joues sur le nom de la variable ... car ca, ca prend pas mal de place ...
memcpy(mat,niveau[numero],200); suffit.
Et pour déclarer mat, je verrais plutôt:
short (*mat)[10];
mat=malloc(200);
[edit]Edité par Kevin Kofler le 24-11-2001 à 22:04:58[/edit]
Mes niveaux n'ont pas tous le même format, certains sont en 7*19, d'autres en 8*21, enfin, il peut y avoir n'importe quelle taille.
Donc est-ce que c'est possible (en suivant l'exemple de Kevin) de faire une liste niveau[] remplie de matrices de différentes tailles ?
Pen^2 Le 25/11/2001 à 01:20 je pense que le mieux c de faire un tableau de pointeur dont les elements pointent sur tes matrices de dimensions differentes.
J'ai essayé un truc, mais ça ne marche pas :
short niveau1[7][19]={...};
short niveau2[7][20]={...};
...
short *n1=&niveau1[7][19];
short *n2=&niveau2[7][19];
...
short niveaux[n]={n1,n2,...};
Mais pour chaque élément de la liste niveaux, j'ai une erreur :
"Initializer element is not constant (near initialization for 'niveaux[n]')"
Voilà, ça vous paraît sûrement facile comme problème, donc je rappelle que je début en C.
Et sinon, pour le bug graphique bizarre qui s'enlève si je fais un reset, vous n'avez aucune idée ?
Merci
[edit]Edité par jackiechan91 le 26-11-2001 à 21:24:08[/edit]
Ça ne va pas du tout. Ça ne peut marcher que si la deuxième dimension est constante (par exemple 20 dans les 2 cas), auquel cas on pourrait écrire:
short (*n1)[20]=niveau1;
short (*n2)[20]=niveau2;
...
short (*(niveaux[n]))[20];
niveaux={n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20};
Mais là, il faut trouver autre chose.
Quel genre de chose ???
(je suis désolé, je pense que vous avez peut-être l'impression d'écrire le prog à ma place, mais je n'ai lu que le tuto de squale92 et je n'arrive pas à m'en sortir juste avec ça, donc SVP, aidez moi.)
J'ai plus ou moins résolu le bug graphique.
Il n'y a plus de bug, mais j'ai fait une méthode un peu caca...
J'utilise un écran virtuel et lorsque je dirige les fct graphique vers celui-ci, je dois utiliser ça :
PortSet(vecran,160,100);
Mais je ne sais pas pourquoi, sur les 24 derniers pixel ça faisait un truc tout caca et depuis que j'ai mis ça :
PortSet(vecran,160,136);
eh ben ça marche nikel...
Donc si qq1 a une explication... (j'alloue en RAM mon écran virtuel avec vecran=malloc(3840); )
Sinon, j'aurais besoin de fonctions me permettant de trouver les dimensions d'une matrice (nb de lignes et de colonnes), donc si qq1 peut m'aider là aussi, il est le bienvenu.
Et aussi,
Je réexplique mon pb :
mes niveaux sont stockés sous forme de matrices de différentes tailles.
mais pendant le jeu, j'aimerais que le joueur utilise une matrice contenant le niveau courant et que j'appellerais niveau.
comme il n'y a que 11 niveaux, je pensais faire une boucle switch qui ressemble à ça :
switch(niv) // Où niv est le N° du niveau courant
{
case 0: // Premier niveau...
copie niveau1[7][19] dans niveau;
break;
case 1:
copie niveau2[7][20] dans niveau;
break;
}
Voilà, tous vos commentaires seront encore une fois les bienvenus.
Merci...
[edit]Edité par jackiechan91 le 03-12-2001 à 22:06:18[/edit]
[edit]Edité par jackiechan91 le 03-12-2001 à 22:08:22[/edit]
Déjà, vecran=malloc(3840); => PortSet(vecran,239,127).
>Sinon, j'aurais besoin de fonctions me permettant de trouver les dimensions d'une matrice (nb de lignes et de colonnes), donc si qq1 peut m'aider là aussi, il est le bienvenu.
Pour des matrices dynamiques, il n'y en a pas. La taille n'est enregistrée nulle part. Il faut que tu l'enregistres, toi, pour pouvoir la lire.
Je pense que la meilleure solution est:
#define niveau(x,y) _niveau[x*dim2+y]
void joue_niveau(char *_niveau, int dim1, int dim2)
{
/* pour accéder à un élément ici, il suffira de mettre niveau(3,4) par exemple */
}
void _main(void)
{
switch(niv) // Où niv est le N° du niveau courant
{
case 0: // Premier niveau...
joue_niveau((char *)niveau1,7,19);
/* Le (char *) n'est pas strictement nécessaire, mais ça évite un warning. */
break;
case 1:
joue_niveau((char *)niveau2,7,20);
break;
}
}
[edit]Edité par Kevin Kofler le 04-12-2001 à 20:58:35[/edit]
Mais si je modifie ma matrice en mettant par ex niveau(2,5)=2;
C'est la matrice source qui est modifiée ?
J'aurais donc le même pb que herverv dans son half-life... on est obligé d'archiver les maps pour jouer, sinon, vu qu'elles sont modifiées à travers le jeu, quand on recommence le jeu, elles sont dans l'état où on les avait laissées.
crotte de bique, ça me sâoule de ne pas y arriver.
C'est Kevin Kofler qui m'a fait presque tout "mon" jeu...
sinon, tu peux utiliser une copie allouée dynamiquement pour tes matrices...
(mais, seulement, ça fait occuper de la RAM...)
#define niveau(x,y) _niveau[x*dim2+y]
void joue_niveau(char *__niveau, int dim1, int dim2)
{
char *_niveau;
_niveau=malloc(dim1*dim2);
if (!_niveau) {ST_helpMsg("Not enough memory")return;}
memcpy(_niveau,__niveau,dim1*dim2);
/* pour accéder à un élément ici, il suffira de mettre niveau(3,4) par exemple */
free(_niveau);
}
void _main(void)
{
switch(niv) // Où niv est le N° du niveau courant
{
case 0: // Premier niveau...
joue_niveau((char *)niveau1,7,19);
/* Le (char *) n'est pas strictement nécessaire, mais ça évite un warning. */
break;
case 1:
joue_niveau((char *)niveau2,7,20);
break;
}
}
Et voilà, la matrice source n'est plus modifiée.
Putain, MERCI BEAUCOUP KEVIN.
Je t'aime.