Emmanuel Delahaye C is a sharp tool | Que c'est à toi de l'afficher, de le déplacer... (sprite).
Citation :
le truc c'est qu'il faut qu'il soit rond et qu'il se déplace avec les touches z,q,s,d oules fleches ... mais comment trouver une fonction qui permette de changer les coordonnées du curseur a chaque fois que l'on appuie sur l'une de ces 4 touches ??
|
Il n'y a rien de standard. Avec Turbo C, il faut utiliser les fonctions de <conio.h> : une boucle, une suspension pour 'rythmer la boucle' et permettre les déplacements la fonction kbhit() pour savoir si on a touché le clavier la fonction getch() pour lire un caractère dans le clavier (la gestion des flèches est légèrement plus compliquée) un switch-case pour traiter la touche saisie C'est un projet scolaire ? Tu n'as pas eu de cours sur les fonctions d'entrées de conio ? Je te conseille de commencer par t'entrainer en mode console. Voici un petit programme qui déplace une balle toute seule. Les fleches donnent la direction. (c'est comme ça que fonctionne un PacMan par exemple). Voici une première ébauche qui permet de voir comment on fait "2 choses à la fois". La boucle est rythmée à 100 ms. Elle affiche en temps réel un petit moulin en haut à droite, et dans le même temps, le clavier est surveillé. Si on framme la touche ESC, le programme s'arrête.
Code :
- #ifdef __TURBOC__
- #include <conio.h>
- #include <dos.h>
- #else
- #include <conio2.h>
- # /* http://delahaye.emmanuel.free.fr/clib */
- #include "psleep/inc/psleep.h"
- #define delay(ms) msleep(ms)
- #endif
- static void aff_moulin (void)
- {
- static int i;
- static char const s[4] = "|/-\\";
- i++;
- if (i == sizeof (s))
- {
- i = 0;
- }
- gotoxy (1, 1), putch (s[i]);
- }
- int main (void)
- {
- int end = 0;
- clrscr ();
- while (!end)
- {
- delay (100);
- aff_moulin ();
- if (kbhit ())
- {
- int c = getch ();
- switch (c)
- {
- case 27: /* ESC */
- end = 1;
- break;
- }
- }
- }
- return 0;
- }
|
Voici une version plus complète qui montre comment la balle se déplace toute seule et comment les flèches arrivent à en contrôler la direction, donc, indirectement, le déplacement. C'est un peu élaboré. Pose des questions si tu ne comprends pas. Les compilations conditionnelles traitent les différences de comportement entre la version originale de conio (MS-DOS) et la version 'Win32' (Windows).
Code :
- #ifdef __TURBOC__
- #include <conio.h>
- #include <dos.h>
- #else
- #include <conio2.h>
- /* http://delahaye.emmanuel.free.fr/clib */
- #include "psleep/inc/psleep.h"
- #define delay(ms) msleep(ms)
- #endif
- /* Largeur / hauteur */
- #define X 20
- #define Y 10
- /* Origine */
- #define X0 ((80-X)/2)
- #define Y0 ((25-Y)/2)
- enum touches
- {
- LEFT = 75,
- RIGHT = 77,
- UP = 72,
- DOWN = 80,
- dummy
- };
- /* directions */
- enum dir
- {
- N, S, W, E, DIR_NB
- };
- /* coordonees */
- struct xy
- {
- int x;
- int y;
- };
- /* objet 'balle' */
- struct balle
- {
- /* position courante */
- struct xy pos;
- /* direction courante */
- enum dir dir;
- };
- void balle_aff (struct balle *p)
- {
- /* effacement de la positioni courante */
- gotoxy (p->pos.x, p->pos.y), putch (' ');
- /* deplacement */
- switch (p->dir)
- {
- case N:
- /* controle de limites */
- if (p->pos.y > Y0)
- {
- p->pos.y--;
- }
- break;
- case S:
- if (p->pos.y < Y0 + Y - 1)
- {
- p->pos.y++;
- }
- break;
- case W:
- if (p->pos.x > X0)
- {
- p->pos.x--;
- }
- break;
- case E:
- if (p->pos.x < X0 + X - 1)
- {
- p->pos.x++;
- }
- break;
- default:;
- }
- gotoxy (p->pos.x, p->pos.y), putch ('O');
- }
- void balle_init (struct balle *p)
- {
- p->pos.x = X0 + X / 2;
- p->pos.y = Y0 + Y / 2;
- p->dir = N;
- }
- /* encadrer l'aire de jeu */
- void play_init (void)
- {
- int i;
- /* 2 lignes horizontales a l'exterieur de l'aire de jeu */
- for (i = 0; i < X + 2; i++)
- {
- gotoxy (X0 - 1 + i, Y0 - 1), putch ('*');
- gotoxy (X0 - 1 + i, Y0 + Y), putch ('*');
- }
- /* 2 lignes verticales a l'exterieur de l'aire de jeu */
- for (i = 0; i < Y; i++)
- {
- gotoxy (X0 - 1, Y0 + i), putch ('*');
- gotoxy (X0 + X, Y0 + i), putch ('*');
- }
- #if 0
- /* aire de jeu (verification) */
- for (i = 0; i < X; i++)
- {
- int j;
- for (j = 0; j < Y; j++)
- {
- gotoxy (X0 + i, Y0 + j), putch ('-');
- }
- }
- #endif
- }
- int main (void)
- {
- int end = 0;
- struct balle balle;
- clrscr ();
- play_init ();
- balle_init (&balle);
- while (!end)
- {
- delay (200);
- balle_aff (&balle);
- if (kbhit ())
- {
- int c = getch ();
- switch (c)
- {
- case 27: /* ESC */
- end = 1;
- break;
- case 0:
- if (kbhit ())
- {
- c = getch ();
- switch (c)
- {
- #ifdef __TURBOC__
- /* selon la fleche, changer la direction courante */
- case UP:
- balle.dir = N;
- break;
- case DOWN:
- balle.dir = S;
- break;
- case LEFT:
- balle.dir = W;
- break;
- case RIGHT:
- balle.dir = E;
- break;
- #endif
- default:
- gotoxy (1, 1), cprintf ("%3d", c);
- }
- }
- break;
- case 224:
- #ifndef __TURBOC__
- if (kbhit ())
- {
- c = getch ();
- switch (c)
- {
- /* selon la fleche, changer la direction courante */
- case UP:
- balle.dir = N;
- break;
- case DOWN:
- balle.dir = S;
- break;
- case LEFT:
- balle.dir = W;
- break;
- case RIGHT:
- balle.dir = E;
- break;
- default:
- gotoxy (1, 1), cprintf ("%3d", c);
- }
- }
- #endif
- break;
- }
- }
- }
- return 0;
- }
|
Message édité par Emmanuel Delahaye le 04-01-2008 à 22:27:30 ---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
|