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.