Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rechenintensiven Code bei OnMouseMove optimieren - aber wie? (https://www.delphipraxis.net/8208-rechenintensiven-code-bei-onmousemove-optimieren-aber-wie.html)

Yheeky 30. Aug 2003 22:40


Rechenintensiven Code bei OnMouseMove optimieren - aber wie?
 
Hi,

also ich programmiere gerade eine Art "Map-Editor". Ich habe die Spielfläche in 2600 Teile (Tiles) eingeteilt. Diese sind im Editor jeweils Weiß umrahmt, sollen aber, wenn man mit der Maus über ein Tile geht rot werden.

Mit dem folgenden Code erstelle ich die weißen Rechtecke, die die einzelnen Teils voneinander abtrennen.

Code:
  for X := 0 to XWert do
  for Y := 0 to YWert do
  Rectangle(x*12,y*12,x*12+12,y*12+12);
Bei "OnMouseMove" der Oberfläche frage ich ab, welches der Tiles rot markiert werden muss. Die anderen werden in der Zwischenzeit wieder weiß gezeichnet (logischerweise).

Mein Problem: Da 2600 Tiles doch schon sehr viel sind, ist die ganze Procedure sehr rechenintensiv. Wie könnte ich das denn besser verarbeiten?

Falls jemand mein Problem nicht verstanden hat, kann ich ja mit eventuellen Screenshots weiterhelfen.

Gruß Christian

Christian Seehase 30. Aug 2003 22:48

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Moin Yheeky,

warum beschränkst Du Dich nicht darauf, das Tile, über dem sich der Cursor befindet rot einzufärben, und nur die maximal acht die um dieses Tile herum sind wieder mit einem weissen Rahmen zu versehen?
Alle anderen behalten ja sowieso ihren weissen Rahmen.

Du würdest dann, im Prinzip, einen 3x3 Tile grossen Rahmen, bei dem immer die Mitte rot eingefärbt ist, über Deine Map bewegen.

Yheeky 30. Aug 2003 22:52

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Guter Ansatz...das werde ich mal probieren. Danke dir!

Gruß Christian

Yheeky 30. Aug 2003 23:33

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Mhmm, naja funktioniert nicht so, wie ich mir das erhofft hatte. Vom Prinzip her kein Problem, da funktioniert es, aber wenn man die Maus schneller bewegt und aus dem "Zeichenbereich" rauskommt, sind nunmal die alten Markierungen wieder da. Wenn ich den Zeichenbereich erhöhe, tritt das alte Problem der Geschwindigkeit wieder auf.

Gibt´s da vielleicht noch andere Möglichkeiten?

Christian Seehase 30. Aug 2003 23:41

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Moin Yheeky,

Du könntest während gezeichnet wird die MouseMove Prozedur deaktivieren, und sobald Du mit dem Zeichnen fertig bist wieder zur Verfügung stellen.

Yheeky 31. Aug 2003 00:02

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Wie kann ich sie denn deaktivieren?

Christian Seehase 31. Aug 2003 00:22

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Moin Yheeky,

so sollte es gehen, dann wird erst mal die Routine deaktiviert, gezeichnet, und die Routine neu aktiviert.

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

var
  mmSave : TMouseMoveEvent;

begin
  mmSave          := self.FormMouseMove;
  self.OnMouseMove := nil;
  try
  // Zeichnen
  finally
    self.OnMouseMove := mmSave;
  end;
end;

Yheeky 31. Aug 2003 00:34

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Mhmm, ne, funktioniert nicht. :(

Christian Seehase 31. Aug 2003 00:39

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Moin Yheeky,

und wenn Du Dir zusätzlich merkst, wo Du zuletzt das rote Feld gezeichnet hast, und dieses dann zuerst mal wieder mit einem weissen Rahmen versiehst, bevor Du das neue zeichnest?
Eventuell könntest Du noch prüfen, dass das neue Feld <> dem alten ist, damit es nicht unnötig flackert.

Yheeky 31. Aug 2003 00:44

Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
 
Das mit dem Prüfen des Feldes war meine erste Idee. Die hatte damals auch nicht so richtig funktioniert, aber vielleicht jetzt mit der neuen Funktion zusammen. Ich probier´s mal eben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz