Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra] kleine Rechenprobleme (https://www.delphipraxis.net/118361-%5Bandorra%5D-kleine-rechenprobleme.html)

XXcD 6. Aug 2008 12:33


[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

igel457 6. Aug 2008 17:37

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;

XXcD 6. Aug 2008 17:43

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.

Blup 7. Aug 2008 10:24

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 04:13 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