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

SDL Discussion :

Déplacement sprite vers une direction variable


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut Déplacement sprite vers une direction variable
    Bonjour à tous,

    j'ai besoin d'un peu d'aide car je désespère un peu.

    je vous explique mon problème, je suis en train de créer un petit jeu en 2D grâce à la librairie SDL, le but du jeu est de contrôler un lapin afin d'éviter les chiens envoyés par le chasseur (qui balaye le haut de l'écran). Et la où je bloque c'est que le chien doit suivre la direction du lapin (si elle change entre temps).

    voici comment j'ai codé le déplacement du chien:

    positionChien->x = positionChien->x + 1;

    positionChien->y = positionChien->y + (vecteurChienY/vecteurChienX);

    avec vecteurChienX = positionLapin->x - positionChien->x

    et vecteurChienY = positionLapin->y - positionChien->y

    Mais le chien ne suis pas la direction du lapin alors je ne sais plus comment faire.

    De plus je pense que s'est du au fait que vecteurChienY/vecteurChienX est un float.

    Pouvez vous me venir en aide s'il vous plait?

    Merci,

    Morgan

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Bonjour,

    Il faut faire l'opération suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionLapinX - positionChienX
    Si le résultat est négatif, il faut que le chien aille sur la gauche, sinon sur la droite.
    Le même principe peut être appliqué pour l'axe des Y.

    Ce qui donnera un code similaire à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if ( positionLapinX - positionChienX < 0 )
    {
        positionChienX -= speedChien;
    }
    else
    {
        positionChienX += speedChien;
    }
    Dans ma tête, ça marche très bien comme méthode
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Il y a ce code que tu peux essayer mais à retranscrire dans ton langage.
    de façon à simplifier le nombre de IF.
    Mais le principe de ce code est le bon, par contre il ne faut pas que le speed du chien soit supérieur à la largeur d'image du lapin c'est à dire lapin_X2 - lapin_X1, sinon le chien n'attrapera jamais le lapin et la boucle de poursuite continuera tout le temps en faisant zigzaguer le chien de part et d'autre du lapin, idem pour la hauteur d'image du lapin (lapin_Y2-lapinY1).

    C'est une Boucle de course où :
    - X1 est le X gauche du lapin et X2= X droit du lapin.
    - Y1 est le Y haut du lapin et Y2 = Y bas du lapin.
    - attrape est la variable qui indique à la boucle que le lapin est attrapé, quand attrape vaut 1 donc.
    - attrape_X indique que le X du chien se trouve entre X1 et X2 du lapin.
    - attrape_Y indique que le Y du chien se trouve entre le Y1 et Y2 du lapin.

    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
    attrape=0;
    whyle attrape=0 do
    {
    // Teste pour le X
     
    if (chien_X<lapin_X1)
    {
      inc(chien_X,chien_speed)
    }else
    if (chien_X>lapin_X2)
    {
    dec(chien_X,chien_speed)
    }else attrape_X=1;
     
     
    // teste pour le Y
     
    if (chien_Y<lapin_Y1)
    {
    inc(chien_Y,chien_speed)
    }else
    if (chien_Y>lapin_Y2)
    {
    dec(chien_Y,chien_speed)
    }else attrape_Y=1;
     
    if (attrape_X==1) and (attrape_Y==1)
    {
    attrape=1;
    }
     
    }
    En fait je viens de réfléchir à ton message et je vois que ton lapin doit échapper à plusieurs chiens et non un seul, donc il faut faire attention à ça.

    Il y a une autre méthode pour savoir si le lapin est à la meme position qu'un chien :

    Pour tester si le lapin est attrapé je ferais un tableau de la map par exemple un tableau de 20 x 20 cases avec une taille de case correspondant à la taille d'un chien, je dis 20 x 20 mais c'est un exemple, cela dépend de la taille de ta map.
    Quand le lapin se déplace on calcule la référence X et Y de la case map où il se trouve (en se servant de la position x et Y du lapin) et dans cette case on met la valeur 1 signifiant "présence du lapin" (Toutes les cases du tableau de map ont été initialisées à zéro dés le départ du jeu.

    Ensuite quand un chien se déplace on calcule la référence X et Y de la case map où il se trouve (en se servant de la position x et Y du chien) et on vérifie si dans cette case se trouve le lapin, donc présence d'un 1.

    Si c'est le cas le lapin est attrapé, sinon on fait courir le chien (incrément ou décrément de X ou Y du chien).

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Oui, tu peux aussi calculer la distance entre les chien et le lapin, si la distance < 1 (ou une autre valeur), alors lapin et chien sont sur la même case.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Bonjour et merci à tous pour vos réponse!!

    J'ai réussi à m'en sortir!!

    Voici ce que j'ai fait:

    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
    void deplacementChocobo(SDL_Rect* positionLapin, SDL_Rect* positionChasseur, SDL_Rect* positionChocobo)
    {
        double vecteurChocoboX, vecteurChocoboY, normeVecteur;
     
     
        vecteurChocoboX = positionLapin->x - positionChocobo->x;
        vecteurChocoboY = positionLapin->y - positionChocobo->y;
        normeVecteur = sqrt((vecteurChocoboX*vecteurChocoboX)+(vecteurChocoboY*vecteurChocoboY));
     
     
        if (vecteurChocoboY >= 0)
        {
            positionChocobo->x += 6*(vecteurChocoboX/normeVecteur);
            positionChocobo->y += 6*(vecteurChocoboY/normeVecteur);
        }
        else if (positionChocobo->x <= positionLapin->x)
            positionChocobo->x += 6;
        else if (positionChocobo->x >= (positionLapin->x + 30))
            positionChocobo->x -= 6;
     
    }
    Encore merci à vous!

  6. #6
    Membre très actif
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Par défaut
    Chapeau, content pour toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb variable avec espace vers une popup
    Par rdams dans le forum Langage
    Réponses: 5
    Dernier message: 30/08/2006, 15h20
  2. Passage d'une variable vers une fenêtre
    Par lodan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/07/2006, 10h25
  3. envoyer le contenu de variables vba vers une feuille excel
    Par Sebastien_INR59 dans le forum Access
    Réponses: 1
    Dernier message: 21/06/2006, 19h58
  4. openGL: avancer le cube vers une certaine direction
    Par darkmalak01 dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2005, 19h26
  5. Lien vers une variable ?
    Par drinkmilk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/02/2005, 09h55

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