Ejemplo n.º 1
0
        public override void EventOccurred(IEventData data, EventType type)
        {
            //是否读取到表格划块
            if (!type.Equals(EventType.RENDER_PATH) && !type.Equals(EventType.CLIP_PATH_CHANGED))
            {
                return;
            }
            List <PathChunk> paths = new List <PathChunk>();

            if (type == EventType.RENDER_PATH)
            {
                PathRenderInfo renderInfo = (PathRenderInfo)data;

                var zoom = renderInfo.GetCtm().Get(0);
                //如果是假线 不处理
                int flag = renderInfo.GetOperation();
                if (flag == PathRenderInfo.NO_OP)
                {
                    return;
                }


                var ctm = renderInfo.GetGraphicsState().GetCtm();

                var t  = ctm.Get(6);
                var t1 = ctm.Get(7);

                var subpaths = renderInfo.GetPath().GetSubpaths();


                //foreach (var path in subpaths)
                //{

                //    var shapes = path.GetSegments();
                //    foreach (var shape in shapes)
                //    {
                //        var basePoint = shape.GetBasePoints();
                //        paths.Add(new PathChunk(basePoint));
                //    }
                //}


                #region 缩放
                if (zoom != 1)
                {
                    foreach (var path in subpaths)
                    {
                        var shapes = path.GetSegments();
                        foreach (var shape in shapes)
                        {
                            var b = shape.GetBasePoints();
                            foreach (var point in b)
                            {
                                point.x = point.x * zoom;
                                point.y = point.y * zoom;
                            }
                        }
                    }
                }
                #endregion

                //如果是矩形 加上最后一条线
                if (subpaths.Count == 2 && subpaths[0].GetSegments().Count == 3 && subpaths[1].GetSegments().Count == 0)
                {
                    var segList = subpaths[0].GetSegments();


                    #region 全局线框不画
                    if (segList[0].GetBasePoints()[0].x <= 0 && segList[0].GetBasePoints()[0].y <= 0)
                    {
                        return;
                    }
                    #endregion
                    #region 画上底线
                    //var basePoint = segList[2].GetBasePoints();
                    List <Point> basePoint = new List <Point>();
                    basePoint.Add(new Point(segList[2].GetBasePoints()[1]));
                    basePoint.Add(new Point(subpaths[1].GetStartPoint()));
                    basePoint[0].y = this.Height - basePoint[0].y;
                    basePoint[1].y = this.Height - basePoint[1].y;
                    paths.Add(new PathChunk(basePoint));
                    #endregion
                    #region 特殊矩形处理
                    //var xBasePoint = segList[0].GetBasePoints();
                    //var yBasePoint = segList[1].GetBasePoints();
                    //var xSeBasePoint = segList[2].GetBasePoints();
                    //var ttttt = renderInfo.GetGraphicsState();
                    #endregion

                    foreach (var path in subpaths)
                    {
                        var shapes = path.GetSegments();
                        foreach (var shape in shapes)
                        {
                            var b = shape.GetBasePoints();
                            foreach (var point in b)
                            {
                                if (t1 == 0)
                                {
                                    point.y = this.Height - point.y;
                                }
                                if (point.y > 768.199996948242 && point.y < 770.199996948242)
                                {
                                }
                            }
                            paths.Add(new PathChunk(b));
                        }
                    }
                }
                else
                {
                    //如果是画线
                    if (t1 == 0)
                    {
                        t1 = this.Height;
                    }
                    foreach (var path in subpaths)
                    {
                        var shapes = path.GetSegments();
                        foreach (var shape in shapes)
                        {
                            var basePoint = shape.GetBasePoints();
                            foreach (var point in basePoint)
                            {
                                point.x = point.x + t;
                                point.y = this.Height - t1 + point.y;
                            }
                            paths.Add(new PathChunk(basePoint));
                        }
                    }
                }
            }
            if (type == EventType.CLIP_PATH_CHANGED)
            {
                ClippingPathInfo renderInfo = (ClippingPathInfo)data;
                var s = renderInfo.GetGraphicsState().GetCtm();

                var t            = s.Get(6);
                var t1           = s.Get(7);
                var clpath       = renderInfo.GetClippingPath();
                var currentPoint = clpath.GetCurrentPoint();
                if (currentPoint != null && currentPoint.x == 0 && currentPoint.y == 0)
                {
                    return;
                }
                var subpaths = clpath.GetSubpaths();
                //如果是矩形裁剪
                if (subpaths.Count == 2 && subpaths[0].GetSegments().Count == 3 && subpaths[1].GetSegments().Count == 0)
                {
                    var isJISUAN = clpath.GetCurrentPoint().y == subpaths[0].GetStartPoint().y;
                    var segList  = subpaths[0].GetSegments();
                    #region 修正坐标系
                    foreach (var path in subpaths)
                    {
                        var shapes = path.GetSegments();
                        foreach (var shape in shapes)
                        {
                            var b = shape.GetBasePoints();
                            foreach (var point in b)
                            {
                                if (t1 == 0 && isJISUAN)
                                {
                                    point.y = this.Height - point.y;
                                }
                            }
                        }
                    }
                    #endregion
                    #region 画上底线
                    List <Point> basePoint = new List <Point>();
                    basePoint.Add(new Point(segList[2].GetBasePoints()[1]));
                    basePoint.Add(new Point(segList[0].GetBasePoints()[0]));
                    //basePoint[1].y = this.Height - basePoint[1].y;

                    #endregion
                    #region 特殊矩形处理
                    var clipPaths = new List <PathChunk>(4);
                    var x1        = new PathChunk(segList[2].GetBasePoints());
                    var x2        = new PathChunk(segList[0].GetBasePoints());
                    var y1        = new PathChunk(basePoint);
                    var y2        = new PathChunk(segList[1].GetBasePoints());

                    clipPaths.Add(x1);
                    clipPaths.Add(x2);
                    clipPaths.Add(y1);
                    clipPaths.Add(y2);
                    var clipXpaths = clipPaths.Where(p => p.Direction == 线方向.横向).OrderBy(p => p.StartPath.y).ToList();
                    var clipYpaths = clipPaths.Where(p => p.Direction == 线方向.纵向).OrderBy(p => p.StartPath.x).ToList();
                    if (clipXpaths.Count != 2 || clipYpaths.Count != 2)
                    {
                        return;
                    }
                    if ((clipXpaths[1].EndPath.x - clipXpaths[1].StartPath.x) > clipXpaths[1].StartPath.x * 2 &&
                        (clipYpaths[1].EndPath.y - clipYpaths[1].StartPath.y) > clipYpaths[1].StartPath.y * 2 &&
                        (clipYpaths[1].EndPath.y - clipYpaths[1].StartPath.y + clipYpaths[1].StartPath.y * 2) >= this.Height - 50)
                    {
                        return;
                    }
                    for (int i = paths.Count < 4 ? 0 : paths.Count - 4; i < paths.Count && paths.Count > 0; i++)
                    {
                        var  path = paths[i];
                        bool flag = false;
                        //删除重叠矩形的线
                        foreach (var xpath in clipPaths)
                        {
                            if (xpath.StartPath.x + 0.1 > path.StartPath.x && xpath.StartPath.x - 0.1 < path.StartPath.x &&
                                xpath.EndPath.x + 0.1 > path.EndPath.x && xpath.EndPath.x - 0.1 < path.EndPath.x &&
                                xpath.StartPath.y + 0.1 > path.StartPath.y && xpath.StartPath.y - 0.1 < path.StartPath.y &&
                                xpath.EndPath.y + 0.1 > path.EndPath.y && xpath.EndPath.y - 0.1 < path.EndPath.y)
                            {
                                path.IsDeleted = true;
                                flag           = true;
                                break;
                            }
                        }
                        //continue;
                        if (flag)
                        {
                            continue;
                        }
                        if (path.Direction == 线方向.横向 &&
                            path.StartPath.y + 0.001 > clipXpaths[0].StartPath.y && path.StartPath.y < clipXpaths[1].StartPath.y + 0.001)
                        {
                            if (clipXpaths[0].StartPath.x - path.StartPath.x > 0.001 && clipXpaths[0].EndPath.x - path.EndPath.x > -0.001 &&
                                clipXpaths[0].StartPath.x - 0.001 < path.EndPath.x)
                            {
                                path.EndPath.x = clipXpaths[0].StartPath.x;
                            }
                            else if (path.StartPath.x - clipXpaths[0].StartPath.x > 0.001 && path.EndPath.x - clipXpaths[0].EndPath.x > 0.001 &&
                                     path.StartPath.x + 0.001 < clipXpaths[0].EndPath.x)
                            {
                                path.StartPath.x = clipXpaths[0].EndPath.x;
                            }
                            else if (path.StartPath.x + 0.001 < clipXpaths[0].StartPath.x && path.EndPath.x - 0.001 > clipXpaths[0].EndPath.x)
                            {
                                paths.Add(new PathChunk(path.StartPath.x, path.StartPath.y, clipXpaths[0].StartPath.x, path.StartPath.y));
                                paths.Add(new PathChunk(clipXpaths[0].EndPath.x, path.EndPath.y, path.EndPath.x, path.EndPath.y));

                                path.IsDeleted = true;
                            }
                            else if (path.StartPath.x + 0.001 > clipXpaths[0].StartPath.x && path.EndPath.x - 0.001 < clipXpaths[0].EndPath.x)
                            {
                                path.IsDeleted = true;
                            }
                        }
                        if (path.Direction == 线方向.纵向 &&
                            path.StartPath.x + 0.001 > clipYpaths[0].StartPath.x && path.StartPath.x < clipYpaths[1].StartPath.x + 0.001)
                        {
                            if (clipYpaths[0].StartPath.y + 0.001 > path.StartPath.y && clipYpaths[0].EndPath.y > path.EndPath.y - 0.001 &&
                                clipYpaths[0].StartPath.y - 0.001 < path.EndPath.y)
                            {
                                path.EndPath.y = clipYpaths[0].StartPath.y;
                            }
                            else if (path.EndPath.y + 0.001 > clipYpaths[0].EndPath.y && path.StartPath.y > clipYpaths[0].StartPath.y - 0.001 &&
                                     path.StartPath.y - 0.001 < clipYpaths[0].EndPath.y)
                            {
                                path.StartPath.y = clipYpaths[0].EndPath.y;
                            }
                            else if (path.StartPath.y - 0.001 < clipYpaths[0].StartPath.y && path.EndPath.y + 0.001 > clipYpaths[0].EndPath.y)
                            {
                                paths.Add(new PathChunk(path.StartPath.x, path.StartPath.y, path.StartPath.x, clipYpaths[0].StartPath.y));
                                paths.Add(new PathChunk(path.EndPath.x, clipYpaths[0].EndPath.y, path.EndPath.x, path.EndPath.y));

                                path.IsDeleted = true;
                            }
                            else if (path.StartPath.y + 0.001 > clipYpaths[0].StartPath.y && path.EndPath.y - 0.001 < clipYpaths[0].EndPath.y)
                            {
                                path.IsDeleted = true;
                            }
                        }
                    }
                    #endregion
                }
            }

            foreach (var item in paths)
            {
                float counter = increaseCounter();
                chunkDictionairy.Add(counter, item);
            }
            base.EventOccurred(data, type);
        }
Ejemplo n.º 2
0
        public override void Load(byte[] data)
        {
            int offset = 0;
            FileHeader header = new FileHeader();
            header.Load(data, ref offset);

            _chunkList = new Dictionary<Type, List<BaseChunk>>();

            var chnkHeaders = new List<ChunkHeader>();
            for (int i = 0; i < header.ChunkCount; i++)
            {
                ChunkHeader chunkHeader = new ChunkHeader();
                chunkHeader.Load(data, ref offset);
                chnkHeaders.Add(chunkHeader);
            }

            var orderedList = chnkHeaders.OrderBy(kvp => kvp.ChunkOffset);

            foreach (ChunkHeader chunkHeader in orderedList)
            {
                for (int k = 0; k < chunkHeader.ElementCount; k++)
                {
                    BaseChunk chunk; 

                    switch (chunkHeader.Tag.Substring(0, 3).ToUpper())
                    {
                        case "ENV": chunk = new EnvrChunk(); break; 
                        case "COL": chunk = new ColoChunk(); break;
                        case "PAL": chunk = new PaleChunk(); break;
                        case "VIR": chunk = new VirtChunk(); break;
                        case "SCL": chunk = new SclsChunk(); break;
                        case "PLY": chunk = new PlyrChunk(); break;
                        case "RPA": chunk = new RPATChunk(); break;
                        case "PAT": chunk = new PathChunk(); break;
                        case "RPP": chunk = new RppnChunk(); break;
                        case "PPN": chunk = new PpntChunk(); break;
                        case "SON": chunk = new SondChunk(); break;
                        case "FIL": chunk = new FiliChunk(); break;
                        case "MEC": chunk = new MecoChunk(); break;
                        case "MEM": chunk = new MemaChunk(); break;
                        case "TRE": chunk = new TresChunk(); break;
                        case "SHI": chunk = new ShipChunk(); break;
                        case "MUL": chunk = new MultChunk(); break;
                        case "LGH": chunk = new LghtChunk(); break;
                        case "LGT": chunk = new LgtvChunk(); break;
                        case "RAR": chunk = new RaroChunk(); break;
                        case "ARO": chunk = new ArobChunk(); break;
                        case "EVN": chunk = new EvntChunk(); break;
                        case "TGO": chunk = new TgobChunk(); break;
                        case "ACT": 
                            chunk = new ActrChunk();
                            if (!chunkHeader.Tag.ToUpper().EndsWith("R"))
                            {
                                chunk.ChunkLayer = EditorHelpers.ConvertStringToLayerId(chunkHeader.Tag.ToUpper().Substring(3, 1));
                            }
                            break;
                        case "SCO": 
                            chunk = new ScobChunk();
                            if (!chunkHeader.Tag.EndsWith("B"))
                            {
                                chunk.ChunkLayer = EditorHelpers.ConvertStringToLayerId(chunkHeader.Tag.ToUpper().Substring(3, 1));
                            }
                            break;
                        case "STA": chunk = new StagChunk(); break;
                        case "RCA": chunk = new RcamChunk(); break;
                        case "CAM": chunk = new CamrChunk(); break;
                        case "FLO": chunk = new FlorChunk(); break;
                        case "TWO": chunk = new TwoDChunk(); break;
                        case "2DM": chunk = new TwoDMAChunk(); break;
                        case "DMA": chunk = new DMAPChunk(); break;
                        case "LBN": chunk = new LbnkChunk(); break;
                        case "TGD": chunk = new TgdrChunk(); break;
                        case "RTB": chunk = new RTBLChunk(); break;
                        
                        default:
                            Console.WriteLine("Unsupported Chunk Tag: " + chunkHeader.Tag + " Chunk will not be saved!");
                            chunk = null;
                            break;
                    }

                    if(chunk == null)
                        continue;

                    //Console.WriteLine(chunkHeader.Tag + " offset: " + chunkHeader.ChunkOffset);
                    chunk.ChunkName = chunkHeader.Tag;
                    chunk.LoadData(data, ref chunkHeader.ChunkOffset);
                    AddChunk(chunk);
                }
            }

        }
