IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Déplacement d'un caractère


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Points : 57
    Points
    57
    Par défaut Déplacement d'un caractère
    Bonjour,
    Je fais un petit jeu en c mais je n'arrive pas à afficher un tir.
    Je veux tirer, voir le déplacement du tir puis le réinitialiser.
    Pour l'instant quand je tir, je crois que c'est tout de suite réinitialiser ou du moins, je ne vois pas le déplacement.
    voici mon code :
    pour l'affichage du terrain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    void afficheTerain(WINDOW *win, Jeu *jeu)
    {
        int i,j;
        wclear(win);
     
        //on prend un vaisseau joueur
        VaisseauJoueur *V = jeuGetVaissJ(jeu);
        //on prend le terrain
        Terrain *ter = jeuGetTerrain(jeu);
        //on prend le tir
        TirJoueur *TJ = jeuGetTirJ(jeu);
     
    	//affichage du terrain
            for(i=0;i < ter->dimy ;i++)
        		{
           			 for(j=0;j<ter->dimx ;j++)
            			{
                 			mvwprintw(win,i,j,"%c",ter->tab[i][j]);
            			}
     
        		}
    	//on affiche un vaisseau joueur sur le terrain           			 
    	mvwprintw( win, V->y, V->x, V->image);
    	//on affiche le tir devant le vaisseau, c'est son point de départ
    	mvwprintw( win, TJ->x, TJ->y, TJ->imageTir);
     
     
    }
    pour ma boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    void ncursBoucle(Jeu *jeu)
     
    {
     
    	WINDOW *win;
     
    	int c;
    	int i, j;
     
    	int continue_boucle;
    	clock_t temps_actu, temps_prec=0;
     
    	initscr();
     
    	clear();
     
    	noecho();
     
    	cbreak();
     
     
     
    	win = newwin( 12, 70, 10, 5 );
     
    	keypad(win, TRUE);
     
     
     
        	halfdelay( 1 );
     
    	continue_boucle = 1;
     
    	do
     
    	{
            afficheTerain(win , jeu);
     
     
     
    		c = wgetch(win);
     
    		//déplacement du vaisseau joueur
     
    		switch(c)
     
    		{
     
    			case KEY_LEFT:
     
    				jeu->jvaissJ.x-=2;
    				jeu->jtirJ.y-=2;
     
    				break;
     
    			case KEY_RIGHT:
     
    				jeu->jvaissJ.x+=2;
    				jeu->jtirJ.y+=2;
     
    				break;
     
    			case KEY_UP:
     
    				jeu->jvaissJ.y-=2;
    				jeu->jtirJ.x-=2;
     
    				break;
     
    			case KEY_DOWN:
     
    				jeu->jvaissJ.y++;
    				jeu->jtirJ.x++;
     
    				break;
               		case 32: /* ESPACE */
     
    				for(i=jeu->jtirJ.y; i<jeu->jter.dimx; i++)
    					{						
    						jeu->jtirJ.y++;
    					}
    				//on réinitialise le tir
    				initTir( &(jeu->jtirJ), &(jeu->jvaissJ), &(jeu->jter));
     
    				break;
     
    			case 27: /* ECHAP */
     
    				continue_boucle = 0;
     
    				break;
     
    		}
     
     
     
    	} while (continue_boucle==1);
     
     
     
    	endwin();
     
    }
    Si vous avez une idée de comment je pourrais faire, je suis preneur.
    merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Je crois que le problème vient tout simplement du fait que les instructions de la boucle sont réalisés trop rapidement, donc trop rapide pour que l'écran soit raffraichit à chaque fois.
    Essaye donc de mettre un sleep() dans la boucle.Essaye avec différentes valeurs?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Merci Dré kam pour ta réponse.
    Mais lorsque j'utilise sleep() dans la boucle for, je ne peut plus déplacer mon vaisseau. Si je l'utilise à l'extérieur, je peut déplacer mon vaisseau après un petit temps d'attente, mais le tir ne se déplace pas.
    Je pense aussi que mon problème viens de cette boucle, mais je ne sais vraiment pas comment le régler.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Je ne vois pas ta fonction InitTIr , mais l'erreur pourrait provenir de là. Il y a plein de choses qu'on ne voit pas (et heureusement! ça aurait été long), mais je crois que la boucle est correcte. Cependant je reste toujours sceptique sur le fait que l'écran soit raffraichit à temps. Dans la boucle qui incrémente la position du tir (du projectile), au lieu d'incrémenter le y de 1 essaye par 0,1.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Merci dré kam pour ton aide.

    le code InitTir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void initTir( TirJoueur *tir, VaisseauJoueur *V)
    {
        tir->imageTir= "-";
        tir->x = (V->y);
        tir->y = (V->x)+2;
    }
    si je fait l'initialisation a chaque fois, j'obtiens ça :


    c'est à dire que le tir est initialisé à chaque fois devant le vaisseau(ici, c'est la lettre D).

    Avec une incrémentation de 0,1 et sans réinitialisé le tir j'obtiens ça :


    et à chaque fois que j’appuie sur la touche "espace" le tir ce déplace de la même distance que précédemment à partir du point ou il était précédemment.

    J'ai essayé de faire une fonction pour le déplacement du tir avec un printf à l’intérieur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void tir1(TirJoueur *tir, VaisseauJoueur *V, Terrain *ter)
    {
        int i;
        for(i=V->y; i<ter->dimx ; i++)
        {
            (tir->y)++;
    	printf("%c", tir->imageTir);
        }
    }
    partie de la boucle modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(i=jeu->jtirJ.y; i<jeu->jter.dimx; i++)
     
    					{	
     
    						//sleep(1);					
     
    						tir1(&(jeu->jtirJ), &(jeu->jvaissJ));
     
    						afficheTerain(win, jeu);
     
    					}
    ici quand je tir, le tir disparaît (sans réinitialisation), et j'ai le même résultat que la première image si je le réinitialise.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Points : 57
    Points
    57
    Par défaut
    Ce problème est toujours d'actualité.
    Plus précisément, comment fait on pour suffisamment ralentir une boucle, pour voir ce qui se déroule à l'intérieur.
    Quand j'utilise sleep(), l’exécution de la boucle est ralenti, mais ça ne m'affiche pas les étapes.

Discussions similaires

  1. déplacement d'un caractère dans un tableau
    Par romain_t dans le forum Fortran
    Réponses: 5
    Dernier message: 30/03/2010, 15h44
  2. [macro] Déplacement de caractères
    Par Vivian Pennel dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/03/2008, 10h19
  3. Quels caractères pour les touches de déplacement?
    Par Phelix2003 dans le forum MATLAB
    Réponses: 10
    Dernier message: 21/09/2007, 10h36
  4. Réponses: 3
    Dernier message: 09/05/2002, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo