Dynamisch erstellten Timer eine Funktion direkt über Timer->OnTimer zuweisen!
-
Also,
ich will Buttons dynamisch erstellen. Das klappt auch wunderbar. Nun will ich aber auch, dass diese eine Bewegung ausführen, deshalb erstelle ich gleich danach einen Timer, der den Button bewegen soll.void TForm1::schuss1(void) { button[r] = new TButton(this); button[r]->Parent=this; button[r]->Top=y1; button[r]->Left=x1+12; button[r]->Height=5; button[r]->Width=5; button[r]->Caption="$"; timer[r] = new TTimer (this); timer[r]->Interval=100; timer[r]->Enabled=true; timer[r]->OnTimer({button[r]->Top-=10;}); }
In der letzen Zeile will ich für den erstellten Timer direkt eine Funktion erstellen. Aber beim Compilen erhalte ich die Fehlermeldung "[C++ Error] Unit1.cpp(55): E2188 Expression syntax".
Da ich im FAQ nur gefunden habe wir man auf eine bereits vorhandene Funktion verweist, habe ich nun diesen Beitrag erstellt.
So nun wär ich für Tipps oder Lösungen für mein Vorhaben dankbar :).P.s.: Verzeit mir wenn ich etwas im FAQ übersehen habe oder ich nicht die richtigen Suchbegriffe benutzt habe. Danke.
-
Du versuchst einen L-Wert als Funktion zu verwenden.
timer[r]->OnTimer = NameDerFunkion;
Diese Funktion muss bereits existieren.
Davon abgesehen sollten Timer nur sparsam eingesetzt werden, da Windows diese nur in begrenzter Zahl zur Verfügung hat.
Ansonsten geht aus Deinem Source nicht hervor, was für einen Sinn das haben soll. Sag uns, was Du erreichen möchtest, dann können wir Dir bestimmt helfen...
-
Hallo
timer[r]->OnTimer({button[r]->Top-=10;});
das funktioniert nicht. Du mußt eine seperate Funktion für das Form erstellen, die den Button bewegt, und diese an den Timer-Event übergeben :
void __fastcall TForm1::OnButtonTimer(TObject *Sender) { TTimer *CurTimer = dynamic_cast<TTimer *> (Sender); button[CurTimer->Tag]->Top-=10; } timer[r]->OnTimer = OnButtonTimer; timer[r]->Tag = r;
bis bald
akari
-
@akari
Deine Variante funktioniert im Prinzip, jedoch geht es so nicht mehrer Buttons gleichzeitig zu bewegen. Wenn man Butons direkt nacheinander macht, stoppt der erste Button seine Bewegung.Also, um hier rätselraten vorzubeugen, werde ich kurz auf den Sinn des ganzen eingehen:
Also in unseren Info-Kurs hat sich eine Art Kult entwickelt Spiele zu machen, die hauptsächlich aus Buttons bestehen. So nun will ich eine Spiel machen, wo sich zwei Buttons gegenüber stehen und ein Schießduell austragen. Nun soll für den Schuss nartürlich auch ein Button verwendet werden. Deshalb will ich die Buttons dynamisch erstellen, was durch das FAQ kein Problem war. Aber die Bewegung stellt sich als Problem dar, wenn man mehr als ein Button gleichzeitig bewegen will.
Ich hoffe, dass das Programm wofür ich Hilfe brauche euch nicht davon abhält mir zu helfen.
Falls es hilft:
Bewegung der Spieler:
void __fastcall TForm1::Button1KeyPress(TObject *Sender, char &Key) { if(Key=='W' || Key=='w'){y1-=8;Button1->Top=y1; } if(Key=='S' || Key=='s'){y1+=8;Button1->Top=y1; } if(Key=='A' || Key=='a'){x1-=8;Button1->Left=x1;} if(Key=='D' || Key=='d'){x1+=8;Button1->Left=x1;} if(Key=='F' || Key=='f') schuss1(); if(Key=='8'){y2-=8;Button2->Top=y2; } if(Key=='5'){y2+=8;Button2->Top=y2; } if(Key=='4'){x2-=8;Button2->Left=x2;} if(Key=='6'){x2+=8;Button2->Left=x2;} if(Key=='9')schuss2(); }
"Schuss" Funktionen:
void TForm1::schuss1(void) { button[r] = new TButton(this); button[r]->Parent=this; button[r]->Top=y1; button[r]->Left=x1+12; button[r]->Height=5; button[r]->Width=5; button[r]->Caption="$"; timer[r] = new TTimer (this); timer[r]->Interval=100; timer[r]->Enabled=true; timer[r]->Tag=r; timer[r]->OnTimer=OnButtonTimer; r++; //fehlte im vorherigen Quelltext } void TForm1::schuss2(void) { if(!schiessen2) { button[r] = new TButton(this); button[r]->Parent=this; button[r]->Top=y1; button[r]->Left=x1+12; button[r]->Height=5; button[r]->Width=5; button[r]->Caption="$"; timer[r] = new TTimer (this); timer[r]->Interval=100; timer[r]->Enabled=true; timer[r]->Tag=r; timer[r]->OnTimer=OnButtonTimer; r++ }
-
Hallo
ich versteh zwaw nicht, wie das ganze Ablaufen soll, rate dir aber zu einem zentralem Timer, der alle Objekte entsprechend der letzten Eingabe bewegt.
bis bald
akari
-
Trotzdem benötigst Du nur einen einzigen Timer!
In dieser Timerfunktion musst Du dann nru durch das Buttonarray iterieren und die Buttons entsprechend bewegen. Nicht mehr sichtbare Schuss-Buttons solltest Du auch dann direkt löschen. Wenn ich es richtig sehe könnte man den Wert der Verschiebung in TButton::Tag speichern.
EDIT: akari war mal wieder schneller...
-
Ich kann mir ungefähr vorstellen, wie ich jetzt vorgehen muss.
Nur ein Problem habe ich noch: wie muss die Timer-Funktion aussehen, dass sie alle zu diesem Zeitpunkt erstellten "Schuss"Buttons bewegt.Die Buttons werden gelöscht wenn sie außerhalb des Spielfeldes sind oder den anderen Spieler treffen.