public Sprite(Image sprite, Transformation transformation, AnimationScript animation, SATCollisionVolume collider) { this.Image = sprite; SubRect = new Rectangle(0, 0, sprite.Texture.Width, sprite.Texture.Height); this.Transformation = new Transformation(transformation); this.AnimationScript = animation; this.CollisionVolume = collider; OnDraw += this.Draw; if (CollisionVolume != null) { OnUpdate += delegate(GameTime time) { collider.TransformCollisionVolume(this.Transformation); }; } }
/// <summary> /// An Actor can be drawn on screen, translated around arbitrarily, collide with other game objects, and process update logic every frame. /// </summary> /// <param name="sprite">The artwork the actor will use during Draw.</param> /// <param name="transformation">Positioning information.</param> /// <param name="collider">A collision shape that mirrors the transformation.</param> public Actor(Image sprite, Transformation transformation, SATCollisionVolume collider) : base(sprite, transformation, collider) { }
public Sprite(Image sprite, Transformation transformation, SATCollisionVolume collider) : this(sprite, transformation, null, collider) { }
static void TestCollisionVolume() { //Two non-touching squares SATCollisionVolume cv = new SATCollisionVolume(); SATCollisionVolume cv2 = new SATCollisionVolume(); cv.AddVertex(Vector2.Zero); cv.AddVertex(new Vector2(0, 1)); cv.AddVertex(Vector2.One); cv.AddVertex(new Vector2(1, 0)); cv2.AddVertex(new Vector2(2, 0)); cv2.AddVertex(new Vector2(2, 1)); cv2.AddVertex(new Vector2(3, 1)); cv2.AddVertex(new Vector2(3, 0)); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == false); //Two overlapping squares cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(Vector2.Zero); cv.AddVertex(new Vector2(0, 1)); cv.AddVertex(Vector2.One); cv.AddVertex(new Vector2(1, 0)); cv2.AddVertex(new Vector2(0.9f, 0)); cv2.AddVertex(new Vector2(0.9f, 1)); cv2.AddVertex(new Vector2(2, 1)); cv2.AddVertex(new Vector2(2, 0)); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == true); //two non-overlapping triangles cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(0, 1); cv.AddVertex(1, 1); cv2.AddVertex(2, 0); cv2.AddVertex(3, 1); cv2.AddVertex(3, 0); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == false); //two overlapping triangles cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(0, 1); cv.AddVertex(1, 1); cv2.AddVertex(0, 0); cv2.AddVertex(1, 1); cv2.AddVertex(1, 0); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == true); //two overlapping triangles that are both defined counterclockwise cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(1, 1); cv.AddVertex(0, 1); cv2.AddVertex(0, 0); cv2.AddVertex(1, 0); cv2.AddVertex(1, -1); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == true); //two overlapping triangles that are both defined in negative space counterclockwise cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(-1, -1); cv.AddVertex(0, -1); cv2.AddVertex(0, 0); cv2.AddVertex(-1, 0); cv2.AddVertex(-1, -1); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == true); //two overlapping triangles that are both defined in negative space cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(0, 1); cv.AddVertex(-1, 1); cv2.AddVertex(0, 0); cv2.AddVertex(-1, 1); cv2.AddVertex(-1, 0); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == true); //two non-overlapping triangles on opposite sides of the x axis cv = new SATCollisionVolume(); cv2 = new SATCollisionVolume(); cv.AddVertex(0, 0); cv.AddVertex(0, 1); cv.AddVertex(1, 1); cv2.AddVertex(0, -1); cv2.AddVertex(1, -1); cv2.AddVertex(1, -2); System.Diagnostics.Debug.Assert(cv.TestCollision(cv2) == false); }