Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Application Processmessages zum bewegen von Charakteren (https://www.delphipraxis.net/12639-application-processmessages-zum-bewegen-von-charakteren.html)

MyRealName 15. Dez 2003 12:20

Re: Application Processmessages zum bewegen von Charakteren
 
also als erstes mußt Du die WndProc Deines Hauptfensters überschreiben, damit Du mitbekommst, daß 'ne Nachricht reinkommt. Dann registrierst Du Dir eine eindeutige Nachricht mit RegisterWindowMessage

var FMyMessage : Cardinal;
begin
FMyMessage := RegisterWindowMessage('MySpecialPChar_unique');
end;

in der WndProc testest Du dann, ob es Diene Nachricht ist und arbeitest sie ab.

function TProductGen.WndProc(var Msg: TMessage): Integer;
begin
If Msg.Msg = FMyMessage Then begin
// insert your code here
end;
inherited;
end; // WndProc

Dann brauchst Du nur noch 'nen HiRes-Timer, der dich alle x-millisekunden anhaut, so daß Du ein SendMessage machen kannst. Gleichzeit setzt Du die neuen Positionen, damit sich Deine Sprites auch bewegen.

MRN

Flogo 17. Dez 2003 21:23

Re: Application Processmessages zum bewegen von Charakteren
 
Habs immer noch nicht ganz verstanden :oops:
heißt das ich muss irgendwann sagen
sendmessage(FMyMessage)
und eine procedrue OnMyMessage schreibendie das dann verarbeitet?
Wie kann ich dann sagen lauf dahin. Wenn du angekommen bist mache ... wenn das ziel geändert wurde mache wasanderes.
die gleiche frage stellt sich mir übrigens auch noch bei threads :gruebel:

Flogo 12. Jan 2004 21:43

Re: Application Processmessages zum bewegen von Charakteren
 
Ok Ich hab jetzt mit Threads hin und her experimentiert und bin zu folgendem Ergebnis gekommen:

Delphi-Quellcode:
Unit1:

procedure TForm1.FormCreate(Sender: TObject);
begin
  An := TAnim.Create(Self);
  An.Parent := self;
  Level1 := Level.Create(false);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if An <> nil then
    An.DoMove; // verschiebt die Animation um ein Paar Pixel Richtung Ziel
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Level1.Klick(Point(x,y));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Level1.running := false;
end;

end.
... und das Level (ausgelagert im Thread)
Delphi-Quellcode:
unit2:
procedure Level.Execute;
begin
  { Place thread code here }
  running := true;
  repeat
    Application.ProcessMessages;
  until running = false;
end;

procedure Level.Klick(APoint: TPoint);
begin
  if Walkto(APoint) then showmessage('Angekommen')
  else showmessage('Ziel geändert');
end;

function Level.WalkTo(APoint: TPoint): Boolean;
begin
  synchronize(Ziel(APoint));
  result := false;
  repeat
    Application.ProcessMessages;
    if (Form1.An.Ziel.X <> APoint.X) or (Form1.An.Ziel.Y = APoint.Y) then
    exit;
  until (Form1.An.Left = APoint.X) and (Form1.An.Top = APoint.Y);
  result := true;
end;

procedure Level.Ziel(APoint: TPoint);
begin
  Form1.An.Ziel := APoint;
end;

end.
bekomme dabei aber die Fehlermeldung "Incompatible Types 'TThreadMethod' and 'Procedure'"

Bin ich auf der richtigen Spur? Wie gehts weiter? Was ist der Unterschied zwischen TThreadMethod und Procedure?

Luckie 12. Jan 2004 21:50

Re: Application Processmessages zum bewegen von Charakteren
 
Zitat:

Zitat von MyRealName
Meiner Meinung nach sinnloser Overhead.

Man muss ja nicht das TThread-Objekt der VCL nehmen.

Zitat:

Threads bringen Inkonsistenz ins Programm und 'ne Menge Verwaltungsaufwand (EnterCriticalSection etc.).
Nicht, wenn man weiß was man macht und dies dann noch richtig macht. Kurz eingfach Quatsch deine Aussage. Aber wenn es nach deiner Aussage ginge, dann hätte ich fast nur inkonsistente Anwendungen auf meinem Rechner. :roll:
Und ich weiß, wo von ich rede. ich habe mich mit Threads schon auseinander gesetzt. Tutorial gibt es dazu auf meiner Seite.

Zitat:

Nix geht über das gute alte PostMessage :cheers: SendMessage...
Schön und wenn Code parallel abgearbeitet werden soll?

Flogo 12. Jan 2004 22:04

Re: Application Processmessages zum bewegen von Charakteren
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von MyRealName
Meiner Meinung nach sinnloser Overhead.

Man muss ja nicht das TThread-Objekt der VCL nehmen.

Bitte mach mich jetzt nicht nervös *zuckenimauge* :freak: Jetzt hab ich grad so halb verstanden wie das damit funktioniert und jetzt soll ich sie nicht benutzen?
Zitat:

Zitat von Luckie
Nicht, wenn man weiß was man macht und dies dann noch richtig macht.

und genau da liegt mein Problem (siehe oben)

Luckie 12. Jan 2004 22:05

Re: Application Processmessages zum bewegen von Charakteren
 
Dann kuck dir mal mein Tutorial an.

Flogo 12. Jan 2004 22:19

Re: Application Processmessages zum bewegen von Charakteren
 
@Lukie
Hab noch was älteres von dir gefunden. und habs jetzt auch mal mit globalen Variablen versucht. allerdings hängt er sich jetzt am anfang von synchronize(Ziel) auf. Du hast am ende gesagt "Alles ausgebessert"
Aber wie?
[Edit] Ok habs im Tutorial gesehen was du geändert hast
Mein Code sieht jetzt so aus:
Code:
function Level.WalkTo(APoint: TPoint): Boolean;
begin
  WalkToPoint := APoint; // WalkToPoint = Global im thread deklarierte Variable
  synchronize(Ziel);     // hier bleibt er hängen
// ... Rest wie oben
end;

procedure Level.Ziel;
begin
  Form1.An.SetZiel(WalkToPoint); // Diese Stelle wird nie ausgeführt
end;
[/edit]

Flogo 15. Jan 2004 18:08

Re: Application Processmessages zum bewegen von Charakteren
 
Irgendwie stellt sich mir hier immer öfter die Frage ob ich überhaupt auf dem richtigen weg bin?

Wenn ich nach dem Klick warten will bis die Figur an einer bestimmten Stelle ist, dann muss ich doch das Programm anhalten.
Aber um die Figur zu bewegen muss ich doch gleichzeitig das Programm weiter laufen lassen. Eigentlich sollte das ja das Application.processmessages erledigen, was in einem Testprogramm auch funktioniert. Aber anscheinend will mein Timer nicht mehr anspringen wenn das Prog mal in der Application.PM Schleife hängt

Niko 15. Jan 2004 18:56

Re: Application Processmessages zum bewegen von Charakteren
 
Zitat:

Zitat von Flogo
Wenn ich nach dem Klick warten will bis die Figur an einer bestimmten Stelle ist, dann muss ich doch das Programm anhalten.

Nein, warum das nicht geht hast du ja selbst geschrieben :wink: .

Ich würde folgendes Prinzip nehmen:
Bei Mausklick:
Delphi-Quellcode:
Bewegen := true;
NeuePosition := Mausposition;
In Timer-Ereignis:
Delphi-Quellcode:
if Bewegen = true then
  if NeuePosition <> AktuellePosition then
    AktuellePosition := VerschiebeFigur;
  else
  begin
    Bewegen := false;
    MachWasWennFigurAngekommen;
  end;
wobei VerschiebeFigur die Position zurückgibt, an die die Figur verschoben wurde.

Natürlich lässt sich der Code für das Timer-Ereignis genausogut auch in einen Thread packen. Solange er aber keine umfangreichen Berechnungen anstellt, halte ich das nicht für nötig.

[EDIT=Niko]Wechselstaben verbuchtelt[/EDIT]

Flogo 16. Jan 2004 06:37

Re: Application Processmessages zum bewegen von Charakteren
 
Erstmal vielen Dank für die Hilfe! :thuimb:
Aber ein kleines Problem hab ich immer noch:
Da es bei einem Adventure ja stark davon abhängt wann wohin geklickt wird, habe ich mir eine Klasse TLevel geschrieben und davon die einzelnen Level abgeleitet. Jedes abgeleitete Level ist nacher im Spiel eine Szene und verarbeitet den Klick (Wenn auf die Tür mit dem Cursor "Betritt" geklickt wird -> Lade neues Level)
Da diese Levelprogrammierung eigentlich den Hauptteil des Programms ausmachen wird, wäre es doch irgendwie ungeschickt wenn die Hälfte der Programmierung im Timer steckt. Ich könnte natürlich mit Flags arbeiten und im MachWasWennFigurAngekommen; Abfragen welches Level und welcher Punkt gemeint war, aber auch das stell ich mir unübersichtlich vor.

Zitat:

Zitat von Niko
Natürlich lässt sich der Code für das Timer-Ereignis genausogut auch in einen Thread packen. Solange er aber keine umfangreichen Berechnungen anstellt, halte ich das nicht für nötig.

Wäre das dafür vielleicht eine Lösung? kann ich dann mein "Level" solange anhalten bis der Timer die Figur an eine Stelle gebracht hat? und muß die Figur mit ihrer Bewegen-Methode dann auch in den Thread?

[edit] Tag korrigiert [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
Seite 2 von 3     12 3      

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-2025 by Thomas Breitkreuz