public CollisionMask(CollisionMaskFunction collisionMaskFunction, BoundingBox bbox) { if (collisionMaskFunction == CollisionMaskFunction.Precise) { throw new ArgumentOutOfRangeException(nameof(collisionMaskFunction)); } CollisionMaskFunction = collisionMaskFunction; switch (collisionMaskFunction) { case CollisionMaskFunction.Disk: _hitTestFunc = HitTestDisk; break; case CollisionMaskFunction.Diamond: _hitTestFunc = HitTestDiamond; break; case CollisionMaskFunction.Rectangle: _hitTestFunc = HitTestRectangle; break; } Left = bbox.Left; Right = bbox.Right; Top = bbox.Top; Bottom = bbox.Bottom; }
public CollisionMask(IImage[] images, BoundingBox bbox, int alphaTolerance) { _hitTestFunc = HitTestPrecise; CollisionMaskFunction = CollisionMaskFunction.Precise; Left = bbox.Left; Top = bbox.Top; Right = bbox.Right; Bottom = bbox.Bottom; var w = Right - Left + 1; var h = Bottom - Top + 1; Mask = Enumerable.Range(0, h) .Select(i => new BitArray(w)) .ToArray(); foreach (var image in images) { for (var i = 0; i < w * h; i++) { var x = i % w; var y = i / w; var ptr = (Top + y) * image.Width + (Left + x); var alpha = (image.ImageData[ptr] & 0xFF000000) >> 24; if (alpha > alphaTolerance) { Mask[y][x] = true; } } } }
/// <summary> /// Creates a sprite with a manual bounding box. /// </summary> public GameSprite(GameContext context, int w, int h, int xorigin, int yorigin, IImage[] subImages, CollisionMaskFunction collisionMaskFunction, BoundingBox boundingBox, bool separateCollisionMasks) { Context = context; Width = w; Height = h; XOrigin = xorigin; YOrigin = yorigin; SubImages = subImages; CollisionMaskFunction = collisionMaskFunction; BoundingBox = boundingBox; SeparateCollisionMasks = separateCollisionMasks; BoundingBoxFunction = BoundingBoxFunction.Manual; CollisionMasks = GenerateCollisionMasks(); }
/// <summary> /// Creates a sprite with an auto or full-image bounding box. /// </summary> public GameSprite(GameContext context, int width, int height, int xorigin, int yorigin, IImage[] subImages, CollisionMaskFunction collisionMaskFunction, bool autoBoundingBox, int alphaTolerance, bool separateCollisionMasks) { Context = context; Width = width; Height = height; XOrigin = xorigin; YOrigin = yorigin; SubImages = subImages; CollisionMaskFunction = collisionMaskFunction; SeparateCollisionMasks = separateCollisionMasks; if (autoBoundingBox) { BoundingBox = BoundingBox.Detect(subImages, alphaTolerance); } else { BoundingBox = new BoundingBox(0, 0, width - 1, height - 1); } CollisionMasks = GenerateCollisionMasks(); }