protected bool PerPixelCollision(SpriteAdapter i_Sprite) { bool isTherePixelCollision = false; GetCollidedRectangleBounds( out int positionXStart, out int positionXEnd, out int positionYStart, out int positionYEnd, i_Sprite); for (int j = positionYStart; j < positionYEnd; ++j) { for (int i = positionXStart; i < positionXEnd; ++i) { Color sourceColor = i_Sprite.TexturePixels[(i - i_Sprite.Bounds.X) + ((j - i_Sprite.Bounds.Y) * i_Sprite.Texture.Width)]; Color myColor = TexturePixels[(i - Bounds.X) + ((j - Bounds.Y) * Texture.Width)]; if (checkIfBothPixelsAreNotTransparent(sourceColor, myColor)) { CollidedPixels.Add((i - Bounds.X) + ((j - Bounds.Y) * Texture.Width)); isTherePixelCollision = true; } } } return(isTherePixelCollision); }
protected void GetCollidedRectangleBounds( out int o_PositionXStart, out int o_PositionXEnd, out int o_PositionYStart, out int o_PositionYEnd, SpriteAdapter i_Sprite) { o_PositionXStart = Math.Max(i_Sprite.Bounds.X, Bounds.X); o_PositionXEnd = Math.Min(i_Sprite.Bounds.X + i_Sprite.Bounds.Width, Bounds.X + Bounds.Width); o_PositionYStart = Math.Max(i_Sprite.Bounds.Y, Bounds.Y); o_PositionYEnd = Math.Min(i_Sprite.Bounds.Y + i_Sprite.Bounds.Height, Bounds.Y + Bounds.Height); }
public override bool CheckCollision(ICollidable i_Source) { bool collided = false; ICollidable2D source = i_Source as ICollidable2D; if (IsAlive && source != null) { SpriteAdapter sprite = i_Source as SpriteAdapter; if (sprite != null) { if (sprite.TeamColor != TeamColor && sprite.IsAlive) { if (sprite.Bounds.Intersects(Bounds)) { collided = !CheckPerPixel || PerPixelCollision(sprite); } } } } return(collided); }