public LevelUebergang(Treffer rundenErgebnis) : this() { var gespieltesLevel = LevelSequenzierer.ErzeugeLevelBeschreibung(rundenErgebnis.GespieltesLevel); this.Ueberschrift.Text = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } and { rundenErgebnis.GetroffenerSpieler.Name } on a Wrath of the Mild series of missions"; this.AktuellesLevel.Text = $@"Level { rundenErgebnis.GespieltesLevel }: ""{ gespieltesLevel.LevelName }"""; this.AktuellesLevelDetails.Text = $@"Being the { gespieltesLevel.LevelNummerInMission } level in the ""{ gespieltesLevel.MissionsName }"" mission"; this.ErgebnisGewonnen.Text = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } won, { rundenErgebnis.ObsiegenderSpieler.Lebenspunkte } HP left"; if (rundenErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen) { this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } n00bed themselves out"; } else { this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } has been pwned"; } var kommendesLevel = LevelSequenzierer.ErzeugeLevelBeschreibung(rundenErgebnis.GespieltesLevel + 1); if (kommendesLevel == null) { this.KommendesLevel.Text = "Be at peace"; this.KommendesLevelDetails.Text = "Congratulations, you completed all missions"; } else { this.KommendesLevel.Text = $@"Level { rundenErgebnis.GespieltesLevel + 1 }: ""{ kommendesLevel.LevelName }"""; this.KommendesLevelDetails.Text = $@"Being the { kommendesLevel.LevelNummerInMission } level in the ""{ kommendesLevel.MissionsName }"" mission"; } }
public UebungNocheinmal(Treffer rundenErgebnis) : this() { this.ErgebnisGewonnen.Text = $@"{ rundenErgebnis.ObsiegenderSpieler.Name } won, { rundenErgebnis.ObsiegenderSpieler.Lebenspunkte } HP left"; if (rundenErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen) { this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } n00bed themselves out"; } else { this.ErgebnisBesiegt.Text = $"{ rundenErgebnis.GetroffenerSpieler.Name } has been pwned"; } }
private bool SpielerWurdeGetroffen(Treffer schussErgebnis) { this.Audio.GeraeuschAbspielen(Geraeusche.SchussEinschlag); new Explosion(Color.FromArgb(new Random().Next(int.MaxValue)), 175).Noobsplosion(this, this.levelBild, this.ausgangsZustand, schussErgebnis.EinschlagsKoordinateX, schussErgebnis.EinschlagsKoordinateY); var getroffenerSpieler = schussErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen ? this.dranSeiender : this.Gegner; getroffenerSpieler.Schaden(this.dranSeiender.Waffe.SchadensPunkte); schussErgebnis.GetroffenerSpieler = getroffenerSpieler; schussErgebnis.ObsiegenderSpieler = object.ReferenceEquals(getroffenerSpieler, this.dranSeiender) ? this.Gegner : this.dranSeiender; using (var zeichenFlaeche = Graphics.FromImage(this.levelBild)) { this.herzAnzeige.Zeichnen( this, zeichenFlaeche, object.ReferenceEquals(getroffenerSpieler, this.spielerEins) ? getroffenerSpieler : null, object.ReferenceEquals(getroffenerSpieler, this.spielerZwei) ? getroffenerSpieler : null ); } this.Refresh(); if (getroffenerSpieler.Tot) { using (var weiterMachen = this.TurnierModus ? (Form) new LevelUebergang(schussErgebnis) : (Form) new UebungNocheinmal(schussErgebnis)) { switch (weiterMachen.ShowDialog(this)) { case DialogResult.OK: this.spielPhase = SpielPhase.WeltErzeugen; return(true); case DialogResult.Retry: this.spielPhase = SpielPhase.WeltErzeugen; return(false); case DialogResult.Abort: this.spielPhase = SpielPhase.StartBildschirm; return(false); } } } else { return(true); } return(false); }
private Treffer Schiessen(SchussEingabe schussEingabe) { double x, y; /* schiessen wir nach rechts (spieler 1) oder nach links (spieler 2)? */ var schussRichtung = object.ReferenceEquals(this.dranSeiender, this.spielerEins) ? 1 : -1; var v = (float)schussEingabe.SchussKraft; var vSkaliert = 1.0f / (v * 0.5f); var mathWinkel = Math.PI * (float)(180 - schussEingabe.SchussWinkel) / 180f; var muendungVerlassen = false; var behandeltePixel = new List <long>(); var ausgangsPunktx = this.dranSeiender.X; var ausgangsPunkty = this.dranSeiender.Y; var schussErgebnis = new Treffer { GespieltesLevel = this.aktuelleLevelNummer, Ergebnis = SchussErgebnis.NixGetroffen }; /* von hier nach dort x laufen lassen */ for ( var t = 0.0f; ; t += vSkaliert ) { /* formel für die schuss-parabel mit schwerkraft * * x = v * cos(winkel) * t; * y = v * sin(winkel) * t - 0.5g * t²; * * x --> t² und y --> t³ macht eine coole, brauchbare, * akzelerierende hyperbolische flugbahn! * */ switch (schussEingabe.Trajektorie) { case TrajektorienArt.SinusDaempfer: var powPow = Math.Pow(t, t); x = v * -t; y = v * Math.Sin(powPow) / Math.Pow(2, (powPow - Math.PI / 2.0)); break; case TrajektorienArt.Kubisch: var tQuadrat = t * t; x = v * Math.Cos(mathWinkel) * tQuadrat; y = v * Math.Sin(mathWinkel) * t - Main.schwerkraftFaktor * tQuadrat * t; break; default: /* standard: resultierender vektor aus schwerkraftrichtung und mündungsrichtung, parabolisch */ x = v * Math.Cos(mathWinkel) * t; y = v * Math.Sin(mathWinkel) * t - Main.schwerkraftFaktor * t * t; break; } /* schuss zeichnen */ var pixelX = ausgangsPunktx - (int)x * schussRichtung; var pixelY = ausgangsPunkty - (int)y; if (pixelY > 0 && pixelY < this.levelBild.Height && pixelX > 0 && pixelX < this.levelBild.Width) { var pixelFach = ((long)pixelY << 32) + (long)pixelX; if (!behandeltePixel.Contains(pixelFach)) { var hitColor = this.levelBild.GetPixel(pixelX, pixelY).ToArgb(); if (muendungVerlassen == false) { if (hitColor != ((SolidBrush)this.dranSeiender.Farbe).Color.ToArgb()) { this.Audio.GeraeuschAbspielen(Geraeusche.SchussStart); muendungVerlassen = true; } } else { if (hitColor == ((SolidBrush)this.Gegner.Farbe).Color.ToArgb()) { return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.GegnerGekillt)); } else if (hitColor != Farbverwaltung.HimmelsfarbeAlsInt) { if (hitColor == ((SolidBrush)this.dranSeiender.Farbe).Color.ToArgb()) { return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.SelbstErschossen)); } else { return(schussErgebnis.Setzen(pixelX, pixelY, SchussErgebnis.BergGetroffen)); } } this.levelBild.SetPixel(pixelX, pixelY, ((SolidBrush)this.dranSeiender.Farbe).Color); behandeltePixel.Add(pixelFach); } } } Application.DoEvents(); this.Refresh(); /* schuss ist links, rechts, oder unten rausgeflogen */ if (pixelY > this.levelBild.Height || pixelX < 0 || pixelX > this.levelBild.Width) { break; } } return(schussErgebnis); }