![]() |
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 |
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: |
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:
... und das Level (ausgelagert im Thread)
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.
Delphi-Quellcode:
bekomme dabei aber die Fehlermeldung "Incompatible Types 'TThreadMethod' and 'Procedure'"
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. Bin ich auf der richtigen Spur? Wie gehts weiter? Was ist der Unterschied zwischen TThreadMethod und Procedure? |
Re: Application Processmessages zum bewegen von Charakteren
Zitat:
Zitat:
Und ich weiß, wo von ich rede. ich habe mich mit Threads schon auseinander gesetzt. Tutorial gibt es dazu auf meiner Seite. Zitat:
|
Re: Application Processmessages zum bewegen von Charakteren
Zitat:
Zitat:
|
Re: Application Processmessages zum bewegen von Charakteren
Dann kuck dir mal mein Tutorial an.
|
Re: Application Processmessages zum bewegen von Charakteren
@Lukie
Hab ![]() Aber wie? [Edit] Ok habs im Tutorial gesehen was du geändert hast Mein Code sieht jetzt so aus:
Code:
[/edit]
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; |
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 |
Re: Application Processmessages zum bewegen von Charakteren
Zitat:
Ich würde folgendes Prinzip nehmen: Bei Mausklick:
Delphi-Quellcode:
In Timer-Ereignis:
Bewegen := true;
NeuePosition := Mausposition;
Delphi-Quellcode:
wobei VerschiebeFigur die Position zurückgibt, an die die Figur verschoben wurde.
if Bewegen = true then
if NeuePosition <> AktuellePosition then AktuellePosition := VerschiebeFigur; else begin Bewegen := false; MachWasWennFigurAngekommen; end; 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] |
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:
[edit] Tag korrigiert [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr. |
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