public PrimitiveObject BuildStandartObject(string name, Locator loc, Vector size, CollisionShape shape, Viewer viewer) { PrimitiveObject obj = new PrimitiveObject(name); obj.Viewer = viewer; obj.LocalCenter = loc.Center; obj.LocalAngle = loc.Angle; obj.LocalZIndex = loc.ZIndex; obj.CollisionShape = shape; obj.Size = size; map.AddObject(obj); obj.LocationChanged += map.UpdateObject; obj.LocationChanged += GameProcess.Current_Game.Manager.RegisterObject; obj.Crashed += map.RemoveObject; obj.Crashed += GameProcess.Current_Game.Camera.TryRemoveIndicator; obj.Crashed += GameProcess.Current_Game.Manager.UnRegisterObject; obj.LifeChanged += GameProcess.Current_Game.Camera.IndicateLifeChange; return obj; }
/// <summary> /// Method that return list of primitive objects that may be collision to current primitive object /// It is broad phase of collision /// </summary> /// <param name="current_obj"></param> /// <returns></returns> public List<PrimitiveObject> MaybeCollisionPrimitives(PrimitiveObject pObj) { List<GridCorner> cCorners = targetMap.GetCornersByArea(pObj.AbsoluteCenter, pObj.Size, pObj.AbsoluteAngle); List<PrimitiveObject> maybeCollisionPrimitives = new List<PrimitiveObject>(); foreach (GridCorner col_corner in cCorners) foreach (PrimitiveObject sObj in col_corner.ObjectsInCorner) { if (sObj.CollisionShape != CollisionShape.None) maybeCollisionPrimitives.Add(sObj); } return maybeCollisionPrimitives.Distinct().ToList(); }
/// <summary> /// Transparent object is an object without collision shape. /// </summary> /// <param name="name"></param> /// <param name="loc"></param> /// <param name="viewer"></param> public virtual PrimitiveObject BuildLandscapeTile(Locator loc, Viewer viewer) { PrimitiveObject obj = new PrimitiveObject(); obj.LocalCenter = loc.Center; obj.LocalAngle = loc.Angle; obj.LocalZIndex = loc.ZIndex; obj.Viewer = viewer; obj.CollisionShape = CollisionShape.None; obj.Size = new Vector(map.TileSize / 2, map.TileSize / 2); this.map.AddObject(obj); return obj; }
/// <summary> /// /// </summary> /// <param name="primitive"></param> /// <returns></returns> private TransformGroup GetTransformation(PrimitiveObject primitive, Vector focus, Vector viewSize) { TransformGroup transformGroup = new TransformGroup(); if (primitive.AbsoluteAngle != 0) { RotateTransform rot = new RotateTransform(primitive.AbsoluteAngle, primitive.Size.X, primitive.Size.Y); transformGroup.Children.Add(rot); } TranslateTransform translate = new TranslateTransform(); Vector position = CalculatePositionOnCanvas(primitive.AbsoluteCenter, viewSize, focus); translate.X = position.X - primitive.Size.X; translate.Y = position.Y - primitive.Size.Y; transformGroup.Children.Add(translate); return transformGroup; }
public static MTV GetObjectsMTV(PrimitiveObject objFirst, PrimitiveObject objSecond) { MTV MinTranslate = null; if (objFirst.CollisionShape == CollisionShape.Point) { if (objSecond.CollisionShape == CollisionShape.Rectangle) { MinTranslate = CollisionPointRectangle(objFirst.AbsoluteCenter, objSecond.AbsoluteCenter, objSecond.Size, objSecond.AbsoluteAngle); return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Circle) { MinTranslate = CollisionPointCircle(objFirst.AbsoluteCenter, objSecond.AbsoluteCenter, objSecond.Size.X); return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Point) { return MinTranslate; } } if (objFirst.CollisionShape == CollisionShape.Rectangle) { if (objSecond.CollisionShape == CollisionShape.Rectangle) { MinTranslate = CollisionRectangleRectangle(objFirst.AbsoluteCenter, objFirst.Size, objFirst.AbsoluteAngle, objSecond.AbsoluteCenter, objSecond.Size, objSecond.AbsoluteAngle); return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Point) { MinTranslate = CollisionPointRectangle(objSecond.AbsoluteCenter, objFirst.AbsoluteCenter, objFirst.Size, objFirst.AbsoluteAngle); if (MinTranslate != null) MinTranslate.Direction *= -1; return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Circle) { MinTranslate = CollisionCircleRectangle(objSecond.AbsoluteCenter, objSecond.Size.X, objFirst.AbsoluteCenter, objFirst.Size, objFirst.AbsoluteAngle); if(MinTranslate != null) MinTranslate.Direction *= -1; return MinTranslate; ///Нужно подкорректиировать коллизии от круга } } if (objFirst.CollisionShape == CollisionShape.Circle) { if (objSecond.CollisionShape == CollisionShape.Rectangle) { MinTranslate = CollisionCircleRectangle(objFirst.AbsoluteCenter, objFirst.Size.X, objSecond.AbsoluteCenter, objSecond.Size, objSecond.AbsoluteAngle); return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Circle) { MinTranslate = CollisionCircleCircle(objFirst.AbsoluteCenter, objFirst.Size.X, objSecond.AbsoluteCenter, objSecond.Size.X); return MinTranslate; } if (objSecond.CollisionShape == CollisionShape.Point) { MinTranslate = CollisionPointCircle(objSecond.AbsoluteCenter, objFirst.AbsoluteCenter, objFirst.Size.X); if (MinTranslate != null) MinTranslate.Direction *= -1; return MinTranslate; } } return MinTranslate; }