AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bild rotieren / bewegen (DelphiX)
Thema durchsuchen
Ansicht
Themen-Optionen

Bild rotieren / bewegen (DelphiX)

Ein Thema von Airblader · begonnen am 3. Jan 2005 · letzter Beitrag vom 4. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#1

Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 18:48
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
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#2

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 19:07
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?
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#3

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 19:12
Naja - aber wie kann ich dann das Bild auch entlang dieser Achse fahren lassen?
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Elite
(Gast)

n/a Beiträge
 
#4

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 19:17
WIe wärs, wenn du deinen Sprite einfach von TImageSpriteEx ableitest und dann DeinSprite.Angle := 45; oder so einstellst?
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#5

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 19:22
Zitat von Airblader:
Naja - aber wie kann ich dann das Bild auch entlang dieser Achse fahren lassen?
Na einfach mit ein bisschen Trigonometrie.

x := x + (sin(winkel) * geschwindigkeit);
y := y + (cos(winkel) * geschwindigkeit);
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#6

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 19:38
Zitat von Oxmyx:
Zitat von Airblader:
Naja - aber wie kann ich dann das Bild auch entlang dieser Achse fahren lassen?
Na einfach mit ein bisschen Trigonometrie.

x := x + (sin(winkel) * geschwindigkeit);
y := y + (cos(winkel) * geschwindigkeit);
Hm...es fährt...aber Kreuz und Quer.
Vielleicht hilft es, wenn ich mal meinen Code poste:

Delphi-Quellcode:
TPlayer = record // Player
  Pos: TPoint; // Position
  Winkel: Integer; // Richtung
  Geschwindigkeit: Real; // Geschwindigkeit
end;

[...]

Player: TPlayer;
Das ist meine Deklarierung des Records.

Im OnCreate mach ich folgende Startwerte:

Delphi-Quellcode:
Player.Pos.X := 200;
Player.Pos.Y := 550;
Player.Winkel := 0;
Player.Geschwindigkeit := 0.0;
Und meine OnTimer prozedur...hm...ich weiss nicht, was da für evtl. Fehlerbehebung relevant wäre, von daher poste ich sie mal ganz:

Delphi-Quellcode:
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 vermute das Problem in der DrawRotate-Funktion.

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?
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#7

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 20:32
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:
TPlayer = record // Player
  Pos: TPoint; // Position
  Winkel: Single; // Richtung
  Geschwindigkeit: Single; // Geschwindigkeit
end;
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).
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#8

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 20:43
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
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 20:47
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:
X := X + cos256(Angle) * MoveCount;
Y := Y + sin256(Angle) * MoveCount;
Das Sprite muss dabei von TImageSpriteEx abstammen.


[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]
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Bild rotieren / bewegen (DelphiX)

  Alt 3. Jan 2005, 20:47
falls du das bild nicht mit directx drehen möchtest, gehts z.b. so:

Delphi-Quellcode:
// 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;
für eine pixelgenaue collisonserkennung auf image art, die auch mit gedrehten bitmaps auskommt, hätte ich auch was funktionierendes falls gewünscht.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:43 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