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;
                    }
                }
            }
        }
Exemple #3
0
 /// <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();
 }
Exemple #4
0
        /// <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();
        }