AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Application Processmessages zum bewegen von Charakteren
Thema durchsuchen
Ansicht
Themen-Optionen

Application Processmessages zum bewegen von Charakteren

Ein Thema von Flogo · begonnen am 1. Dez 2003 · letzter Beitrag vom 11. Feb 2004
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#11

Re: Application Processmessages zum bewegen von Charakteren

  Alt 15. Dez 2003, 13:20
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
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#12

Re: Application Processmessages zum bewegen von Charakteren

  Alt 17. Dez 2003, 22:23
Habs immer noch nicht ganz verstanden
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#13

Re: Application Processmessages zum bewegen von Charakteren

  Alt 12. Jan 2004, 22:43
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?
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Application Processmessages zum bewegen von Charakteren

  Alt 12. Jan 2004, 22:50
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.
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 SendMessage...
Schön und wenn Code parallel abgearbeitet werden soll?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#15

Re: Application Processmessages zum bewegen von Charakteren

  Alt 12. Jan 2004, 23:04
Zitat von Luckie:
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* Jetzt hab ich grad so halb verstanden wie das damit funktioniert und jetzt soll ich sie nicht benutzen?
Zitat von Luckie:
Nicht, wenn man weiß was man macht und dies dann noch richtig macht.
und genau da liegt mein Problem (siehe oben)
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Application Processmessages zum bewegen von Charakteren

  Alt 12. Jan 2004, 23:05
Dann kuck dir mal mein Tutorial an.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#17

Re: Application Processmessages zum bewegen von Charakteren

  Alt 12. Jan 2004, 23:19
@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]
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#18

Re: Application Processmessages zum bewegen von Charakteren

  Alt 15. Jan 2004, 19:08
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Application Processmessages zum bewegen von Charakteren

  Alt 15. Jan 2004, 19:56
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 .

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]
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#20

Re: Application Processmessages zum bewegen von Charakteren

  Alt 16. Jan 2004, 07:37
Erstmal vielen Dank für die Hilfe!
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 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]
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz