Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Andorra 2D Border (https://www.delphipraxis.net/118335-andorra-2d-border.html)

XXcD 5. Aug 2008 16:30


Andorra 2D Border
 
Hallo,
ich möchte gerne eine Umrandung um ein Sprite machen.
In AdDraw macht man das ja mit Canvas, diese Eigentschaft gibt es aber leider nicht in Sprites.
Kann mir da vielleicht einer weiterhelfen?

Edit: Hab das jetzt schon gefunden:
Delphi-Quellcode:
TSprite.Engine.Surface.Canvas
Nur funktioniert das nicht so wie ich mir das vorstelle.
Das Rechteck was gezeichnet wird, wird auf die SpriteEnginge gezeichnet.
Es soll aber direkt auf mein Sprite.
Also wenn sich das Sprite verschiebt soll das Rechteck auch über dem Sprite bleiben.

igel457 5. Aug 2008 16:47

Re: Andorra 2D Border
 
Tipp:

TSprite.BoundsRect: Beeinhaltet die aktuellen Bildschirmkoordinaten des Sprites.

XXcD 5. Aug 2008 17:01

Re: Andorra 2D Border
 
Hmm ich habs jetzt so:

Delphi-Quellcode:
    with Selected.Engine.Surface.Canvas do
begin
//Zeichnet eine weiße Linie von (0;0) zu (100;100).
Pen.Color := Ad_ARGB(255,255,255,255);
MoveTo(Selected.BoundsRect.Left,Selected.BoundsRect.Top);
LineTo(Selected.BoundsRect.Left,Selected.BoundsRect.Top+round(Selected.Height));
LineTo(Selected.BoundsRect.Left+round(Selected.width),Selected.BoundsRect.Top+round(Selected.Height));
LineTo(Selected.BoundsRect.Left+round(Selected.width),Selected.BoundsRect.Top);
LineTo(Selected.BoundsRect.Left,Selected.BoundsRect.Top);
end;
Aber wenn ich näher ran Zoome dann funktioniert das nicht mehr, dann ist das Rechteck zu groß.
Gibt keine Funktion die so einen Rahmen automatisch macht?

Edit:
Und wenn ich mein Sprite zu weit nach links ziehe dann sitzt das rechteck auch nicht mehr genau drauf sondern ein wenig nach rechts verschoben.

igel457 5. Aug 2008 17:15

Re: Andorra 2D Border
 
Warum nicht einfach:
Delphi-Quellcode:
with Engine.Surface.Canvas do
begin
  Rectangle(BoundsRect);
  Release;
end;

XXcD 5. Aug 2008 17:22

Re: Andorra 2D Border
 
Kriege ich nur den Fehler Es gibt keine überladene Version die mit Reactangle....
Also kurz ich muss dort einzeln die X, Y, X2 und Y2 Achsen angeben.

Also irgendwas ist da mit dem Zoom nicht ganz richtig, wenn ich zoome dann funktioniert auch AdSpriteEngine.GetSpriteAt(X,Y) nicht mehr so wie es soll.
Wie kann ich das alles umrechnen, dass das mit dem Zoom funktioniert?

igel457 5. Aug 2008 17:29

Re: Andorra 2D Border
 
Wenn du TSpriteEngineEx verwendest, dann gibt es in dieser Klasse eine nette Funktion, die Bildschirmkoordinaten in Mauskoordinaten umändert. Schau einfach mal in die "Bounce" Demo.

XXcD 5. Aug 2008 17:34

Re: Andorra 2D Border
 
So bin gerade drin in der Demo, das hilft mir aber nicht wirklich weiter.
Ich denke aber mal du redest davon:
Delphi-Quellcode:
p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y));
Kannst du mir nicht direkt Code geben, damit ich mein Problem lösen kann?

XXcD 5. Aug 2008 19:22

Re: Andorra 2D Border
 
Ich hab jetzt ne Lösung gefunden:

Delphi-Quellcode:
procedure TTexture.DoDraw;
begin
  if (Selected <> nil) and (Selected is TTexture) then
   begin
     with Engine.Surface.Canvas do
     begin
       Rectangle(BoundsRect);
       Release;
     end;
  end;
 inherited DoDraw;
end;
Das Problem ist der Rahmen wird nicht richtig gezeichnet.
Z.b. wird nur am linken rand ne weiße Linie gezeichnet und wenn ich dann das ganze bild ein wenig bewege dann wird es kommplett angezeigt.
Und noch nen Stückchen bewegen und es wird nur am rechten rand ne Linie angezeigt.

Ich bewege mich durch die Welt so:
Delphi-Quellcode:
var
  p:TAdPoint;
begin
  if ssLeft in Shift then
  begin
begin
    p := AdSpriteEngine.ScreenPointToSpriteCoords(AdPoint(X,Y));
    AdSpriteEngine.X := AdSpriteEngine.X + p.x - lx;
    AdSpriteEngine.Y := AdSpriteEngine.Y + p.y - ly;
    Edit1.Text:=inttostr(round(AdSpriteEngine.X));
    Edit2.Text:=inttostr(round(AdSpriteEngine.Y));
    Lx := p.x;
    Ly := p.y;
end;
end;

igel457 6. Aug 2008 17:30

Re: Andorra 2D Border
 
Rufe "Inherited DoDraw" auf bevor du deinen Rahmen zeichnest. So wird der Rahmen ja von deinem Sprite verdeckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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