Form schließen und Flappy Bird

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Form schließen und Flappy Bird

Beitrag von Tim »

Hey, hab mal wieder zwei Fragen:

1. Ich hab Ping Pong programmiert, mit Single-und Multiplayer usw. und (ist bestimmt nicht die beste Lösung, aber ich bin Schüler der gerade angefangen hat zu programmieren) hab jeden "Modus" und das Menü in eine extra Form gepackt.
Beim Aufrufen des Programms startet zuerst die FormMenu (Quelltext in Unit2) und von dort aus kann ich dann über verschiedene Buttons zu FormMultiplayer (Unit 1), FormSingleplayer (Unit 3) und der FormOptions (Unit4) wechseln.
Aber irgendwie krieg ich das mit der Verknüpfung der Units nicht hin... ich zeig euch mal den Quelltext (gekürzt):

Code: Alles auswählen

 
unit Unit2;
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls, ExtCtrls;
 
implementation
uses unit1, unit3, Unit4;
 
procedure TFormMenu.SpBtnMultiplayerClick(Sender: TObject);
begin
 FormMultiplayer.ShowModal;
 FormMenu.Visible:=False;
end;
 
procedure TFormMenu.SpBtnOptionsClick(Sender: TObject);
begin
 FormOptions.ShowModal;
 FormMenu.Visible:=False;
end
 
procedure TFormMenu.SpBtnSingleplayerClick(Sender: TObject);
begin
 FormSingleplayer.ShowModal;
 close;
end;
 


Wie ihr seht hab ich verschiedene Sachen versucht die Form zu schließen, bzw. nicht mehr anzuzeigen. Keine funktioniert so.
Meine Notlösung war dann einfache alle Forms in der Mitte des Bildschirmes zu zentrieren und übereinander zu legen (ist aber auch keine Lösung wirklich). Das Problem tritt dann auf wenn ich über den ButtonBack von der FormOptions zur FormMenu zurück will:

Code: Alles auswählen

 
unit Unit4;
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
  StdCtrls, Unit1, Unit2;
 
implementation
 
procedure TFormOptions.SpBtnBackClick(Sender: TObject);
begin
  FormOptions.close;
  FormMenu.ShowModal;
end;
 
 


Folgender Fehler tritt auf:
22-12-_2016_18-03-52.png
22-12-_2016_18-03-52.png (8.18 KiB) 915 mal betrachtet

22-12-_2016_18-02-49.png


Hab auch schon meine Info Lehrerin gefragt, aber die konnte da auch nicht helfen............... :evil:
Vielleicht jemand von euch?

2.Frage:
Mein nächstes Projekt ist Flappy Bird. Wer es kennt, weiß dass man da durch so Säulen durchfliegen muss. Ich weiß nur nicht wie ich immer mehr Säulen am Bildschirmrand auftauchen lasse. Muss ich für jede ein neues Objekt erstellen oder sowas in der Art? (hab da keine Ahnung wie...) Mein Lösungsansatz war jetzt einfach 3 Objekte mit dem Bild zu erstellen und die dann wenn sie die linke Seite des Bildschirmes erreichen einfach wieder nach rechts zu setzten (habs aber noch nicht ausprobiert.) Ist das so möglich oder gibt es einen einfacheren Weg?

Danke für eure Hilfe,
Nachfragen beantworte ich gerne.

Grüße Tim
Zuletzt geändert von Tim am Do 22. Dez 2016, 21:18, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Form schließen und Flappy Bird

Beitrag von Michl »

Hab zwar nicht alles verstanden, doch vermeide zirkuläre Zugriffe! Am besten ist es, du verwendest ein Formular (Mainform), von dem aus du alle anderen Formulare anzeigst. Nach dem Schließen des jeweiligen Formulars kehrst du automatisch zur Mainform zurück.

Der Fehler dürfte daher rühren, daß mit Showmodal die Abarbeitung der Methode im aufrufendem Formular unterbrochen wird. Erst nachdem des Formular geschlossen wurde, wird diese Methode an der Stelle fortgesetzt.

Bsp:
- in Form1 ruftst du Form2.ShowModal auf -> die Abarbeitung des Codes von Form1 wird gestoppt, es wird auf das ModalResult von Form2 gewartet
--> Form2 wird angezeigt
- in Form2 rufst du Form1.ShowModal auf -> es kracht, da die Abarbeitung der vorherigen Methode noch nicht beendet ist

Man kann das zwar mit Form.Show statt Form.ShowModal vermeiden, besser ist es jedoch zirkuläre Zugriffe gar nicht erst zu machen, siehe oben.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Tim
Beiträge: 21
Registriert: Fr 2. Dez 2016, 16:47

Re: Form schließen und Flappy Bird

Beitrag von Tim »

Danke geht! :) Gut genau so wollte ich es auch haben mit der Hauptform. Wusste nur nicht 1. dass der Code nach dem Schließen direkt stoppt und 2. dass ich wenn ich eine Form schließe direkt zur Hauptform zurückkehre.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Form schließen und Flappy Bird

Beitrag von Mathias »

Mein nächstes Projekt ist Flappy Bird. Wer es kennt, weiß dass man da durch so Säulen durchfliegen muss. Ich weiß nur nicht wie ich immer mehr Säulen am Bildschirmrand auftauchen lasse.
Wen es etwas professionelles geben soll, würde ich dazu OpenGL verwenden.

Aber wen es nur etwas einfaches werden soll, würde ich mehrere TShape auftauchen lassen. Siehe stark vereinfachtes Beispiel im Anhang.
Dateianhänge
Flappy Bird.zip
(124.74 KiB) 83-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten