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); }
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); } } }