Donnerstag, Juni 4, 2020

C# unload-und load-Formular ein – / ausblenden und schließen

Ich bin Codierung einer einfachen sidescroller in C# mit Windows forms-Anwendungen. Ich will es so, wenn der Spieler berührt eine exit-Stelle, diese sofort lädt eine neue Ebene.

Um dies zu implementieren, nutze ich den folgenden code:

if (player.Bounds.IntersectsWith(exit.Bounds))
{
    Form2 myNewForm = new Form2();
    myNewForm.Visible = true;
    this.Hide();
}

Dieser funktioniert. Jedoch lädt es zahlreiche Instanzen von form2 – ich möchte nur, dass es zu laden, sobald. Ich weiß nicht, wie diese zu schreiben (sorry, ich bin ein Neuling – es dauerte eine Weile, nur um dieser code zu schreiben!).

Auch, laden Sie eine Ebene über eine neue form ist ineffizient. Gibt es eine Möglichkeit zum entladen der offenen form zu laden, die nächste in der gleichen Fenster/Instanz, anstatt ein weiteres separates Fenster?

Sorry, wenn dies ist, ist noch unklar. Ich habe mein bestes getan, Forschung + ich bin neu. Bitte nicht erwähnen XNA! Danke.

  • Blick auf das singleton-Muster verwenden: stackoverflow.com/questions/1403600/…
  • Lesen Sie die Kommentare, sehe ich, dass das geklärt ist. Sollten Sie die Antwort, die am besten erfüllt Ihre Bedürfnisse. That being said, zu Experimentieren mit meinen eigenen winforms-Spiel, ich war kein fan von dem ständigen öffnen und schließen von Fenstern zwischen den ‚levels‘. Die route, die ich nahm, war ein Haupt-Fenster-die befindet sich eine Menü-Leiste und alle Benutzersteuerelemente, die vertreten alle levels oder maps oder was auch immer. Das Hauptfenster nur diktiert, die UserControl sichtbar war, ähnlich wie zmechanic Antwort.
InformationsquelleAutor multipack1 | 2015-01-15

3 Kommentare

  1. 4

    Müssen Sie eine kleine änderung an Ihrem Projekt ist Programm.cs-Datei, ändern Sie die Art und Weise Ihre app entscheidet, zu beenden. Dich einfach verlassen, wenn es nicht mehr von windows übrig. Machen Sie es wie folgt Aussehen:

    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var start = new Form1();
            start.FormClosed += WindowClosed;
            start.Show();
            Application.Run();
        }
    
        static void WindowClosed(object sender, FormClosedEventArgs e) {
            if (Application.OpenForms.Count == 0) Application.Exit();
            else Application.OpenForms[0].FormClosed += WindowClosed;
        }
    }

    Nun ist es einfach:

    if (player.Bounds.IntersectsWith(exit.Bounds))
    {
        new Form2().Show();
        this.Close();
    }
    • Ich danke Ihnen so sehr. Dieser arbeitete. Ich lasse diese Frage für die Zukunft, sollte jemand das gleiche problem haben. Danke für die Hilfe alle. Dies ist eine große Gemeinschaft.
  2. 0

    Können Sie Application.OpenForms[] Sammlung zum abrufen der Formular Geöffnet Instanz und es dann Zeigen.

    Versuchen Sie Dies:

    Form2 frmMyForm = (Form2)Application.OpenForms["formName"];
    frmMyForm.Show();
    • Hi. Danke für die Antwort! Ich habe versucht, bekomme aber die Fehlermeldung „der Objektverweis wurde nicht auf eine Instanz des Objekts“ – sorry, ich bin liebäugelt mit ihm um, aber ich bin ein Neuling!!! Ich habe versucht: Form2 frmMyForm = (Form2)Anwendung.OpenForms[„Form1“]; frmMyForm.Show();
    • versuchen dieses Sie sollten geben formname als Form2 statt Form1 (wenn Sie nicht ändern Sie) versuchen Sie dies: Form2 frmMyForm = (Form2)Application.OpenForms["Form2"];
    • Danke für die schnelle Antwort! Ich habe versucht, diese aber speziell für diesen code (frmMyForm.Show();) bekomme ich den gleichen Fehler. Hmm…
  3. 0

    Das eigentliche problem ist nicht in Ihrem Formular geladen werden mehrmals, aber in Ihrem Spiel-Logik nicht unterbrochen, wenn das Ende der Ebene erreicht ist. Es bedeutet, dass Ihr Spiel weiterhin spielen eine alte Ebene, wenn ein neues level bereits geladen wurde.

    Wenn Form1 das Hauptformular dann Ihre ganze Anwendung wird heruntergefahren. Sie müssen bootstraper, welche den Einstiegspunkt der Anwendung, nicht die Form1. Wenn Sie tun, dass Ihre Form1 wird ein Kind im gleichen Sinn, wie wird Form2. Sie können öffnen und schließen Sie Sie ohne ein Herunterfahren der Anwendung. Wenn Sie nicht wissen, wie zu tun, erstellen Sie einfach ein weiteres leeres Formular, nennen wir es mal Main und machen Sie den Start-Formular Ihrer Anwendung. Dann verstecken Sie es, und öffnen Sie Form1 aus Haupt-Formular als Modal. Dann, wenn Sie komplette Ebene in Form1 schließen Sie Form1, die code flow zurück zum Hauptformular, und Sie werden laichen Form2 aus Haupt-Formular als Modal. Sie haben vollkommen vorhersehbaren Logik, wo alle Formulare geöffnet werden, die aus einer einzigen kontrollierten Platz.

    • Ah, das macht Sinn. Danke für die Antwort. Ich habe versucht mein code zu dieser.Schließen Sie statt dessen.Verbergen schließen Sie form1, aber es endet, bis schließen von form2 zu. Hmm…
    • Siehe meine Antwort aktualisiert.

Kostenlose Online-Tests