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 31 Oct 2005 06:53:08

Freak
Membre
Lieu: ~/
Date d'inscription: 01 Oct 2004
Messages: 8

Faire avancer un pixel en C

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:

Code:

#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.


.:Freak:.

Hors ligne

 

#2 31 Oct 2005 10:34:59

Swifter
Programmeur Graph100
Lieu: Niort (79)
Date d'inscription: 06 Aug 2002
Messages: 980
Site web

Re: Faire avancer un pixel en C

bah utilise les touches multiples, ou la fonction getkey(1)  ==>>  tout est dans db-lib.h
ya plein d'exemples de codes dedans


Swifter, avec un T, n'attrapes pas la poussière mais toutes les remarques débiles :mrgreen:
              ** Swifter68@hotmail.com **

Hors ligne

 

#3 31 Oct 2005 16:32:48

KillTiti
Membre
Lieu: Changé (Sarthe)
Date d'inscription: 16 Jul 2005
Messages: 39

Re: Faire avancer un pixel en C

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

 

#4 31 Oct 2005 17:47:39

Freak
Membre
Lieu: ~/
Date d'inscription: 01 Oct 2004
Messages: 8

Re: Faire avancer un pixel en C

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.   wink


.:Freak:.

Hors ligne

 

#5 01 Nov 2005 05:28:56

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

Re: Faire avancer un pixel en C

la directive #pragma inline n'est vraiment pas nécessaire, tu peux l'enlever sans risques wink

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:

Code:

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

Code:

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; 
}

Pensez à surveiller mes releases wink

Hors ligne

 

#6 01 Nov 2005 16:46:29

Freak
Membre
Lieu: ~/
Date d'inscription: 01 Oct 2004
Messages: 8

Re: Faire avancer un pixel en C

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  lol


.:Freak:.

Hors ligne

 

#7 01 Nov 2005 18:39:08

Mr-D
Membre
Date d'inscription: 04 Sep 2005
Messages: 37

Re: Faire avancer un pixel en C

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

 

#8 02 Nov 2005 04:19:16

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

Re: Faire avancer un pixel en C

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.


Anciennement X-thunder28
Cats shall rule teh world!

Hors ligne

 

#9 02 Nov 2005 14:42:23

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

Re: Faire avancer un pixel en C

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 wink


Pensez à surveiller mes releases wink

Hors ligne

 

Pied de page des forums

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