Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Constructor per Button starten (änderbar)
IhopeonlyReader - Sa 21.04.12 13:38
Titel: Constructor per Button starten (änderbar)
guten Tag,
ich weiß aus der Überschrift kann man nicht viel erfahren. Das liegt daran das ich noch ein z8iemlicher Anfänger bin und mich Programm für Programm durch einige Foren lese und immer weiter komme... nun bin ich bei einem Towerdefense Spiel angekommen... theoretisch habe ich mir überlegt wie es geht, jedoch fehlt es mir an der Praxis.
Ich würde gerne wissen, wie ich einen Constructor immer wieder aufrufe und den alten bestehen lasse, alles durch ein und denselbem Button. Beispiel;
ich drücke auf einen button und ein Kreis bewegt sich von links oben nach rechts oben, drück ich nochmal auf den button soll der alte kreis sich weiter nach rechts bewegen, aber es soll zusätzlich ein neuer kreis erscheinen, der für sich selbst läuft (auch von links nach rechts) die Y Koordinaten (und Start X) koordinate werden per Edit festgelegt.
Istz es möglich ohne eine andeuernde Schliefe zu machen??
(ich hatte es bis jetzt so gedacht)(a1,a2.. sind entsprechend uzgeweisen bei den var miz a1, a2...:TForm1;
und x ist eine einfache integer Zahl, variable ist eine integer zahl (begintn mir 1) also var variable:integer=1;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1click(Sender: TObject); begin x:= x+1; if x=1 then a1.schusscreate(Mausposx,Mausposy);
if x=2 then a2.schusscreate(Mausposx,Mausposy); ... (immer so weiter) end; |
und im Timer dann
Delphi-Quelltext
1: 2:
| if x>=1 then a1.schussbewegen; if x>=2 then a2.schussbewegen;... |
kann man das, ohne diese Schleife machen? irgendwie mit a[x].schusscreate(Mausposx,Mausposy);
und im timer dann entsprechend while variable<x begin
a[variable].schussbewegen(Mausposx,Mausposy);
variable:=variable+1;
end;
Moderiert von
Martok: Delphi-Tags hinzugefügt
bummi - Sa 21.04.12 15:52
Erst mal herzlich willkommen im Forum.
Der Konstruktor ist Teil der Klasse, die Klasse selbst wird nie verändert.
Über den Konstruktor bekommst Du Objekte.
Das kann man sich vorstellen wie MeinKuchen := MeinRezepte.Backe.
Du kannst Dir beliebig viele Instanzen erstellen um mit diesen etwas zu tun wirst Du um eine Schleife nicht herumkommen, allerdings keine Schleife für die Aktion sondern eine über Deine Objekte.
Deine Objekte könntest könntest Du in einem Array verwalten, anbieten würde sich hierfür aber eine Liste, oder spezieller hier gleich eine Objektliste. Wie bequem damit zu arbeiten ist hängt ein wenig von Deiner Delphiversion ab, ab D2009 könntest Du Generics verwenden, quasi Objektlisten die schon wissen was für eine Sorte Objekt sie verwalten.
Ich gehe jetzt mal davon aus daß Du Delphi < 2009 verwendest.
Als erstes würdest Du eine Objektliste anlegen.
FObjectlist := TObjectlist.Creste;
diese musst Du am Schluss wieder freigeben, hierbei werden standardmäßig alle Objekte die Du hinzugefügt hast ebenfalls freigegeben (da kannst dies über die Eigenschaft ownsobject umschalten, musst dann aber Deine Objekte sebst wieder frei geben)
Das Erzeugen funktioniert grob so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var DummyVar:TMyObject; begin DummyVar := TMyObject.Create; DummyVar.Irgendwas ... FMyObjectList.Add(DummyVar); end; |
in Deinem Timer benötigst Du jetzt eine Schleife
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var i:Integer; DummyVar:TMyObject; begin For i := 0 to FMyObjectList.Count - 1 do begin DummyVar:=TMyObject(FMyObjectList[i]); DummyVar.RechneUndZeichnewasauchimmer end; end; |
Objekte die Du nicht mehr benötigst kannst Du per FMyObjectList.Delete(Nr) entfernen
Das nur als grober Anriss...
EDIT
Ich habe ein kleines Beispiel angehängt ...
IhopeonlyReader - Sa 21.04.12 16:22
bummi hat folgendes geschrieben : |
| Ich gehe jetzt mal davon aus daß Du Delphi < 2009 verwendest. |
das ist richtig, ich benutze Delphi 7 PE !
Und danke für dein beigeletegtes Project, jedoch fehlt Form 2 :DD (so hab ich das aus der Fehlermeldung gelsen)
Moderiert von
Narses: Zitat kenntlich gemacht.Moderiert von
Narses: Beiträge zusammengefasst bummi hat folgendes geschrieben : |
| Erst mal herzlich willkommen im Forum |
danke ;)
bummi hat folgendes geschrieben : |
Das Erzeugen funktioniert grob so
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var DummyVar:TMyObject; begin DummyVar := TMyObject.Create; DummyVar.Irgendwas ... FMyObjectList.Add(DummyVar); end; |
in Deinem Timer benötigst Du jetzt eine Schleife
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var i:Integer; DummyVar:TMyObject; begin For i := 0 to FMyObjectList.Count - 1 do begin DummyVar:=TMyObject(FMyObjectList[i]); DummyVar.RechneUndZeichnewasauchimmer end; end; |
Objekte die Du nicht mehr benötigst kannst Du per FMyObjectList.Delete(Nr) entfernen
|
dann muss ich anstatt das (unübersichtlich) im Quelltext zu schreiben das in der FMyobjectlist reinmachen?
vom aufwand sehe ich da keinen unterschied... gibt es keine möglichkeit mit steigernde variable auch einen immer einen neues Object per Constructor aufzurufen? (OHNE schleife)
bummi - Sa 21.04.12 16:43
Die Meldung kannst Du ignorieren, liegt and Deiner Delphiversion, das Projekt sollte bis auf das Res das neu erstellt wird komplett sein.
Die "steigende Variable" ergibt sich beim einfügen in die Objectlist (Liste.Count).
Ich wüsste keinen Weg es noch einfacher umzusetzen.
IhopeonlyReader - Sa 21.04.12 17:51
bummi hat folgendes geschrieben : |
Die Meldung kannst Du ignorieren, liegt and Deiner Delphiversion, das Projekt sollte bis auf das Res das neu erstellt wird komplett sein.
Die "steigende Variable" ergibt sich beim einfügen in die Objectlist (Liste.Count).
Ich wüsste keinen Weg es noch einfacher umzusetzen. |
[Fehler] BallProject.dpr(11): Undefinierter Bezeichner: 'MainFormOnTaskbar'
Mainformontaskbar? was ist das? sowohl ich als auch meine delphi version kennen das noch nicht :D <- neuling ;)
Edit: Programm funzt und ich bin gerade dabei das zu verstehen, aber ich habe jetzt die Frage, kann jede Position (jedes Balles) bestimmt werden?
bummi - So 22.04.12 00:27
Ja X und Y, wie man an die Bälle kommst siehst Du z.B. dort wo b := TBall(BL[i]);
steht
IhopeonlyReader - So 22.04.12 14:00
bummi hat folgendes geschrieben : |
| Ja X und Y |
x und Y des Mittelpunktes des Kreises? oder beide X und beide Y Koordinaten? oder die X ganz libnks und die Y ganz oben?
oder kommt es darauf an, wie ich den Ball zeichnen lasse?
bummi - So 22.04.12 14:50
siehst Du wenn Du Dir die Setter/Getter von Top und Left anschaust ....
IhopeonlyReader - Mo 23.04.12 16:02
bummi hat folgendes geschrieben : |
| siehst Du wenn Du Dir die Setter/Getter von Top und Left anschaust .... |
Setter und Getter? sowas wie property?
bummi - Mo 23.04.12 17:23
Die Prozeduren / Funtionen der Properties ja ..
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!