Beispiel #1
0
        private void WriteNode(StringBuilder sb, L2Region region, int scale)
        {
            sb.Append("<rect x=\"");
            sb.Append(region.Min.X / scale);
            sb.Append("\" y=\"");
            sb.Append(region.Min.Y / scale);
            sb.Append("\" width=\"");
            sb.Append((region.Max.X - region.Min.X) / scale);
            sb.Append("\" height=\"");
            sb.Append((region.Max.Y - region.Min.Y) / scale);
            sb.AppendLine("\" fill=\"none\" stroke-width=\"2\" stroke=\"black\" />");

            if (region.Children == null)
            {
                foreach (L2Object obj in region.Objects.Values)
                {
                    if (obj is Character && (obj as Character).Controller is GameClient)
                    {
                        sb.Append("<circle cx=\"");
                        sb.Append(obj.Position.X / scale);
                        sb.Append("\" cy=\"");
                        sb.Append(obj.Position.Y / scale);
                        sb.AppendLine("\" r=\"40\" stroke-width=\"0\" fill=\"purple\" />");

                        sb.Append("<text x=\"");
                        sb.Append((obj.Position.X + 10) / scale);
                        sb.Append("\" y=\"");
                        sb.Append(obj.Position.Y / scale);
                        sb.AppendLine("\" fill=\"purple\">" + (obj as Character).Name + "</text>");
                    }
                    else
                    {
                        sb.Append("<circle cx=\"");
                        sb.Append(obj.Position.X / scale);
                        sb.Append("\" cy=\"");
                        sb.Append(obj.Position.Y / scale);
                        sb.AppendLine("\" r=\"20\" stroke-width=\"0\" fill=\"red\" />");
                    }
                }
            }
            else
            {
                foreach (var child in region.Children)
                {
                    WriteNode(sb, child, scale);
                }
            }
        }
Beispiel #2
0
        public override void Split()
        {
            lock (_modifyLock)
            {
                Children = new L2Region[]
                {
                    new L2Region(Level + 1, Min, Center),
                    new L2Region(Level + 1, new Vector3(Min.X, Center.Y, 0), new Vector3(Center.X, Max.Y, 0)),
                    new L2Region(Level + 1, new Vector3(Center.X, Min.Y, 0), new Vector3(Max.X, Center.Y, 0)),
                    new L2Region(Level + 1, Center, Max)
                };

                // Move objects
                foreach (var obj in Objects.Values)
                {
                    Vector3 position = obj.Position;
                    int     idx      = (position.X < Center.X) ? 0 : 2;
                    idx += (position.Y < Center.Y) ? 0 : 1;
                    Children[idx].Insert(position, obj);
                }
                Objects.Clear();
            }
        }