} //Ende Methode clearRings /// <summary> /// Animation: Die vollen Trapez-Zeilen werden gelöscht /// </summary> /// <param name="positionSchicht">Die oberste Schicht, wo das Teil liegt</param> /// <param name="g">Graphics-Objekt zum Zeichnen</param> /// <param name="backColor">Hintergrundfarbe zum Löschen</param> /// <param name="lines">Gibt an, welche Zeilen voll sind</param> /// <param name="arena">Verweis auf die Arena (nötig für Reparatur)</param> private void animateClearRingsTrapez(int positionSchicht, Graphics g, Color backColor, bool[] lines, TVisualArena arena) { AnimationIsRunning = true; this._TrapezData.positionSchicht = positionSchicht; this._TrapezData.backColor = backColor; this._TrapezData.lines = lines; this._TrapezData.isActive = true; //Pfade zum Reparieren bestimmen List <int> repairLines = findLinesToRepair(lines, positionSchicht); List <GraphicsPath> repairPaths = new List <GraphicsPath>(1); int m = repairLines.Count; for (int l = 0; l < m; l++) { arena.getRepairPaths(repairLines[l], repairPaths); } Pen myPenRepair = new Pen(Color.Black); PointF Center = new PointF(this.CenterX, this.CenterY); double r = SegmentBreite; float alpha = (float)berechneAlpha(); float degree = 1 * (float)Math.PI / 180; int n = lines.Length; //Für alle Sektoren for (int i = 0; i < TArena.AnzahlSektoren; i++) { this._TrapezData.CurrentSektor = i; float angle = i * alpha; float end = angle + alpha; //Für Winkelstücke kleiner Alpha while (angle < end) { for (int k = 0; k < n; k++) { if (lines[k]) { PositionSektor = i; PositionSchicht = positionSchicht - k; //Punkte berechnen PointF A = berechnePunktA(); PointF B = berechnePunktB(); PointF C = berechnePunktC(); PointF D = berechnePunktD(); //Punkt auf Kreis berechnen double x = this.CenterX + Math.Cos(angle + Shift) * r; double y = this.CenterY + Math.Sin(angle + Shift) * r; PointF pCircle = new PointF((float)x, (float)y); //Schnittpunkte berechnen PointF S1 = calcSchnittpunkt(Center, pCircle, A, B); PointF S2 = calcSchnittpunkt(Center, pCircle, C, D); //Pfad erstellen GraphicsPath path = new GraphicsPath(); path.AddLine(A, S1); path.AddLine(S1, S2); path.AddLine(S2, D); path.AddLine(D, A); //UNDONE: Man müsste auch die Trapeze neu löschen //Farbe jedes Mal neu setzen (nötig, wenn das Fenster zwischendurch minimiert wird) _MyPen.Color = backColor; _MyBrush.Color = backColor; //Pfad löschen g.FillPath(_MyBrush, path); g.DrawPath(_MyPen, path); //Reparieren int anz = repairPaths.Count; for (int loop = 0; loop < anz; loop++) { GraphicsPath pathRepair = repairPaths[loop]; g.DrawPath(myPenRepair, pathRepair); } //kurz warten foMain.wait(10); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } //Nächster Winkel angle += degree; } } } //Den letzten Rest löschen (es entstehen sonst unschöne Ränder) for (int k = 0; k < n; k++) { if (lines[k]) { PositionSchicht = positionSchicht - k; deleteSegment(PositionSektor, PositionSchicht, g, backColor); } } } AnimationIsRunning = false; this._TrapezData.isActive = false; } //Ende Methode animateClearRingsTrapez
} //Ende Methode findLinesToRepair /// <summary> /// Animation: Die vollen Ring-Zeilen werden gelöscht /// </summary> /// <param name="positionSchicht">Die oberste Schicht, wo das Teil liegt</param> /// <param name="g">Graphics-Objekt zum Zeichnen</param> /// <param name="backColor">Hintergrundfarbe zum Löschen</param> /// <param name="lines">Gibt an, welche Zeilen voll sind</param> /// <param name="arena">Verweis auf die Arena (nötig für Reparatur)</param> private void animateClearRings(int positionSchicht, Graphics g, Color backColor, bool[] lines, TVisualArena arena) { AnimationIsRunning = true; //Pfade zum Reparieren bestimmen List <int> repairLines = findLinesToRepair(lines, positionSchicht); List <GraphicsPath> repairPaths = new List <GraphicsPath>(1); int m = repairLines.Count; for (int l = 0; l < m; l++) { arena.getRepairPaths(repairLines[l], repairPaths); } Pen myPenRepair = new Pen(Color.Black); int n = lines.Length; //Radien berechnen float[] rInnen = new float[n]; for (int i = 0; i < n; i++) { int schicht = positionSchicht - i; rInnen[i] = (float)(schicht * this.SegmentBreite); } float[] rAussen = new float[n]; for (int i = 0; i < n; i++) { int schicht = positionSchicht - i; rAussen[i] = (float)((schicht + 1) * this.SegmentBreite); } //Rechtecke berechnen RectangleF[] recInnen = new RectangleF[n]; for (int i = 0; i < n; i++) { float r = rInnen[i]; recInnen[i] = new RectangleF( this.CenterX - r, this.CenterY - r, 2 * r, 2 * r); } RectangleF[] recAussen = new RectangleF[n]; for (int i = 0; i < n; i++) { float r = rAussen[i]; recAussen[i] = new RectangleF( this.CenterX - r, this.CenterY - r, 2 * r, 2 * r); } for (int winkel = 1; winkel <= 360; winkel++) { for (int k = 0; k < n; k++) { if (lines[k]) { //Pfad berechnen GraphicsPath path = new GraphicsPath(); path.AddArc(recAussen[k], 0 + ShiftDegree, winkel); //Bogen A-B //Punkt C berechnen double winkel2 = winkel * (Math.PI / 180); double Cx = this.CenterX + Math.Cos(winkel2 + Shift) * rInnen[k]; double Cy = this.CenterY + Math.Sin(winkel2 + Shift) * rInnen[k]; PointF C = new PointF((float)Cx, (float)Cy); PointF B = path.GetLastPoint(); path.AddLine(B, C); //B-C path.AddArc(recInnen[k], winkel + ShiftDegree, -winkel); //Bogen C-D path.CloseFigure(); //D-A //Farbe jedes Mal neu setzen (nötig, wenn das Fenster zwischendurch minimiert wird) _MyPen.Color = backColor; _MyBrush.Color = backColor; g.FillPath(_MyBrush, path); g.DrawPath(_MyPen, path); } } //Reparieren int anz = repairPaths.Count; for (int loop = 0; loop < anz; loop++) { GraphicsPath path = repairPaths[loop]; g.DrawPath(myPenRepair, path); } //kurz warten foMain.wait(10); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } } AnimationIsRunning = false; } //Ende Methode clearRings