Vous n'êtes pas identifié.
Salut,
Je souhait faire avancer un pixel, pour cela j'utilise un switch() pour les différentes touches et un goto pour revenir au départ:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #pragma inline /* Pour utiliser l'asm */ void aff_pixel(unsigned short int x, unsigned short int y,char state) { asm push ax; asm push cx; asm push dx; asm mov cx,x; asm mov dx,y; asm mov ax,0x1A20; asm mov es,ax; asm mov al,state; asm mov si,0x003f; asm sub si,dx; asm sub cx,0x80; asm not cx; asm push cx; asm and cl,0xf8; asm shl cx,0x03; asm add si,cx; asm pop cx; asm and cl,0x07; asm mov ah,0xfe; asm rol ah,cl; asm and es:[si],ah; asm mov ah,al; asm rol ah,cl; asm or es:[si],ah; asm pop dx; asm pop cx; asm pop ax; } /* Attend une touche press‚ par l'utilisateurs, meme les touches a double sortie, comme les fleches (Duobab)*/ int waitkey(void) { int v=getch(); if (v==0) v=getch(); return v; } int main(void) { int x=1; int y=1; debut: switch (waitkey()) { case 59 : { x--; aff_pixel(x,y,1); goto debut; } case 60 : { x++; aff_pixel(x,y,1); goto debut; } case 61 : { y--; aff_pixel(x,y,1); goto debut; } case 62 : { y++; aff_pixel(x,y,1); goto debut; } case 64 : ; } return 0; }
note: une bonne partie du code vien de pong 2.1 de whyp.
L'ennuit dans ce code c'est que si j'appuye sur une touche le programme ne régait pas forcement, il lui arrive de "zapper" la touche. :? Je cherche donc un moyen de récupérer à chaque fois la touche presser.
Hors ligne
bah utilise les touches multiples, ou la fonction getkey(1) ==>> tout est dans db-lib.h
ya plein d'exemples de codes dedans
Hors ligne
je crois que tu n'es pas obligé de faire les PUSHs et les POPs dans ta procédure en assembleur, normallement le compilateur le fait automatiquement au début et à la fin d'une procedure ou fonction.
Hors ligne
Ok, je vais regarder la librairie db-lib.h.
Et KillTiti, comme je l'ait indiqué une partie du code à été faite par whyp, la fonction qui utilise l'assembleur en fait partie.
Hors ligne
la directive #pragma inline n'est vraiment pas nécessaire, tu peux l'enlever sans risques
Par contre pour ton code essaie de ne pas utiliser de goto, utilise plutot les boucles etc. Je te proposerais plutôt d'écrire ton main de cette façon:
int main(void) { int x=1; int y=1; int key; do { key = waitkey(); if(key>=59 && key<=62) { //aff_pixel(x,y,0); // efface eventuellement l'ancien pxl switch (key) { case 59 : x--; break; case 60 : x++; break; case 61 : y--; break; case 62 : y++; break; } aff_pixel(x,y,1); } } while(key!=64); return 0; }
Avec les touches multiples et une fonction testkey(), ca donnerait plutôt quelque chose du genre
int main(void) { int x=1; int y=1; int dx,dy; do { if(testkey(K_GAUCHE)) dx=-1; else if(testkey(K_DROITE)) dx=1; else dx=0; if(testkey(K_HAUT)) dy=-1; else if(testkey(K_BAS)) dy=1; else dy=0; if(dx!=0 || dy!=0) { //aff_pixel(x,y,0); // efface eventuellement l'ancien pxl x+=dx; y+=dy; aff_pixel(x,y,1); } } while( ! testkey(K_ESC)); return 0; }
Hors ligne
Merci Julien, j'ai testé ta première méthode elle fonctionne parfaitement pour ce que je souhaite faire.
Quand à db-lib.h, je n'ai pas encore pris le temps d'y jeter un coup d'oeil. Mais il y a un trcu que je n'ai pas compris c'est: qu'est ce que les touches multiple ?
enfin bon je pose la question mais il se pourrait bien que la solution soit dans la librairie
Hors ligne
jettes un coup d oeil là http://libg100.sourceforge.net/ c est bien pratique et bien documenté, y a des exemples de code dedans :=)
Hors ligne
les touches multiples, c'est une techniques qui te permet de detecter l'appuie de plusieurs touches à la fois
C'est quelque chose de pas mal important pour les jeux, par exemple si pour un objet que l'on contrôle, on souhaite à la fois aller en haut à gauche tout en sautant, il faudra detecter les touches Gauche, Haut, ainsi que la touche Sauter.
Sur G100, cette technique peut lire directement les états des touches, faut savoir que sur PC, c'est plutot par evenement (touche appuyée, touche relachée) pour autant que je sache.
Hors ligne
Sur G100, cette technique peut lire directement les états des touches, faut savoir que sur PC, c'est plutot par evenement (touche appuyée, touche relachée) pour autant que je sache.
L'API Windows fournit aussi des fonctions pour lire l'état des touches
Hors ligne