![]() |
[Andorra] kleine Rechenprobleme
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bin gerade dabei ein Sprite zu bewegen, wenn ich das mit der Maus markiert habe. Das funktioniert auch alles, nur sobald ich ran zoome bewegt sich das Sprite zu schnell. Und wenn ich weiter weg zoome zu langsam. Das Problem habe ich auch soweit gelöst, aber wenn ich jetzt ein Sprite anklicke um es zu verschieben springt es erstmal weg und dann kann ich es richtig schieben. Mir qualmt gerade schon der Kopf und ich hoffe mir kann einer weiterhelfen. Ich komme einfach nicht auf die Lösung :wall: Hier mal der Code:
Delphi-Quellcode:
dx,dy:double;
procedure TForm2.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p:TAdPoint; begin p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y)); Selected := AdSpriteEngine.GetSpriteAt(p.X, p.Y); if (Selected <> nil) and (Selected is TTexture) then begin dx := Selected.X - X; dy := Selected.Y - Y; end; end; procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var p:TAdPoint; i:integer; begin if ssLeft in Shift then begin if (Selected <> nil) and (Selected is TTexture) then begin p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y)); Selected.X := (x + dx) / (1 / AdSpriteEngine.Zoom); Selected.Y := (y + dy) / (1 / AdSpriteEngine.Zoom); end; end; end; Edit: Ich habe auch noch das Programm angehängt zum Testen. Steuerung: Rechte maustaste + Scrollen = Zoom: Linke Maustaste = Sprite auswählen Linke Maustaste + Maus bewegen = Sprite verschieben |
Re: [Andorra] kleine Rechenprobleme
Du verwendest nirgends in deinem Code das errechnete "p". Verwendest du also "p.x" und "p.y" anstatt "x" und "y" sollte es funktionieren.
Hier noch ein Codeausschnitt, wie das mit dem Verschieben normalerweise gemacht wird (ohne Umrechnung):
Delphi-Quellcode:
var
lx, ly: integer; procedure MouseDown(X, Y: integer); begin lx := x; ly := y; end; procedure MouseMove(Shift: TShiftState; X, Y: integer); begin if ssLeft in Shift then begin item.x := item.x + (x - lx); item.y := item.y + (y - ly); lx := x; ly := y; end; end; |
Re: [Andorra] kleine Rechenprobleme
Ne das geht auch nicht.
Ich muss nur irgendwie noch den Zoom mit einrechnen. Sodass mein Sprite direkt unter der Maus bleibt und nicht erst wegspringt. |
Re: [Andorra] kleine Rechenprobleme
Code:
Selected: record
Item: TTexture; {ausgewähltes Objekt} dx, dy: Double; {relative Position zur linken oberen Ecke des Objektes, an der mit der Maus angefasst wurde} end; procedure TForm2.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p: TAdPoint; o: TObject; begin if Button = mbLeft then begin p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y)); o := AdSpriteEngine.GetSpriteAt(p.X, p.Y); if o is TTexture then begin Selected.Item := TTexture(o); Selected.dx := p.x - Selected.Item.X; Selected.dy := p.y - Selected.Item.y; end; end; end; procedure TForm2.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var p: TAdPoint; begin if ssLeft in Shift then begin if Assigned(Selected.Item) then begin p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y)); Selected.Item.X := p.x - Selected.dx; Selected.Item.Y := p.y - Selected.dy; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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