Mon premier jet en C... Ce n'est pas brillant mais faut ben commencer...
On peut juste bouger le personnage à l'aide des flèches. Les collisions sont gérée et je travaille sur "comment rentrer dans la petite maisons ??"
L'arbre est issu d'une banque de sprite que j'ai trouvé sur ce site. Et la maisons est constituées de tileset que j'ai faite grâce à un tuto (sur ce site également)
Le premier fichier (*.g1a) est le "jeu" le deuxième correspond au sources.
Mon personnage est animé lors des déplacements
Améliorations à venir
peut-être...
-Possibilité d'entrer dans le bâtiment.⇒Fait
-Gestion de la course par la pression d'une touche du Replay et de Shift.
-gestion de l'intérieur du bâtiment
-nouveau style de maisons en brique
-système d'énigme, interrupteur, histoire,...
-armes, et système de combat
-map plus évoluées : herbes, cailloux, d'autres arbres et artéfacts
merci
J'aimerais savoir si j'ai bien compris le raisonnement :
d'abord je déclare tous mes tableau de sprite en "const char".
Ensuite je vire mes "While" dans les case et les IsKeyDown.
Les ML_clear_screen⇒poubelle les ML_clear_vram sont à garder... jusque là c'est bon ?
Admettons que c'est ok après ;
Ensuite pour les déplacements de mon sprite j'ai pas tout suivi avec Getkey et IsKeyDown :
je presse une flèche hop : je rentre dans mon switch : case Key_crtrl_onsenfout
voila maintenant je checke la map j'affiche mon perso, et baisse (j'ai failli oublier un "s" ) les coordonnées. Je remet à jour mon perso et quitte le switch...
C'est ça ?
d'abord je déclare tous mes tableau de sprite en "const char".
Oui, ça ça libère de la RAM.
Ensuite je vire mes "While" dans les case et les IsKeyDown.
Voilà, désormais un tour de boucle représentera un frame du jeu.
Les ML_clear_screen⇒poubelle les ML_clear_vram sont à garder... jusque là c'est bon ?
Oui. Je reviendrai sur les ML_clear_vram() dans la boucle plus tard, ils sont pas tout à fait bien là, mais pour l'instant tu peux les laisser.
je presse une flèche hop : je rentre dans mon switch : case Key_crtrl_onsenfout
Précisément.
voila maintenant je checke la map j'affiche mon perso, et baisse (j'ai failli oublier un "s" ) les coordonnées. Je remet à jour mon perso et quitte le switch...
Oui, tu quittes le switch après avoir bougé ton personnage une seule fois vers le bas. Et puis tu remontes au début de la boucle while, au niveau du GetKey().
Ensuite, ce qui se passe de magique c'est que si tu restes appuyé sur la touche BAS, ce deuxième appel à GetKey() va renvoyer de nouveau la touche bas après un petit délai. On dit qu'il « répète » la touche.
C'est exactement ce qu'il se passe quand tu navigues dans le menu principal. Je te dirai après comment faire pour que la première répétition arrive aussi vite que les suivantes.
Seules les touches directionnelles sont répétées. Si tu avais choisi la touche [2], le deuxième appel à GetKey() attendrait que tu relâches [2] pour réappuyer plus tard. Il faudrait appuyer plusieurs fois pour descendre plus longtemps.
j'essaierais de mettre mon code à jour en attendant j'ai remis le programme à jour dans le doute : on peut entrer dans le bâtiment via la touche [alpha] mais les sources ne sont pas à jour je mettrait tout cela à jour le plus vite possible
@Lephe : je n'ai pas compris comment tu veux que j'enlève les Sleep...
Il faut au mois que j'en garde 1 entre les deux sprites de déplacements du perso... non ?
Eh bien non, parce que GetKey() va s'en charger : il va attendre 625 ms avant de te re-renvoyer le numéro de touche la première fois, et 125 ms les fois suivantes.
Il y a une fonction de fxlib qui te permet de contrôler le délai, tu as envie de mettre le même délai pour la première fois que pour le reste du temps. Tu peux mettre n'importe quel multiple de 25 ms, également.
On progresse ! Ce n'est pas fini, mais c'est déjà bien mieux.
case KEY_CTRL_UP:
test=map_test(x,y,1);
if (test==0){
ML_clear_vram();
ML_bmp_or(joueurDo1,54,22,20,20);
map_draw(x,y);
ML_display_vram();
y=y+8;
Sleep(150);
ML_clear_vram();
ML_bmp_or(joueurDo2,54,22,20,20);
map_draw(x,y);
ML_display_vram();
};
break;
Alors bon, c'est un peu triste de mettre tout le code dans un if. Ce que tu peux faire, c'est quitter direct le case quand le test ne vaut pas 0. Comme ceci :
Ensuite, on doit pousser encore plus loin l'idée de « un tour de boucle pour chaque frame du jeu ». Là, quand tu descends, on voit bien que tu as deux frames, puisque tu as deux sprites différents...
Qu'à cela ne tienne, tu n'as qu'à faire un tour de boucle pour chacun de ces frames ! Et puis tu as une variable qui te dit si tu es sur joueurDo1 ou joueurDo2, autrement dit si tu es au frame d'animation 1 ou 2 de ton sprite.
Comme ça, tu peux enfin retirer le dernier Sleep() dans ta boucle. Tu devrais laisser toute l'attente au même endroit (pour l'instant c'est ton GetKey()), si tu veux plus de détails je pourrai te raconter.
En gros moi j'obtiens quelque chose comme ça :
case KEY_CTRL_UP:
if(map_test(x,y,1) != 0) break;
ML_clear_vram();
Tu as toujours un ML_display_vram; qui ne fait rien au début de ton code, n'oublie pas d'ajouter les parenthèses sinon la fonction n'est pas appelée : ML_display_vram().
Ensuite, tu dois à tout prix retirer le Sleep(150) devant le GetKey() : comme je l'ai expliqué, pour l'instant GetKey() se charge de mettre des temps d'attente. Quand ton programme sera bien rodé, ce sera ensuite toi qui le feras, mais avec un timer, et de l'extérieur !
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