Exemple #1
0
        protected int CreateArclike(List <ArcRaw> arcs)
        {
            arcs.Sort((item1, item2) => { return(item1.timing.CompareTo(item2.timing)); });
            var connectedArcsIdEndpoint = new List <ArcPointData>();

            foreach (ArcRaw arc in arcs)
            {
                //Precalc and assign a connected group id to avoid having to figure out connection during gameplay
                ArcPointData arcStartPoint = (arc.timingGroup, arc.timing, arc.startX, arc.startY, arc.color);
                ArcPointData arcEndPoint   = (arc.timingGroup, arc.endTiming, arc.endX, arc.endY, arc.color);

                int  arcId     = connectedArcsIdEndpoint.Count;
                bool isHeadArc = true;

                for (int id = connectedArcsIdEndpoint.Count - 1; id >= 0; id--)
                {
                    if (connectedArcsIdEndpoint[id] == arcStartPoint)
                    {
                        arcId     = id;
                        isHeadArc = false;
                        connectedArcsIdEndpoint[id] = arcEndPoint;
                        break;
                    }
                }

                if (isHeadArc)
                {
                    connectedArcsIdEndpoint.Add(arcEndPoint);
                    CreateHeadSegment(arc, arcId);
                }

                if (isHeadArc || arc.startY != arc.endY)
                {
                    CreateHeightIndicator(arc);
                }

                float startBpm = PlayManager.Conductor.GetTimingEventFromTiming(arc.timing, arc.timingGroup).bpm;

                //Generate arc segments and shadow segment(each segment is its own entity)
                int duration = arc.endTiming - arc.timing;

                if (duration == 0)
                {
                    float3 tstart = new float3(
                        Conversion.GetWorldX(arc.startX),
                        Conversion.GetWorldY(arc.startY),
                        PlayManager.Conductor.GetFloorPositionFromTiming(arc.timing, arc.timingGroup)
                        );
                    float3 tend = new float3(
                        Conversion.GetWorldX(arc.endX),
                        Conversion.GetWorldY(arc.endY),
                        PlayManager.Conductor.GetFloorPositionFromTiming(arc.endTiming, arc.timingGroup)
                        );
                    CreateSegment(arc, tstart, tend, arc.timing, arc.timing, arcId);
                    continue;
                }

                int   v1            = duration < 1000 ? 14 : 7;
                float v2            = 1000f / (v1 * duration);
                float segmentLength = duration * v2;
                int   segmentCount  = (int)(duration / segmentLength) + 1;

                int fromTiming;
                int toTiming = arc.timing;

                float3 start;
                float3 end = new float3(
                    Conversion.GetWorldX(arc.startX),
                    Conversion.GetWorldY(arc.startY),
                    PlayManager.Conductor.GetFloorPositionFromTiming(arc.timing, arc.timingGroup)
                    );

                for (int i = 0; i < segmentCount - 1; i++)
                {
                    int t = (int)((i + 1) * segmentLength);

                    fromTiming = toTiming;
                    toTiming   = arc.timing + t;

                    start = end;
                    end   = new float3(
                        Conversion.GetWorldX(Conversion.GetXAt((float)t / duration, arc.startX, arc.endX, arc.easing)),
                        Conversion.GetWorldY(Conversion.GetYAt((float)t / duration, arc.startY, arc.endY, arc.easing)),
                        PlayManager.Conductor.GetFloorPositionFromTiming(toTiming, arc.timingGroup)
                        );

                    CreateSegment(arc, start, end, fromTiming, toTiming, arcId);
                }

                fromTiming = toTiming;
                toTiming   = arc.endTiming;

                start = end;
                end   = new float3(
                    Conversion.GetWorldX(arc.endX),
                    Conversion.GetWorldY(arc.endY),
                    PlayManager.Conductor.GetFloorPositionFromTiming(arc.endTiming, arc.timingGroup)
                    );

                CreateSegment(arc, start, end, fromTiming, toTiming, arcId);
                CreateJudgeEntity(arc, arcId, startBpm);
            }
            SetupIndicators(connectedArcsIdEndpoint);

            return(connectedArcsIdEndpoint.Count);
        }
        private void loadData()
        {
            int pointsDataLength = dataHeads[0].dataOffset + dataHeads[0].size;

            workSpaceFile.Seek(dataHeads[0].dataOffset + 93, SeekOrigin.Begin);
            pointDatas = new List <PointData>();
            int id = 1;//mapgis里的属性表ID是从1开始的,0位置存放的为空

            while (workSpaceFile.Position <= pointsDataLength)
            {
                //if (br.ReadByte() != 1)
                //{
                //    return;
                //}

                id++;
                long temp = workSpaceFile.Position;

                workSpaceFile.Seek(30, SeekOrigin.Current);
                byte pointPype = br.ReadByte();
                workSpaceFile.Seek(temp + 1, SeekOrigin.Begin); //多个1
                long current;
                switch (pointPype)
                {
                case 0:
                    StringPointData spd = new StringPointData();
                    spd.pointPype    = pointPype;
                    spd.stringSum    = br.ReadInt16();
                    spd.stringOffset = br.ReadInt32();
                    spd.positionX    = br.ReadDouble();
                    spd.positionY    = br.ReadDouble();
                    //byte[] pX = br.ReadBytes(8);
                    //byte[] pY = br.ReadBytes(8);

                    //spd.positionX = BitConverter.ToDouble(pX,0);
                    //spd.positionY = BitConverter.ToDouble(pY, 0);
                    current = workSpaceFile.Position;
                    workSpaceFile.Seek(dataHeads[1].dataOffset + spd.stringOffset, SeekOrigin.Begin);
                    spd.stringData = System.Text.Encoding.Default.GetString(br.ReadBytes(spd.stringSum));
                    workSpaceFile.Seek(current, SeekOrigin.Begin);
                    spd.charHeight  = br.ReadSingle();
                    spd.charWidth   = br.ReadSingle();
                    spd.charSpace   = br.ReadSingle();
                    spd.stringAngle = br.ReadSingle();
                    spd.chinaFont   = br.ReadInt16();
                    spd.englishFont = br.ReadInt16();
                    spd.fontShape   = br.ReadByte();
                    spd.arragement  = br.ReadByte();
                    workSpaceFile.Seek(17, SeekOrigin.Current);
                    spd.transpresent = br.ReadByte();
                    spd.layer        = br.ReadInt16();
                    spd.color        = br.ReadInt32();
                    pointDatas.Add(spd);
                    workSpaceFile.Seek(temp, SeekOrigin.Begin);
                    workSpaceFile.Seek(93, SeekOrigin.Current);
                    continue;

                case 1:
                    SubMapPointData smpd = new SubMapPointData();
                    //smpd = pointData;
                    smpd.pointPype    = pointPype;
                    smpd.stringSum    = br.ReadInt16();
                    smpd.stringOffset = br.ReadInt32();
                    smpd.positionX    = br.ReadDouble();
                    smpd.positionY    = br.ReadDouble();
                    smpd.subNumber    = br.ReadInt32();
                    smpd.subHeight    = br.ReadSingle();
                    smpd.subWidth     = br.ReadSingle();
                    smpd.subAngle     = br.ReadSingle();
                    smpd.lineWidth    = br.ReadSingle();
                    smpd.assColor     = br.ReadUInt32();
                    workSpaceFile.Seek(15, SeekOrigin.Current);
                    smpd.transpresent = br.ReadByte();
                    smpd.layer        = br.ReadInt16();
                    smpd.color        = br.ReadInt32();
                    pointDatas.Add(smpd);
                    workSpaceFile.Seek(14, SeekOrigin.Current);
                    continue;

                case 2:
                    CriclePointData cpd = new CriclePointData();
                    cpd.pointPype    = pointPype;
                    cpd.stringSum    = br.ReadInt16();
                    cpd.stringOffset = br.ReadInt32();
                    cpd.positionX    = br.ReadDouble();
                    cpd.positionY    = br.ReadDouble();
                    cpd.radius       = br.ReadSingle();
                    cpd.lineColor    = br.ReadInt32();
                    cpd.lineWidth    = br.ReadSingle();
                    cpd.sign         = br.ReadByte();
                    workSpaceFile.Seek(24, SeekOrigin.Current);
                    cpd.transpresent = br.ReadByte();
                    cpd.layer        = br.ReadInt16();
                    cpd.color        = br.ReadInt32();
                    pointDatas.Add(cpd);
                    workSpaceFile.Seek(14, SeekOrigin.Current);
                    continue;

                case 3:
                    ArcPointData apd = new ArcPointData();
                    apd.pointPype    = pointPype;
                    apd.stringSum    = br.ReadInt16();
                    apd.stringOffset = br.ReadInt32();
                    apd.positionX    = br.ReadDouble();
                    apd.positionY    = br.ReadDouble();
                    apd.radius       = br.ReadDouble();
                    apd.startAngle   = br.ReadSingle();
                    apd.endAngle     = br.ReadSingle();
                    apd.lineWidth    = br.ReadSingle();
                    workSpaceFile.Seek(21, SeekOrigin.Current);
                    apd.transpresent = br.ReadByte();
                    apd.layer        = br.ReadInt16();
                    apd.color        = br.ReadInt32();
                    pointDatas.Add(apd);
                    workSpaceFile.Seek(14, SeekOrigin.Current);
                    continue;

                case 4:
                    ImagePointData ipd = new ImagePointData();
                    ipd.pointPype    = pointPype;
                    ipd.stringSum    = br.ReadInt16();
                    ipd.stringOffset = br.ReadInt32();
                    ipd.positionX    = br.ReadDouble();
                    ipd.positionY    = br.ReadDouble();
                    current          = workSpaceFile.Position;
                    workSpaceFile.Seek(dataHeads[1].dataOffset + ipd.stringOffset - ipd.stringSum, SeekOrigin.Begin);
                    ipd.imgaeFileName = br.ReadString();
                    workSpaceFile.Seek(current, SeekOrigin.Begin);
                    ipd.charHeight  = br.ReadSingle();
                    ipd.charWidth   = br.ReadSingle();
                    ipd.stringAngle = br.ReadSingle();
                    workSpaceFile.Seek(29, SeekOrigin.Current);
                    ipd.transpresent = br.ReadByte();
                    ipd.layer        = br.ReadInt16();
                    ipd.color        = br.ReadInt32();
                    pointDatas.Add(ipd);
                    workSpaceFile.Seek(14, SeekOrigin.Current);

                    continue;

                case 5:

                    TextPointData tpd = new TextPointData();
                    tpd.pointPype    = pointPype;
                    tpd.stringSum    = br.ReadInt16();
                    tpd.stringOffset = br.ReadInt32();
                    tpd.positionX    = br.ReadDouble();
                    tpd.positionY    = br.ReadDouble();
                    current          = workSpaceFile.Position;
                    workSpaceFile.Seek(dataHeads[1].dataOffset + tpd.stringOffset - tpd.stringSum, SeekOrigin.Begin);
                    tpd.textData = br.ReadString();
                    workSpaceFile.Seek(current, SeekOrigin.Begin);
                    tpd.charHeight  = br.ReadSingle();
                    tpd.charWidth   = br.ReadSingle();
                    tpd.charSpace   = br.ReadSingle();
                    tpd.stringAngle = br.ReadSingle();
                    tpd.chinaFont   = br.ReadInt16();
                    tpd.englishFont = br.ReadInt16();
                    tpd.fontShape   = br.ReadByte();
                    tpd.sheetSpace  = br.ReadSingle();
                    tpd.sheetHeight = br.ReadSingle();
                    tpd.sheetWidth  = br.ReadSingle();
                    tpd.arragement  = br.ReadByte();
                    workSpaceFile.Seek(7, SeekOrigin.Current);
                    tpd.transpresent = br.ReadByte();
                    tpd.layer        = br.ReadInt16();
                    tpd.color        = br.ReadInt32();
                    pointDatas.Add(tpd);
                    workSpaceFile.Seek(14, SeekOrigin.Current);
                    continue;

                default:
                    break;
                }
                pointFeatures = new List <byte[]>();
                workSpaceFile.Seek(dataHeads[2].dataOffset, SeekOrigin.Begin);
                byte[] pointFeature = br.ReadBytes(dataHeads[2].size);
                pointFeatures.Add(pointFeature);
                workSpaceFile.Seek(dataHeads[2].dataOffset + 0x0c, SeekOrigin.Begin);
                int tableItemOffset = br.ReadInt32();


                //br.Close();
            }
            workSpaceFile.Seek(dataHeads[2].dataOffset + 0x142, SeekOrigin.Begin);//140是表头文件的开始偏移位置强两位是标示符
            table = new FeatureTable();
            table.tableHeadNumber        = br.ReadInt16();
            table.tableItemNumer         = br.ReadInt32();
            table.tableItemLengthInBytes = br.ReadInt32();
            workSpaceFile.Seek(16, SeekOrigin.Current);
            table.tableHead = new List <FeatureTableHead>();
            for (int i = 0; i < table.tableHeadNumber; i++)
            {
                long             tmp       = workSpaceFile.Position;
                FeatureTableHead tableHead = new FeatureTableHead();
                //tableHead.headName = System.Text.Encoding.Default.GetString(br.ReadBytes(20)).Trim();//表单元名占20个字节
                tableHead.headNameBytes = br.ReadBytes(20);
                tableHead.headName      = System.Text.Encoding.Default.GetString(tableHead.headNameBytes).Trim();//表单元名占20个字节
                //tableHead.headName = br.ReadBytes(20).Trim();//表单元名占20个字节
                tableHead.itemType            = (FeatureType)br.ReadByte();
                tableHead.offset              = br.ReadInt32();
                tableHead.lengthInBytes       = br.ReadInt16();
                tableHead.tableItemCharLength = br.ReadInt16();
                table.tableHead.Add(tableHead);
                workSpaceFile.Seek(10, SeekOrigin.Current);
            }
            //workSpaceFile.Seek(table.tableItemLengthInBytes, SeekOrigin.Current);
            //workSpaceFile.Seek(-1, SeekOrigin.Current);
            table.tableItem = new List <byte[]>();
            for (int i = 0; i < table.tableItemNumer; i++)
            {
                //br.ReadByte();
                byte[] data = br.ReadBytes(table.tableItemLengthInBytes);
                //table.tableItem.Add(br.ReadBytes(table.tableItemLengthInBytes)); //
                int count = 0;
                foreach (var item in table.tableHead)
                {
                    count += item.tableItemCharLength;
                }
                byte[] newData = new byte[count];
                int    flag    = 0;
                foreach (var item in table.tableHead)
                {
                    //table.tableItem.Add(SubArray(data,item.offset,item.tableItemCharLength));
                    AddToArray(data, ref newData, item.offset, item.tableItemCharLength, ref flag);
                }
                table.tableItem.Add(newData);
            }
            //for (int i = 1; i < table.tableItemNumer; i++)
            //{
            //    ProcessTableItem(table.tableItem[i], table.tableHead);

            //}
        }