public void Draw(MeshItem mesh) { if (mesh.RenderObject is Frame) { this.DrawItem(mesh, (Frame)mesh.RenderObject); } else if (mesh.RenderObject is Skeleton) { this.DrawItem(mesh, (Skeleton)mesh.RenderObject); } else if (mesh.RenderObject is TextMesh) { var textmesh = (TextMesh)mesh.RenderObject; this.DrawItem(mesh, textmesh); } else if (mesh.RenderObject is LineListMesh) { this.DrawItem((LineListMesh)mesh.RenderObject); } else if (mesh.RenderObject is ParticleSystem) { this.DrawItem(mesh, (ParticleSystem)mesh.RenderObject); } }
public void MeshPush(MeshItem mesh) { mesh.RenderObject = null; this.meshPool.Push(mesh); }
public void Measure(MeshItem mesh, ref Rectangle[] region, out int count) { Rectangle rect = Rectangle.Empty; if (mesh.RenderObject is TextMesh) { var textItem = (TextMesh)mesh.RenderObject; var size = textItem.Font.MeasureString(textItem.Text); var pos = mesh.Position; switch (textItem.Align) { case Alignment.Near: break; case Alignment.Center: pos.X -= size.X / 2; break; case Alignment.Far: pos.X -= size.X; break; } var padding = textItem.Padding; var rectBg = new Rectangle((int)(pos.X - padding.Left), (int)(pos.Y - padding.Top), (int)(size.X + padding.Left + padding.Right), (int)(size.Y + padding.Top + padding.Bottom) ); var rectText = new Rectangle((int)pos.X, (int)pos.Y, (int)size.X, (int)size.Y); count = 1; EnsureArraySize(ref region, count); Rectangle.Union(ref rectBg, ref rectText, out region[0]); return; } if (mesh.RenderObject is Frame) { var frame = (Frame)mesh.RenderObject; rect = frame.Rectangle; if (mesh.FlipX) { rect.X = -rect.Right; } } else { count = 0; return; } rect.X += (int)mesh.Position.X; rect.Y += (int)mesh.Position.Y; if (mesh.TileRegion != null) { var tileRegion = mesh.TileRegion.Value; count = tileRegion.Width * tileRegion.Height; EnsureArraySize(ref region, count); Point offset = mesh.TileOffset.ToPoint(); int i = 0; for (int y = tileRegion.Top; y < tileRegion.Bottom; y++) { for (int x = tileRegion.Left; x < tileRegion.Right; x++) { region[i++] = new Rectangle(rect.X + x * offset.X, rect.Y + y * offset.Y, rect.Width, rect.Height); } } } else { count = 1; EnsureArraySize(ref region, count); region[0] = rect; } }
private void DrawItem(MeshItem mesh, TextMesh text) { if (text.Text != null && text.Font != null) { var size = text.Font.MeasureString(text.Text); var pos = mesh.Position; switch (text.Align) { case Alignment.Near: break; case Alignment.Center: pos.X -= (int)(size.X / 2); break; case Alignment.Far: pos.X -= size.X; break; } var padding = text.Padding; var rect = new Rectangle((int)(pos.X - padding.Left), (int)(pos.Y - padding.Top), (int)(size.X + padding.Left + padding.Right), (int)(size.Y + padding.Top + padding.Bottom) ); if (this.CullingEnabled) { if (!this.IntersectsVP(rect)) { return; } } object baseFont = text.Font.BaseFont ?? text.Font; if (baseFont is XnaFont) { Prepare(ItemType.Sprite); } else if (baseFont is D2DFont) { Prepare(ItemType.D2DObject); } else { return; } if (text.BackColor.A > 0) //绘制背景 { switch (this.lastItem) { case ItemType.Sprite: sprite.FillRoundedRectangle(rect, text.BackColor); break; case ItemType.D2DObject: d2dRender.FillRoundedRectangle(rect, 3, text.BackColor); break; } } if (text.ForeColor.A > 0) //绘制文字 { switch (this.lastItem) { case ItemType.Sprite: sprite.DrawStringEx((XnaFont)baseFont, text.Text, pos, text.ForeColor); break; case ItemType.D2DObject: d2dRender.DrawString((D2DFont)baseFont, text.Text, pos, text.ForeColor); break; } } } }
private void DrawName(SceneItem item) { StringResult sr = null; MeshItem mesh = null; if (item is LifeItem) { var life = (LifeItem)item; switch (life.Type) { case LifeItem.LifeType.Mob: if (this.patchVisibility.MobNameVisible) { string lv = "Lv." + (life.LifeInfo?.level ?? 0); string name; if (this.StringLinker?.StringMob.TryGetValue(life.ID, out sr) ?? false) { name = sr.Name; } else { name = life.ID.ToString(); } //绘制怪物名称 mesh = batcher.MeshPop(); mesh.Position = new Vector2(life.X, life.Cy + 4); mesh.RenderObject = new TextMesh() { Align = Alignment.Center, ForeColor = Color.White, BackColor = new Color(Color.Black, 0.7f), Font = renderEnv.Fonts.MobNameFont, Padding = new Margins(2, 2, 2, 2), Text = name }; batcher.Draw(mesh); //绘制怪物等级 var nameRect = batcher.Measure(mesh)[0]; mesh.Position = new Vector2(nameRect.X - 2, nameRect.Y + 3); mesh.RenderObject = new TextMesh() { Align = Alignment.Far, ForeColor = Color.White, BackColor = new Color(Color.Black, 0.7f), Font = renderEnv.Fonts.MobLevelFont, Padding = new Margins(2, 1, 1, 1), Text = lv }; batcher.Draw(mesh); batcher.MeshPush(mesh); } break; case LifeItem.LifeType.Npc: if (this.patchVisibility.NpcNameVisible) { string name, desc; if (this.StringLinker?.StringNpc.TryGetValue(life.ID, out sr) ?? false) { name = sr.Name; desc = sr.Desc; } else { name = life.ID.ToString(); desc = null; } if (name != null) { mesh = batcher.MeshPop(); mesh.Position = new Vector2(life.X, life.Cy + 4); mesh.RenderObject = new TextMesh() { Align = Alignment.Center, ForeColor = Color.Yellow, BackColor = new Color(Color.Black, 0.7f), Font = renderEnv.Fonts.NpcNameFont, Padding = new Margins(2, 2, 2, 2), Text = name }; batcher.Draw(mesh); batcher.MeshPush(mesh); } if (desc != null) { mesh = batcher.MeshPop(); mesh.Position = new Vector2(life.X, life.Cy + 20); mesh.RenderObject = new TextMesh() { Align = Alignment.Center, ForeColor = Color.Yellow, BackColor = new Color(Color.Black, 0.7f), Font = renderEnv.Fonts.NpcNameFont, Padding = new Margins(2, 2, 2, 2), Text = desc }; batcher.Draw(mesh); batcher.MeshPush(mesh); } } break; } } }
private void DrawFootholds(GameTime gameTime) { var color = MathHelper2.HSVtoColor((float)gameTime.TotalGameTime.TotalSeconds * 100 % 360, 1f, 1f); if (patchVisibility.FootHoldVisible) { var lines = new List <Point>(); foreach (LayerNode layer in this.mapData.Scene.Layers.Nodes) { var fhList = layer.Foothold.Nodes.OfType <ContainerNode <FootholdItem> >() .Select(container => container.Item); foreach (var fh in fhList) { lines.Add(new Point(fh.X1, fh.Y1)); lines.Add(new Point(fh.X2, fh.Y2)); } } if (lines.Count > 0) { var meshItem = new MeshItem(); meshItem.RenderObject = new LineListMesh(lines.ToArray(), color, 2); this.batcher.Draw(meshItem); } } if (patchVisibility.LadderRopeVisible) { var lines = new List <Point>(); var ladderList = this.mapData.Scene.Fly.LadderRope.Slots.OfType <LadderRopeItem>(); foreach (var item in ladderList) { lines.Add(new Point(item.X, item.Y1)); lines.Add(new Point(item.X, item.Y2)); } if (lines.Count > 0) { var meshItem = new MeshItem(); meshItem.RenderObject = new LineListMesh(lines.ToArray(), color, 3); this.batcher.Draw(meshItem); } } if (patchVisibility.SkyWhaleVisible) { var lines = new List <Point>(); var skyWhaleList = this.mapData.Scene.Fly.SkyWhale.Slots.OfType <SkyWhaleItem>(); foreach (var item in skyWhaleList) { foreach (var dx in new[] { 0, -item.Width / 2, item.Width / 2 }) { Point start = new Point(item.Start.X + dx, item.Start.Y); Point end = new Point(item.End.X + dx, item.End.Y); //画箭头 lines.Add(start); lines.Add(end); lines.Add(end); lines.Add(new Point(end.X - 5, end.Y + 8)); lines.Add(end); lines.Add(new Point(end.X + 5, end.Y + 8)); } } if (lines.Count > 0) { var meshItem = new MeshItem(); meshItem.RenderObject = new LineListMesh(lines.ToArray(), color, 1); this.batcher.Draw(meshItem); } } }
private void DrawItem(MeshItem mesh, Frame frame) { if (frame == null || frame.Texture == null) { return; } var origin = mesh.FlipX ? new Vector2(frame.Rectangle.Width - frame.Origin.X, frame.Origin.Y) : frame.Origin.ToVector2(); var eff = mesh.FlipX ? SpriteEffects.FlipHorizontally : SpriteEffects.None; var rect = frame.Rectangle; if (mesh.FlipX) { rect.X = -rect.Right; } //兼容平铺 if (mesh.TileRegion != null) { var region = mesh.TileRegion.Value; for (int y = region.Top; y < region.Bottom; y++) { for (int x = region.Left; x < region.Right; x++) { Vector2 pos = mesh.Position + mesh.TileOffset * new Vector2(x, y); if (this.CullingEnabled) { var tileRect = rect; tileRect.Offset(pos); if (!this.IntersectsVP(tileRect)) { continue; } } Prepare(frame.Blend ? ItemType.Sprite_BlendAdditive : ItemType.Sprite); sprite.Draw(frame.Texture, pos, frame.AtlasRect, new Color(Color.White, frame.A0), 0, origin, 1, eff, 0 ); } } } else { rect.Offset(mesh.Position); if (!this.CullingEnabled || this.IntersectsVP(rect)) { Prepare(frame.Blend ? ItemType.Sprite_BlendAdditive : ItemType.Sprite); sprite.Draw(frame.Texture, mesh.Position, frame.AtlasRect, new Color(Color.White, frame.A0), 0, origin, 1, eff, 0 ); } } }