![]() |
Bild rotieren / bewegen (DelphiX)
Hi ;)
Muss leider schon wieder nerven :( Ich habe nun einen per Suche gefundenen Thread analysiert und versucht bei mir umzusetzen, aber das ganze hat eig. in mehr oder weniger Schwachsinn geendet. Ich glaube das hier ist mehr Theorie und Mathe ;) Naja, es geht darum. Ich will ein Bild anhand einer Richtung bewegen, wobei diese Richtung durch die Pfeiltasten geändert werden kann (Links/Rechts/Vorwärts/Rückwärts). Das Bewegen an sich ist ja kein Problem (mehr). Aber wie, wenn ich das Bild entsprechend rotieren lassen will? Also wenn ich z.B. Rechts drücke, soll sich das ganze um 10° drehen (-10° wäre dann halt bei Links). Ich habe ein Record TPlayer, in dem eine Variable Pos -> TPoint ist (also die Position) und (bisher) eine Variable Richtung und Geschwindigkeit -> Integer. Delphman sei mein Zeuge dass ich nun lange versucht habe, das per Google / DP-Suche rauszufinden, aber nie was halbwegs gutes rausgekommen ist. Wie gesagt, soll für das ganze später DelphiX verantwortlich sein, sprich, ich hatte vor, das ganze mit DrawRotate() zu lösen. Für einen Link / etwas Pseudocode / Beispiele wäre ich sehr dankbar :) air |
Re: Bild rotieren / bewegen (DelphiX)
Wenn DrawRotate ein Bild gedreht zeichnet, musst du doch einfach die momentane Drehung deines Bildes in einer Variablen speichern, und den Wert ändern, wenn du eine Taste drückst. Oder war das nicht dein Problem?
|
Re: Bild rotieren / bewegen (DelphiX)
Naja - aber wie kann ich dann das Bild auch entlang dieser Achse fahren lassen? ;)
|
Re: Bild rotieren / bewegen (DelphiX)
WIe wärs, wenn du deinen Sprite einfach von TImageSpriteEx ableitest und dann DeinSprite.Angle := 45; oder so einstellst?
|
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
x := x + (sin(winkel) * geschwindigkeit); y := y + (cos(winkel) * geschwindigkeit); |
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
Vielleicht hilft es, wenn ich mal meinen Code poste:
Delphi-Quellcode:
Das ist meine Deklarierung des Records.
TPlayer = record // Player
Pos: TPoint; // Position Winkel: Integer; // Richtung Geschwindigkeit: Real; // Geschwindigkeit end; [...] Player: TPlayer; Im OnCreate mach ich folgende Startwerte:
Delphi-Quellcode:
Und meine OnTimer prozedur...hm...ich weiss nicht, was da für evtl. Fehlerbehebung relevant wäre, von daher poste ich sie mal ganz:
Player.Pos.X := 200;
Player.Pos.Y := 550; Player.Winkel := 0; Player.Geschwindigkeit := 0.0;
Delphi-Quellcode:
Ich vermute das Problem in der DrawRotate-Funktion.
if not Form1.DXDraw1.CanDraw then
Exit; if (GetAsyncKeyState(VK_LEFT) < 0) then Dec(Player.Winkel,10); if (GetAsyncKeyState(VK_RIGHT) < 0) then Inc(Player.Winkel,10); if (GetAsyncKeyState(VK_UP) < 0) then Player.Geschwindigkeit := 2; if (GetAsyncKeyState(VK_DOWN) < 0) then Player.Geschwindigkeit := 0; Player.Pos.X := Round(Player.Pos.X + (Sin(Player.Winkel) * Player.Geschwindigkeit)); Player.Pos.Y := Round(Player.Pos.Y + (Cos(Player.Winkel) * Player.Geschwindigkeit)); Form1.DXDraw1.Surface.Fill(0); Form1.DXImageList1.Items.Find('car').DrawRotate(Form1.DXDraw1.Surface, Player.Pos.X, Player.Pos.Y, Form1.DXImageList1.Items.Find('car').Width, Form1.DXImageList1.Items .Find('car').Height, 0, 0.5, 0.5, Player.Winkel ); Form1.DXDraw1.Flip; ich bin ehrlich und gestehe: Ich weiss nicht wofür die 0.5 stehen, waren einfach testwerte (die funktiondsdeklarierung sagt mir CenterX und CenterY) air Edit: Ah, es ist der Drehpunkt...aber auf was muss ich ihn setzn? :?: |
Re: Bild rotieren / bewegen (DelphiX)
Der Drehpunkt sollte in der Mitte des Bildes liegen, also bei 0.5/0.5 - stimmt schon.
Zweitens solltest du herausfinden, was für einen Winkel die Funktion DrawRotate braucht - ich vermute stark, dass das ein Winkel im Bogenmaß ist. In der Computergrafik verwendet man praktisch immer Bogenmaß, und nie Grad zur Winkelangabe. Du solltest daher deinen Player-Record erstmal anpassen:
Delphi-Quellcode:
Wenn du den Winkel änderst, musst du bedenken, dass du hier mit Bogenmaß arbeitest. Wenn du also 10 dazuzählst, wären das schon fast zwei komplette Drehungen! Nimm hier mal kleinere Werte. Einen Winkel kannst du von der Grad-Darstellung nach Bogenmaß umrechnen mit Winkel(in Grad) * (pi/180).
TPlayer = record // Player
Pos: TPoint; // Position Winkel: Single; // Richtung Geschwindigkeit: Single; // Geschwindigkeit end; |
Re: Bild rotieren / bewegen (DelphiX)
Puh...dann informier ich mich jetzt erstmal über Bogenmaß (hat man in der 9. Klasse noch nicht ;) )
air eidt: ach, bogenmaß war doch: 180°: PI 360°: 2*PI oder :?: |
Re: Bild rotieren / bewegen (DelphiX)
Hi,
das Problem hatte ich auch mal. Anscheind kann man mit Oxmyx Methode nicht richtig umrechnen. Ich wundere mich immernoch warum das so ist. Aber so gehts:
Delphi-Quellcode:
Das Sprite muss dabei von TImageSpriteEx abstammen.
X := X + cos256(Angle) * MoveCount;
Y := Y + sin256(Angle) * MoveCount; [edit] Verdammt, schon wieder nicht richtig gelesen. Aber warum machst du das so umständlich? DelphiX liefert dir alles mit, was du dafür brauchst. [/edit] |
Re: Bild rotieren / bewegen (DelphiX)
falls du das bild nicht mit directx drehen möchtest, gehts z.b. so:
Delphi-Quellcode:
für eine pixelgenaue collisonserkennung auf image art, die auch mit gedrehten bitmaps auskommt, hätte ich auch was funktionierendes falls gewünscht.
// dreht ein koordinatensystem ( pixel -> pixel nach angle gedreht )
procedure TransformVirtToReal(virt:Trealpoint; angle:single; var real:Trealpoint); var VirLen,VirAngle:single; RealLen,RealAngle:single; null:Trealpoint; begin //sooo null.X := 0; null.Y := 0; VirLen := abstand(null,virt); // abstand in pixeln von virtueller nullpunkt(virtuell) -> koordinate(virtuell) VirAngle := cortowink(null,virt); // winkel von nullpunkt(virtuell) zu koordinate(virtuell) RealAngle := winkelcalc(VirAngle,angle); // Winkel drehen, das es dem neuen Koordinatensystem entspricht RealLen := VirLen*1; // evtl zoom real.X := cos(cycletorad(RealAngle/360))*RealLen; real.Y := sin(cycletorad(RealAngle/360))*RealLen; end; |
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
(Wäre ich ein Mathematiker, würde ich sicher sagen, dass man "pi" klein schreiben muss. Denn es gibt auch noch ein großes PI-Zeichen, das aber eine völlig andere Bedeutung in der Mathematik hat. ;-)) |
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
|
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
du machst nichts umständlich. ![]() |
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
Wir können es ja mal kurz ausprobieren. Die Geschwindigkeit sei 10 Einheiten. Zuerst will ich nach oben fahren. Der Winkel zum Lot beträgt also 0 Radian: x = sin(0) * 10.0 = 0 y = cos(0) * 10.0 = 10.0 Mein Auto fährt also auf der x-Achse 0 Einheiten nach rechts und auf der y-Achse 10 Einheiten nach oben. Stimmt also. Jetzt mache ich eine 90-Grad-Kurve nach rechts: x = sin(pi/2) * 10.0 = 10.0 y = cos(pi/2) * 10.0 = 0 Mein Auto fährt erwartungsgmäß auf der x-Achse 10 Einheiten nach rechts und auf der y-Achse 0 Einheiten nach oben. Das funktioniert auch für alle anderen möglichen Werte. Das einzige, wo ein Darstellungsfehler auftreten könnte, wäre wenn die DelphiX-Funktion einen anderen Winkel als das Bogenmaß haben will. Wenn man dann einen Winkel im Bogenmaß übergibt, wird die Drehung nicht mit der Fahrtrichtung übereinstimmen. |
Re: Bild rotieren / bewegen (DelphiX)
Hi,
[OT] Ich schreibe in Kürze ein Tut darüber. Suche nach DelphiX in den Tutorials und Kurse. Dort sind bereits 2 Beiträge von mir drin zu DelphiX. Der nächste folgt bald! [/OT] MfG Marc |
Re: Bild rotieren / bewegen (DelphiX)
Zitat:
air p.s.Spider hatte mir vorgeschlagen, im laufe des tages ein kleines beispiel für mich zu machen edit: das beispiel ist bereits da :D |
Re: Bild rotieren / bewegen (DelphiX)
Hi,
ich denke ich werde über das Beispiel ein Tutorial schreiben. Mal sehen. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 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