Ah ok, je vois le problème...
En fait le Clip est une géométrie relative au contrôle : le centre de ton ellipse, c'est (150,150) par rapport à ton PacMan, pas par rapport au canvas. Il faudrait donc convertir cette géométrie dans le référentiel du Canvas.
Pour ça il suffit de décaler le Clip (ou plutôt une copie du Clip) par rapport à la position du contrôle sur le Canvas, en appliquant une TranslateTransform :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Geometry g1 = element1.Clip.Clone(); double offset1X = Canvas.GetLeft(element1); double offset1Y = Canvas.GetTop(element1); g1.Transform = new TranslateTransform(offset1X, offset1Y); Geometry g2 = element2.Clip.Clone(); double offset2X = Canvas.GetLeft(element2); double offset2Y = Canvas.GetTop(element2); g2.Transform = new TranslateTransform(offset2X, offset2Y); Geometry intersect = Geometry.Combine(g1, g2, GeometryCombineMode.Intersect, null); return !intersect.IsEmpty();
EDIT: comme ça risque d'être un peu lourd de cloner les géométries à chaque fois, je pense qu'il vaudrait mieux que chacun de tes UserControl définisse une propriété Geometry, initialisée en clonant le Clip. Ca renverrait toujours la même Geometry en faisant simplement varier la transformation :
Code C# : 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 private Geometry _geometry; private TranslateTransform _transform; public Geometry Geometry { get { if (_geometry == null) { _geometry = this.Clip.Clone(); _transform = new TranslateTransform(); _geometry.Transform = _transform; } _transform.X = Canvas.GetLeft(this); _transform.Y = Canvas.GetTop(this); return _geometry; } }
Et dans la méthode TestCollision, tu n'as plus qu'à tester sur la propriété Geometry au lieu de refaire le calcul à chaque fois
Partager