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

XNA/Monogame Discussion :

Collision 4 coté


Sujet :

XNA/Monogame

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Collision 4 coté
    Bonjour,

    J'essaie de créer un petit jeu simple avec des carrés placer un peu partout sur l'écran. Le but étant que le joueur puisse sauté sur ces carrés pour parcourir le chemin. J'ai de la difficulté à gérer les collisions.

    Je vais vous dire comment je m'y prend, et si quelqu'un as une meilleur solution, ça serais super.

    Pour le sprite de mon joueur, je l'ai séparer en 4 rectangle couvrant les 4 cotés, et j'ai fait de même pour tout mes carrés. Ensuite, j'invoque la méthode Intersect à plusieurs reprise pour toute les éventualités. Exemple, si le coté droit du joueur Intersect le coté gauche du carré, la position du joueur prend comme valeur le coté gauche du carré. Un peu comme ont fais lors de la gestion pour éviter qu'un objet quitte l'écran. Les résultats ne sont pas vraiment à mon gout et je sent que cette façon de faire est un peu grossière. Si vous avez une meilleur vision que moi pour ce style de gestion, je suis prêt à prendre vos suggestions. Après je pourrais continuer à m'amuser un peu en même temps d'apprendre.

    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    J'ai réussi à faire ce que je voulais, avec un bon nombre de if statement.

    Je met mon code si jamais ça peux aidé quelqu'un d'autre.

    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
    private void PlayerBlockCollision()
            {
                foreach (Block blockTemp in blockItem)
                {
                    if (playerRectangle.Intersects(blockTemp.RectangleTexture))
                    {
                        //right
                        if (playerPosition.X > blockTemp.Position.X && playerPosition.Y + playerTexture.Height - speed > blockTemp.Position.Y && playerPosition.Y + speed < blockTemp.Position.Y + blockTemp.Texture.Height)
                        {
                            playerPosition.X = blockTemp.Position.X + blockTemp.Texture.Width;
                            return;
                        }
                        //left
                        if (playerPosition.X < blockTemp.Position.X && playerPosition.Y + playerTexture.Height - speed > blockTemp.Position.Y && playerPosition.Y + speed < blockTemp.Position.Y + blockTemp.Texture.Height)
                        {
                            playerPosition.X = blockTemp.Position.X - playerTexture.Width;
                            return;
                        }
                        //top
                        if (playerPosition.Y < blockTemp.Position.Y && playerPosition.X + speed < blockTemp.Position.X + blockTemp.Texture.Width && playerPosition.X + playerTexture.Width - speed > blockTemp.Position.X)
                        {
                            playerPosition.Y = blockTemp.Position.Y - playerTexture.Height;
                            return;
                        }
                        //down
                        if (playerPosition.Y > blockTemp.Position.Y && playerPosition.X + speed < blockTemp.Position.X + blockTemp.Texture.Width && playerPosition.X + playerTexture.Width - speed > blockTemp.Position.X)
                        {
                            playerPosition.Y = blockTemp.Position.Y + blockTemp.Texture.Height;
                            return;
                        }
                    }
                }

  3. #3
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Oui le plus simple est de le faire avec une bonne colonnade de if ^^ par contre je ne suis pas sûr d'avoir compris le
    Pour le sprite de mon joueur, je l'ai séparer en 4 rectangle couvrant les 4 cotés
    Tu veux dire que tu le sépare "mathématiquement" juste pour les tests d'intersections ? Parce que au niveau des tests à faire ce sont des simples intersections de boites alignées sur les axes. Tu peux aussi simplifier en ayant un tableau de booleen à deux dimensions dans lequel tu écris 0 si c'est libre, et 1 s'il y a un obstacle, tu calcul la position de ton joueur après mouvement si elle est dans une cellule du tableau qui vaut 1 tu reviens à la position d'avant qui est normalement libre.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Salut Oxyde,

    Disons que je partais de loin. La séparation du sprite en 4, ce n'est pas une bonne solution. Hier en me couchant j'ai réfléchie à tout ce codage un peu mal foutu et j'ai trouvé un façon beaucoup plus simple. Ce que je voulais au départ étais de savoir de quel coté mon sprite recevais la collision.

    Voici ma nouvelle solution, qui je le souhaite, sera final et me laissera enfin continuer mon petit jeu.

    Ok, disons que nous avons une boite (sprite) qui est l'obstacle et un joueur (sprite).

    Pour la position de la boite et du joueur, j'utilise le Vector2. J'ajoute un autre Vector2 pour avoir la position temporaire de mon joueur à un moment précis.

    Dans mon Update, j'y vais comme suit:

    JoueurPositionTemporaire = JoueurPosition;
    BougerLeJoueur();
    VérifierCollision();

    Dans VérifierCollision, j'ai vais comme suit:

    Si le Rectangle du joueur Intersect avec le Rectangle de la boite, je trouve de quel coté de la boite le joueur est entré en collision avec des If()

    Exemple pour une collision sur le dessus de la boite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (JoueurPositionTemporaire.Y + JoueurTexture.Height <= BoitePosition.Y)
                        {
                            JoueurPosition.Y = BoitePosition.Y - JoueurTexture.Height;
                        }
    Voilà.

Discussions similaires

  1. algorithme de collision 3D
    Par chetropinchuste dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/02/2010, 14h16
  2. [java3D][collision]
    Par geofun dans le forum 3D
    Réponses: 7
    Dernier message: 12/02/2007, 15h49
  3. [Concept] Curseur coté client et curseur coté serveur
    Par freud dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 13/09/2002, 23h13
  4. [Choix] SGDB pour Entreprise : coût, efficacité, etc.
    Par grassat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/06/2002, 09h52
  5. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 07h03

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