Exemple #1
0
        private void TilesetView_MouseDown(object sender, MouseEventArgs e)
        {
            Tileset tileset = this.SelectedTileset.Res;

            if (tileset == null)
            {
                return;
            }

            int tileIndex = this.TilesetView.HoveredTileIndex;

            if (tileIndex < 0 || tileIndex > tileset.TileCount)
            {
                return;
            }

            // Conditional toggle operation on left click
            if (e.Button == MouseButtons.Left)
            {
                TileInput          input     = tileset.TileInput.Count > tileIndex ? tileset.TileInput[tileIndex] : default(TileInput);
                TileCollisionShape collision = input.Collision[this.editLayerIndex];
                this.drawSimple = false;
                switch (this.hoveredArea)
                {
                case TileHotSpot.Left:
                    this.drawShape = TileCollisionShape.Left;
                    this.drawMode  = !collision.HasFlag(TileCollisionShape.Left) ? CollisionDrawMode.Add : CollisionDrawMode.Remove;
                    break;

                case TileHotSpot.Right:
                    this.drawShape = TileCollisionShape.Right;
                    this.drawMode  = !collision.HasFlag(TileCollisionShape.Right) ? CollisionDrawMode.Add : CollisionDrawMode.Remove;
                    break;

                case TileHotSpot.Top:
                    this.drawShape = TileCollisionShape.Top;
                    this.drawMode  = !collision.HasFlag(TileCollisionShape.Top) ? CollisionDrawMode.Add : CollisionDrawMode.Remove;
                    break;

                case TileHotSpot.Bottom:
                    this.drawShape = TileCollisionShape.Bottom;
                    this.drawMode  = !collision.HasFlag(TileCollisionShape.Bottom) ? CollisionDrawMode.Add : CollisionDrawMode.Remove;
                    break;

                default:
                    if (collision == TileCollisionShape.Free)
                    {
                        this.drawSimple = true;
                        this.drawMode   = CollisionDrawMode.Set;
                        this.drawShape  = TileCollisionShape.Solid;
                    }
                    else if (collision == TileCollisionShape.Solid)
                    {
                        this.drawMode  = CollisionDrawMode.Set;
                        this.drawShape = TileCollisionShape.DiagonalUp;
                    }
                    else if (collision.HasFlag(TileCollisionShape.DiagonalUp))
                    {
                        this.drawMode  = CollisionDrawMode.Set;
                        this.drawShape = TileCollisionShape.DiagonalDown;
                    }
                    else if (collision.HasFlag(TileCollisionShape.DiagonalDown))
                    {
                        this.drawMode  = CollisionDrawMode.Set;
                        this.drawShape = TileCollisionShape.Free;
                    }
                    else
                    {
                        this.drawMode  = CollisionDrawMode.Set;
                        this.drawShape = TileCollisionShape.Solid;
                    }
                    break;
                }
                this.isUserDrawing = true;
            }
            // Clear operation on right click
            else if (e.Button == MouseButtons.Right)
            {
                this.drawSimple    = true;
                this.drawShape     = TileCollisionShape.Free;
                this.drawMode      = CollisionDrawMode.Set;
                this.isUserDrawing = true;
            }

            // Perform the drawing operation
            this.PerformUserDrawAction();
            this.TilesetView.InvalidateTile(tileIndex, 0);
        }
