public override CollResult CheckAgainst(zCollisionPrimitive other, EntityManager.Transform myRoot, EntityManager.Transform hisRoot) { //Transform both into correct space if (other is zCollisionAABB) { CollResult ret = new CollResult(); ret.collided = false; ret.normal = Vector2.Zero; Rectangle mine = m_rect; mine.Offset((int)myRoot.GetPos().X, (int)myRoot.GetPos().Y); Rectangle his = (other as zCollisionAABB).m_rect; his.Offset((int)hisRoot.GetPos().X, (int)hisRoot.GetPos().Y); if (mine.Intersects(his)) { ret.collided = true; ret.normal = new Vector2(his.Center.X - mine.Center.X, his.Center.Y - mine.Center.Y); ret.normal.Normalize(); } return(ret); } //Oh no we can't handle any others. return(other.RedirectedCheckAgainst(this, hisRoot, myRoot)); //Note the swap of transforms }
override public CollResult RedirectedCheckAgainst(zCollisionPrimitive other, EntityManager.Transform myRoot, EntityManager.Transform hisRoot) { CollResult ret = new CollResult(); ret.collided = false; ret.normal = Vector2.Zero; return(ret); }
void SuperHackyLevelParsing() { foreach (GLEED2D.Layer layer in testLevel.Layers) { if (layer.Name.ToLower() == "collision") { //For now only process this layer //All items on this layer should be either a path, circle, or AABB foreach (GLEED2D.Item item in layer.Items) { //I don't like this, it's fine for when they were serialized out but not for loading them. //One size does not fit all if (item.GetType() == typeof(GLEED2D.PathItem)) { CollisionManager.CollisionComponent foo = CollisionManager.Get().GetCollComponent(); EntityManager.Transform footrans = EntityManager.get().GetTransform(); footrans.Set(item.Position, Vector2.Zero, Vector2.Zero, 0); item.Position = Vector2.Zero; foo.SetTransform(footrans); foo.AddPrimitive(new zCollisionPath((GLEED2D.PathItem)item)); } else if (item.GetType() == typeof(GLEED2D.RectangleItem)) { GLEED2D.RectangleItem gleeRect = (GLEED2D.RectangleItem)item; Rectangle zeRect = new Rectangle((int)gleeRect.Position.X, (int)gleeRect.Position.Y, (int)gleeRect.Width, (int)gleeRect.Height); CollisionManager.CollisionComponent foo = CollisionManager.Get().GetCollComponent(); EntityManager.Transform footrans = EntityManager.get().GetTransform(); footrans.Set(item.Position, Vector2.Zero, Vector2.Zero, 0); item.Position = Vector2.Zero; foo.SetTransform(footrans); foo.AddPrimitive(new zCollisionAABB(zeRect)); } else if (item.GetType() == typeof(GLEED2D.CircleItem)) { GLEED2D.CircleItem gleeCircle = (GLEED2D.CircleItem)item; CollisionManager.CollisionComponent foo = CollisionManager.Get().GetCollComponent(); EntityManager.Transform footrans = EntityManager.get().GetTransform(); footrans.Set(item.Position, Vector2.Zero, Vector2.Zero, 0); item.Position = Vector2.Zero; foo.SetTransform(footrans); foo.AddPrimitive(new zCollisionCircle(gleeCircle.Position, gleeCircle.Radius)); } } } } }
/// <summary> /// Called if other could not handle the collision so passed the buck to this class. If this does not have /// the logic to handle the collision it should assert. Chances are if this happens it's Glenn's fault. /// </summary> /// <param name="other">Primitive that has already attempted to resolve collision</param> /// <param name="myRoot">Transform passed from CollisionComponent</param> /// <param name="hisRoot">Transform passed from other's CollisionComponent</param> /// <returns>CollResult instance describing collision</returns> abstract public CollResult RedirectedCheckAgainst(zCollisionPrimitive other, EntityManager.Transform myRoot, EntityManager.Transform hisRoot);
CollisionComponent(EntityManager.Transform t, CollCallBack coll) { tran = t; callback = coll; }
public void SetTransform(EntityManager.Transform to) { tran = to; }
static CollisionComponent creator(EntityManager.Transform t, CollCallBack coll) { return(new CollisionComponent(t, coll)); }
List <zCollisionPrimitive> prims = new List <zCollisionPrimitive>(); //Multiple prims per coll comp CollisionComponent(EntityManager.Transform t, CollCallBack coll) { tran = t; callback = coll; }