private void RundeAustragen(SchussEingabe schussEingabe) { /* den schuss ausführen und schauen (ob) was getroffen wurde */ this.spielPhase = SpielPhase.SpielrundeAktiv; var schussErgebnis = this.Schiessen(schussEingabe); /* wenn keiner getroffen wurde, rollen tauschen, * der andere spieler ist dran */ if (schussErgebnis.Ergebnis == SchussErgebnis.GegnerGekillt || schussErgebnis.Ergebnis == SchussErgebnis.SelbstErschossen) { if (this.SpielerWurdeGetroffen(schussErgebnis)) { if (this.spielPhase == SpielPhase.WeltErzeugen) { if (this.TurnierModus) { schussErgebnis.GetroffenerSpieler.WiederAuferstehen(); this.BeginInvoke(new Action(() => { this.MissionFortsetzen(); })); return; } else { return; } } } else { this.ZurueckZumHauptmenu(); return; } } else { /* falls ein berg getroffen wurde, kann es sein, dass der andere spieler * den boden unter sich verloren hat, und tiefer fällt */ if (schussErgebnis.Ergebnis == SchussErgebnis.BergGetroffen) { Audio.GeraeuschAbspielen(Geraeusche.SchussEinschlag); new Explosion(Color.FromArgb(new Random().Next(int.MaxValue)), 50).Noobsplosion(this, this.levelBild, this.ausgangsZustand, schussErgebnis.EinschlagsKoordinateX, schussErgebnis.EinschlagsKoordinateY); } } this.AusgangszustandWiederherstellen(); using (var zeichenFlaeche = Graphics.FromImage(this.levelBild)) { this.dranSeiender.Zeichnen(zeichenFlaeche); this.Gegner.Zeichnen(zeichenFlaeche); } this.SpielerFallen(this.Gegner); this.SpielerFallen(this.dranSeiender); this.Refresh(); /* spieler wechseln sich jetzt ab */ this.dranSeiender = this.Gegner; this.RundeVorbereiten(); }
private SchussEingabe SchussBefehlLesen() { var schussEingabe = new SchussEingabe(); var winkelText = this.Winkel.Text.Trim().ToLowerInvariant(); if (schussEingabe.Deserialisieren($"{ winkelText },{ this.Ladung.Text }")) { return(schussEingabe); } else { return(null); } }
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); }