/// <summary> /// Determines whether a /// </summary> /// <param name="x">The x coordinate.</param> /// <param name="y">The y coordinate.</param> /// <param name="lastTile">The last tile hit.</param> /// <param name="trace">The trace line parameters.</param> /// <param name="hitTile">The tile that was hit.</param> /// <returns> /// <c>true</c> if point is on a solid tile; otherwise, <c>false</c>. /// </returns> private bool IsPointOnSolidTile(int x, int y, GeometryTile lastTile, TraceQuery trace, out GeometryTile hitTile) { hitTile = null; bool hit = false; var map = _mapService.CurrentMap; if (map == null) { return(hit); } var tileCol = (int)Math.Floor((double)x / map.GeometryTileWidth); var tileRow = (int)Math.Floor((double)y / map.GeometryTileHeight); if ((tileCol < 0) || (tileRow < 0)) { return(hit); } for (var i = 0; i < map.CollisionLayers.Length; i++) { var layer = map.CollisionLayers[i]; // if the trace has specific a collision path, ignore layers that are not on the path if (trace.CollisionPath != null) { if ((layer.CollisionPath != null) && (layer.CollisionPath != trace.CollisionPath)) { continue; } } var tile = layer.GetTile(tileCol, tileRow); if (tile != null) { // solidity filters if ( (tile.Definition.SolidType == SolidType.None) && ((trace.Options & TraceLineOptions.SolidOnly) > TraceLineOptions.None)) { continue; } if ( (tile.Definition.SolidType == SolidType.JumpThrough) && ((trace.Options & TraceLineOptions.IgnoreJumpThrough) > TraceLineOptions.None)) { continue; } var collisionMap = tile.Definition.CollisionMap; if (collisionMap != null) { var localX = x - tile.WorldPosition.X; var localY = y - tile.WorldPosition.Y; if (!hit) { if (collisionMap[localX, localY]) { hitTile = tile; hit = true; } } } if (hit) { if (_varShowTracelines.Value) { if ((lastTile == null) || (lastTile.GridPosition.X != tile.GridPosition.X) || (lastTile.GridPosition.Y != tile.GridPosition.Y)) { _renderService.HighlightGeometryTile(tileCol, tileRow, 0, 255, 0, 0); } } } } } return(hit); }