/// <summary> /// Füllt das Teil t mit den entsprechenden Segmenten /// </summary> /// <param name="t">Das zu füllende Teil</param> public static void fillTeil(TTeil t) { t.SegmentArray[0, 0] = true; t.SegmentArray[0, 1] = true; t.SegmentArray[0, 2] = true; t.SegmentArray[0, 3] = true; }
/// <summary> /// Zeigt das nächste Teil an /// </summary> /// <param name="t">Das nächste Teil</param> /// <param name="c">Die Farbe des nächsten Teils</param> public override void displayNext(TTeil t, Color c) { this._Form.paNext.Refresh(); Graphics g = this._Form.paNext.CreateGraphics(); TVisualTeil.drawTeil(g, t, c, this._Segment); }
/// <summary> /// Prüft, ob das Teil mit anderen bereits gefallenen Segmenten kollidiert, wenn es entsprechend der Vorgabe verschoben wird /// </summary> /// <param name="t">Das fallende Teil</param> /// <param name="deltaSektor">Verschiebung im Sektor</param> /// <param name="deltaSchicht">Verschiebung in der Schicht</param> /// <returns><c>true</c> bei Kollision; <c>false</c> sonst</returns> private bool collidesWith(TTeil t, int deltaSektor, int deltaSchicht) { int positionSektor = calcNewSektor(t.PositionSektor, deltaSektor); int positionSchicht = t.PositionSchicht + deltaSchicht; for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { if (t.hasSegment(i, k)) //Das Teil hat an dieser Stelle ein Segment { int pos = calcNewSektor(positionSektor, i); int schicht = positionSchicht - k; if (schicht >= 0 && this.Spielfeld[pos, schicht]) //Überschneidung gefunden { return(true); } } } } //Keine Überschneidung gefunden return(false); }
/// <summary> /// Kopiert dieses Objekt in das andere /// </summary> /// <param name="other">Das andere Objekt, in das kopiert wird</param> public void copyTo(TTeil other) { for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { other.SegmentArray[i, k] = this.SegmentArray[i, k]; } } }
/// <summary> /// Wird aufgerufen, wenn das Panel mit der Anzeige des nächsten Teils neu gezeichnet wird /// </summary> void paNext_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { if (this._Arena != null && !this._Arena.myArena.isPause) { Graphics g = e.Graphics; TTeil t = this._Data.NextFallingTeil; Color c = this._Data.NextFallingColor; TVisualTeil.drawTeil(g, t, c, this._Segment); } }
/// <summary> /// Setzt alles zurück /// </summary> public void reset() { this.NextFallingTeil = new TTeil(); this.NextFallingTeil.randomize(this._MyRandom); this.NextFallingTeil.move(0, TTeil.MaxHoehe); this.FallingTeil = new TTeil(); this.FallingTeil.randomize(this._MyRandom); this.FallingTeil.move(0, TArena.AnzahlSchichten - 1); this.NextFallingColor = TTeil.createRandomColor(this._MyRandom); this.FallingColor = TTeil.createRandomColor(this._MyRandom); }
/// <summary> /// Zeichnet das Teil mit allen seinen Segmenten /// </summary> /// <param name="g">Graphics-Objekt zum Zeichnen</param> /// <param name="t">Das zu zeichnende Teil</param> /// <param name="c">Die Farbe des Teils</param> /// <param name="segment">Das Segment-Objekt, mit dem gezeichnet wird</param> public static void drawTeil(Graphics g, TTeil t, Color c, TSegmentBase segment) { for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { if (t.hasSegment(i, k)) { int positionSektor = (t.PositionSektor + i) % TArena.AnzahlSektoren; int positionSchicht = t.PositionSchicht - k; segment.drawSegment(positionSektor, positionSchicht, g, c); } } } }
/// <summary> /// Das fallende Teil wird zufällig zu einem neuen /// Teil und an die Startposition gesetzt /// </summary> public void startNewFallingTeil() { this.NextFallingTeil.copyTo(this.FallingTeil); this.NextFallingTeil.Clear(); this.NextFallingTeil.randomize(this._MyRandom); this.NextFallingTeil.move(0, TTeil.MaxHoehe); this.FallingTeil.move(0, TArena.AnzahlSchichten - 1); this.FallingColor = this.NextFallingColor; this.NextFallingColor = TTeil.createRandomColor(this._MyRandom); if (this.OnDataChanged != null) { this.OnDataChanged(); } }
} //Ende Methode myPanel_Paint /// <summary> /// Speichert das Teil, das unten angekommen ist /// </summary> /// <param name="t">Das zu speichernde Teil</param> public void saveTeil(TTeil t) { for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { if (t.hasSegment(i, k)) //Das Teil hat an dieser Stelle ein Segment { int pos = this.myArena.calcNewSektor(t.PositionSektor, i); this.SpielfeldFarben[pos, t.PositionSchicht - k] = this._SharedData.FallingColor; } } } }
/// <summary> /// Löscht das Teil und alle seine Segmente /// </summary> /// <param name="g">Graphics-Objekt zum Zeichnen</param> /// <param name="t">Das zu zeichnende Teil</param> /// <param name="backColor">Hintergrundfarbe des Panels</param> /// <param name="arena">Verweis auf die Arena</param> /// <param name="segment">Verweis auf das Segment zum Zeichnen</param> public static void deleteTeil(Graphics g, TTeil t, Color backColor, TVisualArena arena, TSegmentBase segment) { for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { if (t.hasSegment(i, k)) { int positionSektor = (t.PositionSektor + i) % TArena.AnzahlSektoren; int positionSchicht = t.PositionSchicht - k; segment.deleteSegment(positionSektor, positionSchicht, g, backColor); arena.repairNachbarn(positionSektor, positionSchicht, g); } } } }
/// <summary> /// Speichert das Teil, das unten angekommen ist /// </summary> /// <param name="t">Das zu speichernde Teil</param> public void saveTeil(TTeil t) { for (int i = 0; i < TTeil.MaxBreite; i++) { for (int k = 0; k < TTeil.MaxHoehe; k++) { if (t.hasSegment(i, k)) //Das Teil hat an dieser Stelle ein Segment { int pos = calcNewSektor(t.PositionSektor, i); int schicht = t.PositionSchicht - k; if (schicht > 0) { this.Spielfeld[pos, schicht] = true; } } } } }
/// <summary> /// Füllt das Teil t mit den entsprechenden Segmenten /// </summary> /// <param name="t">Das zu füllende Teil</param> public static void fillTeil(TTeil t) { t.SegmentArray[0, 0] = true; t.SegmentArray[1, 0] = true; t.SegmentArray[2, 0] = true; }
/// <summary> /// Zeigt das nächste Teil an /// </summary> /// <param name="t">Das nächste Teil</param> /// <param name="c">Die Farbe des nächsten Teils</param> public abstract void displayNext(TTeil t, Color c);