Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Jetzt aber: Rotierte bewegung (https://www.delphipraxis.net/45582-jetzt-aber-rotierte-bewegung.html)

Airblader 8. Mai 2005 19:21


Jetzt aber: Rotierte bewegung
 
Hiho,

da ich damals vielleicht noch etwas wenig Mathe konnte, wollte ich nun alles neu anpacken:
Das "rotierte" Zeichnen und Bewegen von Dingen wie Autos etc.
Hab zwar bis heute keinen Kosinus, Sinus oder sonstwas gehabt, aber nun hab ichs zumindest mal hinbekommen.

Ein "Fehler" hat es aber noch:
Wenn ich den Spieler bewege, sieht das immer so abgehackt aus.
Kann man das nicht irgendwie ändern?

Ich gehe wie folgt vor:
Ich hab einen DXTImer, in dem per GetAsyncKeyState auf Links/Rechts geprüft wird und die Variable "PAngle" dementsprechend +/- 0.02 gesetzt wird.
Meine Prozedur zum neu-Berechnen und Zeichnen sieht wie folgt aus:

Delphi-Quellcode:
procedure TForm1.Draw;
begin
        if not Form1.DXDraw1.CanDraw then
                Exit;

        PPos.X := Floor(PPos.X + (sin(PAngle) * 1.5));
        PPos.Y := Floor(PPos.Y - (cos(PAngle) * 1.5));

        Form1.DXDraw1.Surface.Fill(0);

        Form1.DXImageList1.Items.Find('Player').DrawRotate(Form1.DXDraw1.Surface, PPos.X, PPos.Y, 10, 10, 0, 0.5, 0.5, Floor(PAngle));

        Form1.DXDraw1.Flip;
end;
PPos ist ein TPoint und PAngle ein Extended.

Wie gesagt, das alles funktioniert zwar, ist aber sehr abgehackt.
What do do?

Danke schonmal

air
P.S.: Das alles ist nur ein Testprojekt für mich, also noch nicht so sehr darauf achten, dass ich das nicht in ein record packe oder so :stupid:

stefan2005 8. Mai 2005 19:31

Re: Jetzt aber: Rotierte bewegung
 
hi,
brauchen die sin() und cos() Funktionen nicht das Bogenmaß anstatt den Winkel als Parameter ?

cu,
stefan2005

Airblader 8. Mai 2005 19:33

Re: Jetzt aber: Rotierte bewegung
 
Zitat:

Zitat von stefan2005
hi,
brauchen die sin() und cos() Funktionen nicht das Bogenmaß anstatt den Winkel als Parameter ?

cu,
stefan2005

Hatte mir das auch schon gedacht.
Hab also sowohl DegToRad als auch RadToDeg probiert.

DegToRad:
---------
Gehtr garnimmer links/rechts

RadToDeg:
---------
Nervöses Zuckeln im Quadrat ;)

Edit:
Oh..RadToDeg stimmt wohl. Nur 0.02 is dafür viel zu hoch.

Werds nochmal testen

Edit2: ok..scheint zu gehen.
Aber woran liegt es, dass wenn ich z.b. links gedrückt halte, keine kreisförmige Bahn entsteht sondern mehr so in eine Richtung gezogene Spirale?

Edit3: Sorry *g*
Kleine Zwischenfrage.
Ich mach grade die Kollisionsabfrage für die Wände.
Für links/rechts (X-Achse) funzt es gut, indem ich PAngle auf -PAngle setze.
Aber wie sieht es für die Y-Achse aus? Hab auch versucht, 180° abzuziehen / zu addieren

Airblader 9. Mai 2005 20:29

Re: Jetzt aber: Rotierte bewegung
 
*push*

Die Frage bleibt, wie ich den Winkel beim Abprallen an der Y-Achse ändern muss.

Habe schon ziemlich viel probiert :|

Das Problem, einfach einen Winkel zuzufügen/abzuziehen ist ja, dass der Winkel ja nicht In Grad gegeben ist.
D.h. von 90 zu 90, 5 ist das vllt schon eine ganze Umdrehung.

Habe morgen vor, meinen Mathelehrer zu fragen, mir mal einen Crashkurs in Trigonometrie zu geben.

Aber könnte mir trotzdem jemand helfen? :stupid:

air

Chegga 9. Mai 2005 20:40

Re: Jetzt aber: Rotierte bewegung
 
Hi,

Zitat:

Zitat von Airblader
Ein "Fehler" hat es aber noch:
Wenn ich den Spieler bewege, sieht das immer so abgehackt aus.
Kann man das nicht irgendwie ändern?

Wenn du nur gerade Bewegungen (also ohne Hindernis z.B.) brauchst,
verwende doch den Satz von Pythagoras. :wink:
(Den kannst du ja hoffentlich. :angel2: )

MfG Marc

P.S.: Sorry, wenn ich jetzt deinen bisherigen Code völlig verändere.
:duck:

Khabarakh 9. Mai 2005 20:51

Re: Jetzt aber: Rotierte bewegung
 
@Chegga: Beim Drehen der Figur mit den Pfeiltasten könnte es dann aber etwas schwer werden :wink: .

@Airblader: Also der Nebenwinkel im Bogenmaß?
Delphi-Quellcode:
Alpha := Pi - Alpha

Airblader 9. Mai 2005 21:08

Re: Jetzt aber: Rotierte bewegung
 
Naja..langsam wird alles merkwürdiger.

Mal eine Info:
Der Winkel muss nichtmal um 1 geändert werden um eine vollständige Drehung zu erhalten.

Stimmt denn die Rechnung für die neuen Positionen überhaupt?

Delphi-Quellcode:
PPos.X := Floor(PPos.X + (sin(RadToDeg(PAngle)) * 3.5));
PPos.Y := Floor(PPos.Y - (cos(RadToDeg(PAngle)) * 3.5));
@Khabarakh
Wenn ich
PAngle := PI - PAngle;

setze, funzt es auch nicht


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 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