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 :

Calcul de collision en pente


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut Calcul de collision en pente
    Bonjour,

    J'ai actuellement un petit problème au niveau de mon code. Je possède un écran composés de Tiles dans un jeu de type plateforme et j'aimerais implémenter la collision sur des surfaces en pente de 45° seulement je n'ai aucune idée de comment mettre ça en place, et je ne comprends pas tout sur la plupart des sites sur lesquels j'ai pu trouver un minimum d'informations sur la démarche.

    J'en viens donc à demander votre aide, pour ce faire je vais mettre ici mon code de collision et expliquer un peu quoi est quoi afin de vous donner une idée de l'organisation de mon code.

    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
     
    public void UpdateCollision(ref Entity e)
            {
                FloatRect rect = new FloatRect(position.X, position.Y, Layer.TileDimensions.X, Layer.TileDimensions.Y);
     
                if (e.OnTile && containsEntity)
                {
                    if (!e.SyncTilePosition)
                    {
                        e.Position += velocity * 2f;
                        e.SyncTilePosition = true;
                    }
     
                    if (e.Rect.Right < rect.Left || e.Rect.Left > rect.Right || e.Rect.Bottom + 32 != rect.Top)
                    {
                        e.OnTile = false;
                        containsEntity = false;
                        e.ActivateGravity = true;
                    }
                }
     
                if (e.Rect.Intersects(rect) && state == State.Solid)
                {
                    FloatRect preve = new FloatRect(e.PrevPosition.X, e.PrevPosition.Y, e.Animation.FrameWidth, e.Animation.FrameHeight);
                    FloatRect prevTile = new FloatRect(prevPosition.X, prevPosition.Y, Layer.TileDimensions.X, Layer.TileDimensions.Y);
     
                    if (position.Y >= e.Position.Y && preve.Bottom <= prevTile.Top)
                    {
                        e.Position = new Vector2(e.Position.X, position.Y - e.Animation.FrameHeight);
                        e.ActivateGravity = false;
                        e.OnTile = true;
                        containsEntity = true;
                    }
                    else if (position.Y <= e.Position.Y && preve.Top >= prevTile.Bottom)
                    {
                        e.Position = new Vector2(e.Position.X, position.Y + Layer.TileDimensions.Y);
                        e.Velocity = new Vector2(e.Velocity.X, 0);
                        e.ActivateGravity = true;
                        containsEntity = true;
                    }
                    else if (e.Rect.Right >= rect.Left && preve.Right <= prevTile.Left)
                    {
                        e.Position = new Vector2(position.X - e.Animation.FrameWidth, e.Position.Y);
                        e.Direction = (e.Direction == 1) ? e.Direction = 2 : e.Direction = 1;
                    }
                    else if (e.Rect.Left <= rect.Right && preve.Left >= prevTile.Left)
                    {
                        e.Position = new Vector2(position.X + Layer.TileDimensions.X, e.Position.Y);
                        e.Direction = (e.Direction == 1) ? e.Direction = 2 : e.Direction = 1;
                    }
                }
     
     
                e.Animation.Position = e.Position;
            }
    e : Entité tel que les munitions, ennemis ou encore mon joueur
    containsEntity : booléen qui est à true lorsque une entité est sur une surface de tile solide.
    e.Animation.FrameWidth / FrameHeight : Largeur ou Hauteur de la texture mon entité animée.
    Layer.TileDImensions.X / Y : Largeur ou Hauteur du tile en cours.
    FloatRect : Classe dérivée de Rectangle qui fournit une méthode "Intersects(FloatRect f)" afin de vérifier la collision entre deux rectangles.
    Direction : Direction d'une entité contrôlée par intelligence artificielle.

    Je précise que je développe sous XNA.

    Si vous avez des questions sur un point incompris, n'hésitez pas à me les poser.

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 667
    Par défaut
    Salut,

    voici quelques liens qui pourraient t'aider :

    http://gamedev.stackexchange.com/que...-2d-platformer

    http://gamedev.stackexchange.com/que...andling-slopes

    Par contre si tu insères plusieurs type de Tiles , je te conseil de faire la distinction maintenant , du genre un enum ou ID.

Discussions similaires

  1. Calcules de collision visuel
    Par Invité dans le forum Ogre
    Réponses: 2
    Dernier message: 11/11/2013, 20h23
  2. Calcul de pente
    Par Ptinéwik dans le forum Mathématiques
    Réponses: 6
    Dernier message: 29/06/2009, 02h54
  3. Calcul des pentes
    Par Lost in dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2008, 12h58
  4. Réponses: 2
    Dernier message: 05/07/2007, 17h35
  5. [VB6]calcul et affichage d'une pente
    Par fahmichebaane dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/03/2006, 16h34

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