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); //} }