Ejemplo n.º 3
0
    public IEnumerator CreatePath()
    {
        yield return new WaitForEndOfFrame();
        PathFollow[] followers = GameObject.FindObjectsOfType<PathFollow>();
        for (byte i = 0; i < chunkCntTemp; i++)
        {
            GameObject newGO = null;
            if (i < 5) {
                newGO = GameObject.Instantiate<GameObject>(Straight.option); // Straight Option
            } else {
                while (newGO == null)
                {
                    float selection = (float)rand.NextDouble()*totalWeight;//Random.Range(0, totalWeight);
                    for (byte j = 0; j < SpawnOptions.Length + 1; j++) {
                        if(j == SpawnOptions.Length) {
                            newGO = GameObject.Instantiate<GameObject>(Straight.option);
                            break;
                        }
                        if (selection < SpawnOptions[j].weight) {
                            if ((totalRot < -10 && SpawnOptions[j].vertRotDelta < -10) || (totalRot > 10 && SpawnOptions[j].vertRotDelta > 10)) break;
                            if ((totalRot != 0) && SpawnOptions[j].horizRot) break;
                            totalRot += SpawnOptions[j].vertRotDelta;
                            newGO = GameObject.Instantiate<GameObject>(SpawnOptions[j].option);
                            break;
                        } else {
                            selection -= SpawnOptions[j].weight;
                        }
                    }
                }
            }

            newGO.transform.SetParent(transform, true);
            var newPipe = newGO.GetComponent<PathChunk>();
            if (lastPipe) {
                newGO.transform.position = lastPipe.EndPoint.transform.position;
                newGO.transform.rotation = lastPipe.EndPoint.transform.rotation;
                lastPipe.EndPoint.next = newPipe.StartPoint;
            } else {
                newGO.transform.position = transform.position;
                newGO.transform.rotation = Quaternion.identity;
            }
            lastPipe = newGO.GetComponent<PathChunk>();

            currentChunkCount++;

            if(i == 0) {
                for(byte j = 0; j < followers.Length; j++) {
                    followers[j].currNode = lastPipe.StartPoint; // Place the path followers on the start point.
                }
            }
            if(i == 20) {
                for(byte j = 0; j < followers.Length; j++) {
                    if(followers[j].gameObject.GetComponent<ObjectSpawner>() != null) {
                        followers[j].Travel(200f); // Push the obstacle spawner 200 units ahead instead
                    } else if(followers[j].gameObject.name == "Dead Area") {
                        followers[j].Travel(70f); // Push the "dead player" area 30 units ahead instead
                    } else {
                        followers[j].Travel(5f); // Push everything 5 units ahead, prevent the starting clipping
                    }
                }
            }
            if(i > 20)
                yield return null;
        }
        chunkCntTemp = chunkCnt; //After first runthrough

        while(true) {
            while (currentChunkCount >= chunkCntTemp)
            {
                yield return null;
            }

            GameObject newGO = null;
            while (newGO == null)
            {
                float selection = (float)rand.NextDouble() * totalWeight;//Random.Range(0, totalWeight);
                for(byte j = 0; j < SpawnOptions.Length + 1; j++) {
                    if(j == SpawnOptions.Length) {
                        newGO = GameObject.Instantiate<GameObject>(Straight.option);
                        break;
                    }
                    if(selection < SpawnOptions[j].weight) {
                        if((totalRot < -10 && SpawnOptions[j].vertRotDelta < -10) || (totalRot > 10 && SpawnOptions[j].vertRotDelta > 10)) break;
                        if((totalRot != 0) && SpawnOptions[j].horizRot) break;
                        totalRot += SpawnOptions[j].vertRotDelta;
                        newGO = GameObject.Instantiate<GameObject>(SpawnOptions[j].option);
                        break;
                    } else {
                        selection -= SpawnOptions[j].weight;
                    }
                }
            }

            newGO.transform.SetParent(transform, true);
            var newPipe = newGO.GetComponent<PathChunk>();
            if (lastPipe) {
                newGO.transform.position = lastPipe.EndPoint.transform.position;
                newGO.transform.rotation = lastPipe.EndPoint.transform.rotation;
                lastPipe.EndPoint.next = newPipe.StartPoint;
            } else {
                newGO.transform.position = transform.position;
                newGO.transform.rotation = Quaternion.identity;
            }
            lastPipe = newGO.GetComponent<PathChunk>();

            currentChunkCount++;
        }
    }