Пример #1
0
 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);
     }
 }
Пример #2
0
 public void MeshPush(MeshItem mesh)
 {
     mesh.RenderObject = null;
     this.meshPool.Push(mesh);
 }
Пример #3
0
        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;
            }
        }
Пример #4
0
        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;
                    }
                }
            }
        }
Пример #5
0
        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;
                }
            }
        }
Пример #6
0
        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);
                }
            }
        }
Пример #7
0
        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
                                );
                }
            }
        }