Ich lese jetzt schon seit einiger Zeit hier im Forum und fand immer gut, wie sich die Mitglieder hier gegenseitig helfen. Nun gehöre ich also auch dazu. Allerdings wohl eher zu denen die Fragen stellen
Ich bin gerade dabei einen Leveleditor zu schreiben. Ich verwende dazu die Komponente Image. Zu Beginn gibt der Benutzer an, aus wievielen Quadraten das Level bestehen soll. (Also wie groß das Level werden soll.)
Danach wird dann das Image auf die entsprechende Größe gesetzt. (Anzahl Quadrate in X bzw. Y Richtung mal 25.)
Im MouseOver Event wird die Mausposition ermittelt und daraus das aktuelle Quadrat (Spielfeld) über dem sich die Maus befindet. Zusätzlich wird das Quadrat der aktuellen Mausposition eingezeichnet.
Das Flackern der Image Box sowie das Problem mit dem Scrollen habe ich bereits gelöst. Allerdings leere ich zur Zeit das komplette Image jedesmal, wenn die Maus ein neues Quadrat erreicht.
Mit dem OnClick Ereignis möchte ich jetzt das aktuelle Quadrat mit einer bestimmten Farbe füllen. Das Problem dabei ist, das bei der nächsten Mausbewegung das Quadrat wieder gelöscht wird.
Meine Frage ist jetzt, wie ich es schaffen kann, dass sämtliche angeklickten Quadrate erhalten bleiben?
PS: Ich bin noch Anfänger! Bitte geht noch sorgsam mit mir um
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hallo und willkommen im Forum. Solltest du da unten gleich etwas nicht verstehen. Scheue dich nicht zu fragen. Ich weiß ja nicht wie gut du dich mit Delphi auskennst.
Nach Möglichkeit würde ich auch die selber gezeichnete Maus erst einmal raus lassen. Die macht so etwas nur zu kompliziertert. Also für den Anfang versteht sich.
Ich würde mir intern ein 2 Dimensionales Array anlegen in dem ich diverse Staties von den einzelnen Flächen abspeichere. Also ist ein Feld selektiert und vor allem das wichtigste. Was ist es überhaupt.
Code:
type
TField =record
FieldType:Byte;
Selected:Boolean;
end;
Das ist ein Feld und in dem Formular würde ich eine Private Variable deklarieren die ein 2D Array ist.
Code:
FFields:arrayofarrayof TField;
Wenn der Benutzer die Größe eingegeben hat rufst du folgendes auf. Und weißt deinen Feldern einen Standardwert zu.
Code:
SetLength(FFields, Breite, Höhe);
Auf die einzelnen Felder kannst du so zugreifen. Wichtig. X und Y beginnen jeweils mit 0 und enden bei Breite -1 bzw Höhe -1.
Code:
FFields[X, Y].FieldType:=1;
Wenn du jetzt das Bild neu zeichnest würde ich hergehen und in zwei Schleifen (eine für Y und eine für X) dieses Array durchgehen und entsprechend der Eigenschaften deine Felder zeichnen. Also je nachdem welchen typen sie haben kannst du sie unterschiedlich einfärben und wenn sie selektiert sind bekommen sie noch einen Rand.
Willst du jetzt Felder einen anderen Typen zuweisen so gehst du auch wieder mit zwei schleifen durch die Felder und setzt, nur bei denen die selektiert sind, den entsprechenden Feldtypen.
Wenn du mit einem TImage arbeitest kannst du zum Zeichnen auch kurzzeitig ein TBitmap erstellen auf das du zeichnest. Wenn du dann fertig gezeichnet hast dann rufst du
Code:
Image.Picture.Bitmap.Assign(TempBitmap);
auf. Und anschließend gibst du das bild wieder frei.
PS: Das mit dem Selektiert ist nur ein Beispiel. Es kann natürlich auch sein, dass es sogar sinnvoller ist die Felder gar nicht erst zu selektieren sondern gleich den Typen zu ändern.
Danke erstmal für deine schnelle und ausführliche Antwort!
Ich habe jetzt mal in einem neun "Demp-Projekt" versucht alle deine Schritte nachzuvollziehen.
Ich habe also ein Image auf der Form und berechne aus der aktuellen Position der Maus über dem Image das Quadrat.
Jetzt möchte ich in der Prozedur
Code:
procedure TForm1.FormCreate(Sender: TObject);
das Array mit Werten füllen. Erstmal soll jedes Feld den Wert 0 bekommen.
Wenn das kein guter Einstieg in dieses Forum war weiß ich es auch nicht .
Im Array wird jetzt der Typ jedes Feldes gespeichert, im MouseDown Ereignis wird der Typ per Mausklick geändert und entsprechend farbig ausgemalt *freu*
Special Thx to sniper_w und Lossy eX!
PS: Eine Frage bleibt allerdings noch. Mein Image war etwas zu groß. Nur ein oder zwei Pixel. In der Demo wurde es nicht rechnerisch angepasst, sondern von Hand. Wenn ich mit der Maus einen Pixel zu weit Rechts über dem Image war, sprang der Typ des Feldes auf den Wert 30. Initialisiert wurden alle Felder mit 0, durch den Mausklick bekommen die Felder den Wert 1.
Warum bekommt der Typ den Wert 30?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nochwas zum durchlaufen von dynamischen Feldern. Du kannst mittels high(Feld) dir den maximalen Index im Feld holen. Damit kannst du dein Feld so durchlaufen:
Code:
for i := 0 to high(feld) do
Dadurch musst du noch netmal wissen wie groß dein Feld ist. Cool nicht?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
was auch einen gute möglichkeit für level editoren ist sind DrawGrids... Die ersparen dir viele Berechnungen (z.b ob ein teil der map grade im "blickfeld" ist und so...
Und da du dein Lebvel ja scheinbar sowieso aus Blöcken aufbaust kannst du einfach die strcutur die du schon hast ünbernehemen die größe der einzelenen "kästschen" im Drawgrid auf die größe deiner tiles setzen....
dann sieht zeichenset du über die drawcell methode vom DrawGrdi dein Spilefeld:
Die DrwaCell funktion wird aufgerufen sobald das fenster neu gezeichent wird (zb nach einem form1.refresh ) Es werden auch nur die gerade sichtbaren Zellen gezeichnet
Es gibt auch ein OnSelctCell event das du für das anklicken einer Zelle benutzen kannst...
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.