/// <summary> /// title bar design /// </summary> /// <param name="dp"></param> /// <param name="sr">log panel drawing area</param> /// <returns></returns> protected virtual ScreenY drawTitleBar(DrawProperty dp, ScreenRect sr) { var _bd = new CanvasSolidColorBrush(dp.Canvas, Color.FromArgb(64, 0, 0, 0)); var titleHeight = 8; var w3 = sr.Width / 4; var pst = new ScreenPos[] { ScreenPos.From(sr.LT.X, sr.LT.Y + titleHeight + 16), ScreenPos.From(sr.LT.X, sr.LT.Y), ScreenPos.From(sr.RB.X, sr.LT.Y), }; var psb = new ScreenPos[] { ScreenPos.From(sr.RB.X, sr.LT.Y + titleHeight), ScreenPos.From(sr.RB.X - w3, sr.LT.Y + titleHeight + 2), ScreenPos.From(sr.RB.X - w3 * 2, sr.LT.Y + titleHeight + 8), ScreenPos.From(sr.RB.X - w3 * 3, sr.LT.Y + titleHeight + 16), ScreenPos.From(sr.LT.X, sr.LT.Y + titleHeight + 16), }; var ps = pst.Union(psb).ToList(); var path = new CanvasPathBuilder(dp.Canvas); path.BeginFigure(ps[0]); for (var i = 1; i < ps.Count; i++) { path.AddLine(ps[i]); } path.EndFigure(CanvasFigureLoop.Closed); var geo = CanvasGeometry.CreatePath(path); dp.Graphics.FillGeometry(geo, _bd); // edge highlight for (var i = 1; i < pst.Length; i++) { dp.Graphics.DrawLine(pst[i - 1], pst[i], Color.FromArgb(96, 255, 255, 255)); } // edge shadow for (var i = 1; i < psb.Length; i++) { dp.Graphics.DrawLine(psb[i - 1], psb[i], Color.FromArgb(96, 0, 0, 0)); } // title bar design var btr = sr.Clone(); btr.RB = ScreenPos.From(btr.LT.X + ScreenX.From(24), btr.LT.Y + ScreenY.From(12)); btr = btr + ScreenPos.From(4, 4); var imgttl = Assets.Image("LogPanelTitileDesign"); if (imgttl != null) { dp.Graphics.DrawImage(imgttl, btr.LT + ScreenSize.From(-3, -14)); } btr = btr + ScreenX.From(50); // title filter buttons var btn1 = Assets.Image("btnLogPanel"); var btn0 = Assets.Image("btnLogPanelOff"); if (btn1 != null && btn0 != null) { var ctfb = new CanvasTextFormat { FontFamily = "Arial", FontSize = 10.0f, FontWeight = FontWeights.Normal, FontStyle = FontStyle.Italic, }; foreach ((var lv, var caption) in new (LLV, string)[] { (LLV.ERR, "e"), (LLV.WAR, "w"), (LLV.INF, "i"), (LLV.DEV, "d") })
public Level DecodeLevel(Assets assets) { Image img = assets.Image(path); int width = (int)img.Size.X, height = (int)img.Size.Y; L.I($"Loading level \"{name}\" with {width}x{height}={width * height} tiles"); Dictionary<uint, BlockType> map = mapping .Select(t => new KeyValuePair<uint, BlockType>( uint.Parse(t.Key, System.Globalization.NumberStyles.HexNumber), t.Value.LoadBlockType(assets))) .ToDictionary(t => t.Key, t => t.Value); var blocks = new List<Block>(width * height); var bg = assets.Sprite(background); Level l = new Level(width, height, bg, gravity, start); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Color pixel = img.GetPixel((uint)x, (uint)y); UInt32 argb = (((UInt32)pixel.A) << 24) + (((UInt32)pixel.R) << 16) + (((UInt32)pixel.G) << 8) + ((UInt32)pixel.B); BlockType blockType; map.TryGetValue(argb, out blockType); l[x, y] = new Block(blockType); } } return l; }