/// <summary> /// Der Spieler hat einen Tetris gemacht. Die vollen Ringe blinken, bevor sie gelöscht werden /// </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="arena">Verweis auf die Arena</param> private void blinkRings(int positionSchicht, Graphics g, Color backColor, TVisualArena arena) { AnimationIsRunning = true; int n = TTeil.MaxHoehe; //Radien berechnen float rInnen = (float)((positionSchicht - n + 1) * this.SegmentBreite); float rAussen = (float)((positionSchicht + 1) * this.SegmentBreite); //Rechtecke berechnen float r = rInnen; RectangleF recInnen = new RectangleF( this.CenterX - r, this.CenterY - r, 2 * r, 2 * r); r = rAussen; RectangleF recAussen = new RectangleF( this.CenterX - r, this.CenterY - r, 2 * r, 2 * r); //Pfad berechnen int winkel = 360; GraphicsPath path = new GraphicsPath(); path.AddArc(recAussen, 0, winkel); //Bogen A-B //Punkt C berechnen double winkel2 = winkel * (Math.PI / 180); double Cx = this.CenterX + Math.Cos(winkel2) * rInnen; double Cy = this.CenterY + Math.Sin(winkel2) * rInnen; PointF C = new PointF((float)Cx, (float)Cy); PointF B = path.GetLastPoint(); path.AddLine(B, C); //B-C path.AddArc(recInnen, winkel, -winkel); //Bogen C-D path.CloseFigure(); //D-A for (int i = 1; i <= anzBlinken; i++) { //Die Farbe muss jedes Mal neu gesetzt werden, weil sie sonst beim Update verfälscht wird _MyPen.Color = backColor; _MyBrush.Color = backColor; g.FillPath(_MyBrush, path); g.DrawPath(_MyPen, path); foMain.wait(500); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } arena.update(); foMain.wait(500); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } } AnimationIsRunning = false; } //Ende Methode blinkRings
} //Ende Methode blinkRings /// <summary> /// Der Spieler hat einen Tetris gemacht. Die vollen Trapeze blinken, bevor sie gelöscht werden /// </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="arena">Verweis auf die Arena</param> private void blinkTrapez(int positionSchicht, Graphics g, Color backColor, TVisualArena arena) { AnimationIsRunning = true; GraphicsPath path = new GraphicsPath(); //Pfad innen int schichtInnen = positionSchicht - TTeil.MaxHoehe + 1; int n = TArena.AnzahlSektoren; double alpha = 2 * Math.PI / TArena.AnzahlSektoren; List <PointF> EckpunkteInnen = new List <PointF>(n); double rInnen = schichtInnen * this.SegmentBreite; //Eckpunkte innen for (int i = 0; i < n; i++) { double phi = i * alpha; double x = this.CenterX + Math.Cos(phi) * rInnen; double y = this.CenterY + Math.Sin(phi) * rInnen; PointF p = new PointF((float)x, (float)y); EckpunkteInnen.Add(p); } //Pfad innen for (int i = 0; i < n - 1; i++) { PointF a = EckpunkteInnen[i]; PointF b = EckpunkteInnen[i + 1]; path.AddLine(a, b); } path.CloseFigure(); //Pfad aussen List <PointF> EckpunkteAussen = new List <PointF>(n); double rAussen = (positionSchicht + 1) * this.SegmentBreite; for (int i = n; i >= 0; i--) { double phi = i * alpha; double x = this.CenterX + Math.Cos(phi) * rAussen; double y = this.CenterY + Math.Sin(phi) * rAussen; PointF p = new PointF((float)x, (float)y); EckpunkteAussen.Add(p); } //Pfad aussen PointF last = path.GetLastPoint(); path.AddLine(last, EckpunkteAussen[0]); for (int i = 0; i < EckpunkteAussen.Count - 1; i++) { PointF a = EckpunkteAussen[i]; PointF b = EckpunkteAussen[i + 1]; path.AddLine(a, b); } path.CloseFigure(); //Blinken for (int i = 1; i <= anzBlinken; i++) { //Die Farbe muss jedes Mal neu gesetzt werden, weil sie sonst beim Update verfälscht wird _MyBrush.Color = backColor; _MyPen.Color = backColor; g.FillPath(_MyBrush, path); g.DrawPath(_MyPen, path); foMain.wait(500); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } arena.update(); foMain.wait(500); while (arena.myArena.isPause) { Application.DoEvents(); if (!AnimationIsRunning) { return; } } if (!AnimationIsRunning) { return; } } AnimationIsRunning = false; } //Ende Methode blinkTrapez