Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] Dynamische Textur und Kollision (https://www.delphipraxis.net/177373-%5Bandorra-2d%5D-dynamische-textur-und-kollision.html)

nuclearping 3. Nov 2013 15:13

[Andorra 2D] Dynamische Textur und Kollision
 
Hallo,

ich erzeuge ein Sprite, wo das Image zur Laufzeit ein Bitmap, was zwei Ellipsen enthält, zugewiesen bekommt:
Delphi-Quellcode:
function TRenderCore.InitializeBackground: Boolean;
var
  Bmp: TBitmap;
  W, H: Integer;
begin
  try
    with TImageSprite.Create(FSpriteEngine) do
      begin
        CanDoCollisions := TRUE;
        X := 0;
        Y := 0;
        Z := -10000;

        Bmp := TBitmap.Create;
        try
          W := FSpriteEngine.ViewPort.Right - 1;
          H := FSpriteEngine.ViewPort.Bottom - 1;

          Bmp.PixelFormat := pf24Bit;
          Bmp.Width := W;
          Bmp.Height := H;
          Bmp.Canvas.Pen.Color := clBlack;
          Bmp.Canvas.Pen.Width := 2;
          Bmp.Canvas.Brush.Color := clWhite;
          Bmp.Canvas.Brush.Style := bsClear;
          Bmp.Canvas.Ellipse(10, 10, Bmp.Width - 10, Bmp.Height - 10);
          Bmp.Canvas.Ellipse(40, 40, Bmp.Width - 40, Bmp.Height - 40);

          Image := FAssetsImageList.Add('Background');
          with Image do
            begin
              Texture.LoadFromGraphic(Bmp);
              Restore;
            end;

          Width := W;
          Height := H;

          CollisionTester := FPixelCollisionTester;
        finally
          FreeAndNil(Bmp);
        end;
      end;
    Result := TRUE;
  except
    Result := FALSE;
  end;
end;
Das funktioniert soweit auch.

Aber das Problem: Wenn ein Objekt, was innerhalb des Kreises erzeugt wird, bei seiner Bewegung mit dem Begrenzungskreis kollidiert, wird DoCollision in diesem Fall nicht aufgerufen.

Ich denke das wird wohl daran liegen, dass Andorra in dem Fall nicht weiß, was als Kollisionsbereich gelten soll, oder?

Wie kann ich also erreichen, dass er auch für solche dynamisch erzeugten Texturen eine Kollisionserkennung durchführt? So als wenn ich TImageSprite.Image ein Objekt aus einer TAdImageList zuweisen würde?

Danke. :thumb:

nuclearping 4. Nov 2013 11:02

AW: [Andorra 2D] Dynamische Textur und Kollision
 
Ok, hab die Lösung gefunden.

1) TImageSprite aus dem Code oben muss natürlich TBackgroundSprite heissen.

2) Ich muss in TBackgroundSprite.DoMove noch Collision aufrufen.

3) Damit das Sprite im Kreis korrekt mit den Rändern kollidiert (und nicht permanent mit dem ganzen Background-Image), muss man beim Erstellen des Kreises einen Umweg über eine TAdBitmap gehen, der man neben dem eigentlich Bild noch eine Alpha-Maske zuweist. Die korrekte Erstellung einer solchen Maske kann man in den Quellen des ImgListEditors sehen.

So klappts auch mit der Kollision. :thumb:


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