AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [Andorra] kleine Rechenprobleme
Thema durchsuchen
Ansicht
Themen-Optionen

[Andorra] kleine Rechenprobleme

Ein Thema von XXcD · begonnen am 6. Aug 2008 · letzter Beitrag vom 7. Aug 2008
Antwort Antwort
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#1

[Andorra] kleine Rechenprobleme

  Alt 6. Aug 2008, 13:33
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

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
Angehängte Dateien
Dateityp: rar map_editor_104.rar (301,8 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: [Andorra] kleine Rechenprobleme

  Alt 6. Aug 2008, 18:37
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;
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#3

Re: [Andorra] kleine Rechenprobleme

  Alt 6. Aug 2008, 18:43
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#4

Re: [Andorra] kleine Rechenprobleme

  Alt 7. Aug 2008, 11:24
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:42 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