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 :

Deux conditions "if" : l'une n'annule pas l'autre.


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Japon

    Informations forums :
    Inscription : Octobre 2010
    Messages : 64
    Points : 107
    Points
    107
    Par défaut Deux conditions "if" : l'une n'annule pas l'autre.
    Bonjour,

    J'ai un petit problème a priori simple mais qui m’embête un peu.

    Voici le bout de code tout d'abord :

    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
     
     
    	Enemy[id].X += Enemy[id].SpeedX; // mouvement axe X ennemi.
     
     
     
    	if( Enemy[id].X == SCREEN_WIDTH /2 )
     // Si axe ennemi X = moitie largeur fenetre
    	{
    		Enemy[id].SpeedX =0;
    		Enemy[id].Y -= 1.0; // Ennemi remonte sur son axe Y donc
     
    	}
    	if(Enemy[id].Y < 0) // Si axe Y = 0, ennemi doit redescendre
    	{
    		Enemy[id].Y += 10.0;
    	}
    Je ne sais pas si mes commentaires sont assez explicites. En gros j'ai un ennemi qui arrive sur le coté, et qui arrivé a la moitié de la largeur de l’écran doit remonter puis brusquement redescendre. Sauf que comme vous avez pu le remarquer, les deux conditions "if" sont valables donc l'axe Y de l'ennemi "sautille", il ne sait plus s'il doit redescendre ou remonter.
    J'ai bien essayé de bricoler un truc pour que la première condition ne soit plus valable mais je bloque un peu. D'autant que je suis censé rendre un truc plus ou moins "propre" .

    C'est du développement de jeu-vidéo mais j'ai jugé que c’était mieux de poster dans la partie C++. Désolé si ça ne convient pas.

    Merci !

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par kEep OnE Voir le message
    un ennemi qui arrive sur le coté, et qui arrivé a la moitié de la largeur de l’écran doit remonter puis brusquement redescendre.
    Il remonte jusqu'où et à partir de quel moment il redescend ? Tes seuils ne sont peut être pas bon ?

    Tu peux utiliser un DP state en ne testant que ce qui t'intéresse pour le changement d'état et n'incrémentant que la bonne dimension selon l'état :
    Init --- > Avance --(x==W/2)--> Monte --(y<seuil)---> Descend

  3. #3
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    Bonjour,
    A partir de quel moment doit-il redescendre ? Si Enemy[id].Y < 0 je suppose.
    Dans ces cas là :
    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
     
    bool top=false;  //à déclarer avant ta boucle
    while(ennemi pas à destination)
    {        
            if(Enemy[id].X < SCREEN_WIDTH /2)
    		Enemy[id].X += Enemy[id].SpeedX; // mouvement axe X ennemi.	
    	else
    	{
    		if(top==false)
    		{
    			Enemy[id].SpeedX =0;
    			Enemy[id].Y -= 1.0; // Ennemi remonte sur son axe Y donc
    			if(Enemy[id].Y < 0)	top=true;
    		}
    		else
    		{
    			Enemy[id].Y += 10.0;
    		}		
    	}
    }
    Tu peux simplifier le code un peu comme ca :
    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
     
    bool top=false;  //à déclarer avant ta boucle
    while(ennemi pas à destination)
    {        
            if(Enemy[id].X < SCREEN_WIDTH /2)
    		Enemy[id].X += Enemy[id].SpeedX; // mouvement axe X ennemi.
     
    	else if(!top)
    	{
    			Enemy[id].SpeedX =0;
    			Enemy[id].Y -= 1.0; // Ennemi remonte sur son axe Y donc
    			if(Enemy[id].Y < 0)	top=true;
    	}
    	else if(top)
    	{
    		Enemy[id].Y += 10.0;
    	}		
    }
    On me corrigera si ce n'est pas correct. Bon courage à toi !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Japon

    Informations forums :
    Inscription : Octobre 2010
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    Merci de vos pistes, mais malheureusement je n'arrive pas a faire marcher le truc .

    Avec la boucle de Jerome, mon jeu bug complétement et ça bloque :o. Je ne comprends pas bien non plus l’utilité de la boucle while. Je sais que j'ai trop tendance a mettre des "if" partout et que dans un gros programme ça fini probablement par faire un gloubiboulga de conditions et le pauvre ordinateur ne sait plus quoi faire. Bien entendu, j'ai essayé sans boucle et je me retrouve a la case départ, mon ennemi sautille en haut de l’écran sans redescendre !

    >3DArchi : je ne connaissais pas cette méthode, je n'ai pas encore appris cela. Je comprends ce que tu veux dire mais l’écrire, je risque bloquer .

    Merci de votre aide en tout cas.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut Ajout des balises [CODE] (bouton #). merci d'y penser.
    Citation Envoyé par kEep OnE Voir le message
    Bonjour,

    J'ai un petit problème a priori simple mais qui m’embête un peu.

    Voici le bout de code tout d'abord :

    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
     
     
    	Enemy[id].X += Enemy[id].SpeedX; // mouvement axe X ennemi.
     
     
     
    	if( Enemy[id].X == SCREEN_WIDTH /2 )
     // Si axe ennemi X = moitie largeur fenetre
    	{
    		Enemy[id].SpeedX =0;
    		Enemy[id].Y -= 1.0; // Ennemi remonte sur son axe Y donc
     
    	}
    	if(Enemy[id].Y < 0) // Si axe Y = 0, ennemi doit redescendre
    	{
    		Enemy[id].Y += 10.0;
    	}
    Je ne sais pas si mes commentaires sont assez explicites. En gros j'ai un ennemi qui arrive sur le coté, et qui arrivé a la moitié de la largeur de l’écran doit remonter puis brusquement redescendre. Sauf que comme vous avez pu le remarquer, les deux conditions "if" sont valables donc l'axe Y de l'ennemi "sautille", il ne sait plus s'il doit redescendre ou remonter.
    J'ai bien essayé de bricoler un truc pour que la première condition ne soit plus valable mais je bloque un peu. D'autant que je suis censé rendre un truc plus ou moins "propre" .

    C'est du développement de jeu-vidéo mais j'ai jugé que c’était mieux de poster dans la partie C++. Désolé si ça ne convient pas.

    Merci !

    Salut Keep One,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	if( Enemy[id].X == SCREEN_WIDTH /2 )
    	{
    		Enemy[id].SpeedX =0;
    		Enemy[id].Y -= 1.0; // Ennemi remonte sur son axe Y donc
     
    	}
    	if(Enemy[id].Y < 0) // Si axe Y = 0, ennemi doit redescendre
    	{
    		Enemy[id].Y += 10.0;
    	}
    => J'ai du mal à croire que l'ennemi ne fasse que sautiller, il sautille tout en grimpant ou tout en descendant ?

    cela m'étonnerait également que ton Ennemy[id] < 0 fonctionne.... j'imagine que ton personnage n'es pas coller en bas de la fenetre, et en plus même s'il l'était, je vois mal comment il pourrait atteindre une hauteur négative pour ensuite redescendre : es-tu sûr d'où se situe ton axe Y à zéro ?


    Enfin, si le mouvement semble exactement faire ce que tu souhaites, mais qu'il répète le geste sans vouloir s'arrêter, c'est le même problème et la même solution que pour ton décalage de map l'autre fois... il te faut créer un flag (un booléen) permettant de savoir si le mouvement a été effectué.

    ++ ^^

Discussions similaires

  1. Somme a deux conditions : valeur et couleur d'une cellule
    Par Jacket773 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/02/2013, 16h23

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