Exemple #2
0
        private void TilesetView_PaintTiles(object sender, TilesetViewPaintTilesEventArgs e)
        {
            Color colorFree      = Color.White;
            Color colorCollision = Color.FromArgb(128, 192, 255);

            TileInput[] tileInput = e.Tileset.TileInput.Data;
            for (int i = 0; i < e.PaintedTiles.Count; i++)
            {
                TilesetViewPaintTileData paintData = e.PaintedTiles[i];

                // Prepare some data we'll need for drawing the tile collision info overlay
                TileCollisionShape collision = TileCollisionShape.Free;
                if (tileInput.Length > paintData.TileIndex)
                {
                    collision = tileInput[paintData.TileIndex].Collision[this.editLayerIndex];
                }
                bool tileHovered     = this.TilesetView.HoveredTileIndex == paintData.TileIndex;
                bool simpleCollision =
                    collision == TileCollisionShape.Solid ||
                    collision == TileCollisionShape.Free;

                // Draw the center icon indicating the tiles simple solid / free state, as well as diagonal slopes
                {
                    bool centerIsCollision =
                        collision == TileCollisionShape.Solid ||
                        collision.HasFlag(TileCollisionShape.DiagonalUp) ||
                        collision.HasFlag(TileCollisionShape.DiagonalDown);

                    Bitmap centerImage;
                    if (collision == TileCollisionShape.Solid)
                    {
                        centerImage = TilemapsResCache.TilesetCollisionBit;
                    }
                    else if (collision.HasFlag(TileCollisionShape.DiagonalUp))
                    {
                        centerImage = TilemapsResCache.TilesetCollisionDiagUp;
                    }
                    else if (collision.HasFlag(TileCollisionShape.DiagonalDown))
                    {
                        centerImage = TilemapsResCache.TilesetCollisionDiagDown;
                    }
                    else
                    {
                        centerImage = TilemapsResCache.TilesetCollisionBit;
                    }

                    Color centerColor;
                    if (centerIsCollision)
                    {
                        centerColor = colorCollision;
                    }
                    else
                    {
                        centerColor = colorFree;
                    }

                    e.Graphics.DrawImageTint(
                        centerImage,
                        Color.FromArgb(GetCollisionIconAlpha(
                                           tileHovered,
                                           this.hoveredArea == TileHotSpot.Center,
                                           centerIsCollision), centerColor),
                        paintData.ViewRect.X + (paintData.ViewRect.Width - centerImage.Width) / 2,
                        paintData.ViewRect.Y + (paintData.ViewRect.Height - centerImage.Height) / 2);
                }

                // Draw collision icons for specific directional passability.
                if (!simpleCollision || (tileHovered && (!this.isUserDrawing || !this.drawSimple)))
                {
                    e.Graphics.DrawImageTint(
                        TilemapsResCache.TilesetCollisionVertical,
                        Color.FromArgb(GetCollisionIconAlpha(
                                           tileHovered,
                                           this.hoveredArea == TileHotSpot.Right,
                                           !simpleCollision && collision.HasFlag(TileCollisionShape.Right)),
                                       collision.HasFlag(TileCollisionShape.Right) ? colorCollision : colorFree),
                        paintData.ViewRect.X + paintData.ViewRect.Width - TilemapsResCache.TilesetCollisionVertical.Width - 1,
                        paintData.ViewRect.Y + (paintData.ViewRect.Height - TilemapsResCache.TilesetCollisionVertical.Height) / 2);
                    e.Graphics.DrawImageTint(
                        TilemapsResCache.TilesetCollisionVertical,
                        Color.FromArgb(GetCollisionIconAlpha(
                                           tileHovered,
                                           this.hoveredArea == TileHotSpot.Left,
                                           !simpleCollision && collision.HasFlag(TileCollisionShape.Left)),
                                       collision.HasFlag(TileCollisionShape.Left) ? colorCollision : colorFree),
                        paintData.ViewRect.X + 1,
                        paintData.ViewRect.Y + (paintData.ViewRect.Height - TilemapsResCache.TilesetCollisionVertical.Height) / 2);
                    e.Graphics.DrawImageTint(
                        TilemapsResCache.TilesetCollisionHorizontal,
                        Color.FromArgb(GetCollisionIconAlpha(
                                           tileHovered,
                                           this.hoveredArea == TileHotSpot.Top,
                                           !simpleCollision && collision.HasFlag(TileCollisionShape.Top)),
                                       collision.HasFlag(TileCollisionShape.Top) ? colorCollision : colorFree),
                        paintData.ViewRect.X + (paintData.ViewRect.Width - TilemapsResCache.TilesetCollisionHorizontal.Width) / 2,
                        paintData.ViewRect.Y + 1);
                    e.Graphics.DrawImageTint(
                        TilemapsResCache.TilesetCollisionHorizontal,
                        Color.FromArgb(GetCollisionIconAlpha(
                                           tileHovered,
                                           this.hoveredArea == TileHotSpot.Bottom,
                                           !simpleCollision && collision.HasFlag(TileCollisionShape.Bottom)),
                                       collision.HasFlag(TileCollisionShape.Bottom) ? colorCollision : colorFree),
                        paintData.ViewRect.X + (paintData.ViewRect.Width - TilemapsResCache.TilesetCollisionHorizontal.Width) / 2,
                        paintData.ViewRect.Y + paintData.ViewRect.Height - TilemapsResCache.TilesetCollisionHorizontal.Height - 1);
                }
            }
        }