Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra]: Zur Lauzeit erstelle Sprites finden (https://www.delphipraxis.net/124049-%5Bandorra%5D-zur-lauzeit-erstelle-sprites-finden.html)

Spiderpig_GER_15 13. Nov 2008 15:31


[Andorra]: Zur Lauzeit erstelle Sprites finden
 
hi

Ich erstelle zur Laufzeit (OnKlick) ein Sprite:

Delphi-Quellcode:
  TMySprite = class(TImageSpriteEx)
  protected
    procedure DoMove(TimeGap: double); override;
    procedure DoDraw; override;
    //    procedure DoCollision(Sprite: TSprite; var Done: boolean); override;
  public
    Info: String;
    procedure Klick;
    procedure GetInfo(Sender: TObject; var Key: Char);
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;
Delphi-Quellcode:
procedure TForm1.Set_Sprite( XX: Integer; YY: Integer; kind: string );
begin
  with TMySprite.Create( Form1.SpriteEngine ) do
  begin
    X:= get_Location( XX - Form1.Left - 20 ) * 20  + ( 0 - SpriteEngine.X );
    Y:= get_Location( YY - Form1.Top - 40) * 20 + ( 0 - SpriteEngine.Y );
    Z:= 1;
    Image:= ImageList.Find(kind);
    Info:='1';
  end;
end;
Ich müsste doch eigentlich wie folgt nachschauen können ob sich unter dem Cursor eine wie oben erstelle Sprite befindet:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If SpriteEngine.GetSpriteAt(Mouse.CursorPos.x,Mouse.CursorPos.Y) = TMySprite then
  showmessage('geht');
end;
Aber leider geht das nicht... Was soll ich tuen

MfG

Spiderpig

Die Muhkuh 13. Nov 2008 15:44

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Was geht nicht?

Spiderpig_GER_15 13. Nov 2008 15:50

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Delphi-Quellcode:
  If SpriteEngine.GetSpriteAt(Mouse.CursorPos.x,Mouse.CursorPos.Y) = >>>TMySprite<<< then
TMySprite wird nicht angenommen (incompatible types)

aber ich weiß nicht was da stattdessen hinsoll ?!

Die Muhkuh 13. Nov 2008 15:51

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Versuch mal:

Delphi-Quellcode:
If SpriteEngine.GetSpriteAt(Mouse.CursorPos.x,Mouse.CursorPos.Y) is TMySprite then

Spiderpig_GER_15 13. Nov 2008 15:53

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
okay, danke, jetzt ist der fehler weg und das programm lässt sich starten, aber die meldung wird nicht ausgelöst wenn sich so ein sprite unter dem cursor befindet

Looper 13. Nov 2008 15:58

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
und wenn du
Delphi-Quellcode:
If SpriteEngine.GetSpriteAt(Mouse.CursorPos.x,Mouse.CursorPos.Y) <> nil then
eingibst?

Die Muhkuh 13. Nov 2008 15:59

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Er will aber nur auf sein eigenes Sprite reagieren. ;-)

Passen denn die Koordinaten so oder muss man noch ein Offset der Engine dazuaddieren?

Spiderpig_GER_15 13. Nov 2008 16:03

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
also eigentlich dürfe sich nichts verschoben haben, ich probier mal <> aus. einen Moment ;)

Spiderpig_GER_15 13. Nov 2008 16:08

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Also, wenn ich das einfach so schreibe:

Delphi-Quellcode:
  If SpriteEngine.GetSpriteAt(Mouse.CursorPos.x,Mouse.CursorPos.Y) <> nil then
  begin
    showmessage('geht');
  end;
geht das erstmal Blindalrarm los wegen dem meinem Backgroundsprite.

Nehme ich den Background raus, reagiert es wieder nciht. Springt GetSpriteAt vllt nicht TImageSpriteEx an?

Spiderpig_GER_15 13. Nov 2008 16:09

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
hier ist der Quelltext der Funktion GetSpriteAt():

Delphi-Quellcode:
function TSprite.GetSpriteAt(X, Y: integer): TSprite;
var i:integer;
    rect:TAdRect;
begin
  result := nil;
  for i := Items.Count - 1 downto 0 do
  begin
    rect := Items[i].BoundsRect;
    if (X >= rect.Left) and (X <= rect.Right) and
       (Y >= rect.Top) and (Y <= rect.Bottom) then
    begin
      result := Items[i];
      break;
    end;  
  end;
end;
wenn euch das hilft

franktron 13. Nov 2008 16:20

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Hast du den überhaupt deinen Sprite in items hinzugefügt ???

igel457 13. Nov 2008 16:46

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Folgendes sollte gehen:

Delphi-Quellcode:
var
  tmp_sprite: TSprite;
begin
  tmp_sprite := AdSpriteEngine.GetSpriteAt(X, Y);
  if (tmp_sprite <> nil) and (tmp_sprite is TMySprite) then
  begin
    ShowMessage('Buh!');
  end;
@frantron
Die Items werden automatisch in die Liste eingefügt

Spiderpig_GER_15 13. Nov 2008 18:03

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Lala, sorry :oops: :oops:

Es lag daran das die Koordinaten nicht auf Fenster umgerechnet waren.

Jetzt geht es:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If SpriteEngine.GetSpriteAt(X, Y) is TMySprite then
  begin
    showmessage('oops');
  end;
end;

Spiderpig_GER_15 13. Nov 2008 18:08

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Wenn ich schon was zu Sprites und auswählen gefragt hab, könnt ihr mir vielleicht ein weiteres Mal helfen?:

Delphi-Quellcode:
  TMySprite = class(TImageSpriteEx)
  protected
    procedure DoMove(TimeGap: double); override;
    procedure DoDraw; override;
    //    procedure DoCollision(Sprite: TSprite; var Done: boolean); override;
  public
    Info: String; // <=== Da will ich drauf zu greifen wenn ich auf die Sprite geklickt hab!
    procedure Klick;
    procedure GetInfo(Sender: TObject; var Key: Char);
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;
Ich möchte mit diesem Code die Sprite ermitteln auf die ich geklickt habe:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If SpriteEngine.GetSpriteAt(X, Y) is TMySprite then
  begin
    showmessage('oops');
  end;
end;
Und bei showmessage will ich den String Info von TMySprite ausgeben. Wie geht das?
So nicht:

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If SpriteEngine.GetSpriteAt(X, Y) is TMySprite then
  begin
    showmessage(SpriteEngine.GetSpriteAt(X, Y).Info);
  end;
end;
MfG

Spiderpig

bigben37 13. Nov 2008 18:43

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Du musst das Sprite casten:
Delphi-Quellcode:
showmessage((SpriteEngine.GetSpriteAt(X, Y) as TMySprite).Info);

Spiderpig_GER_15 13. Nov 2008 19:18

Re: [Andorra]: Zur Lauzeit erstelle Sprites finden
 
Danke

Funktioniert Superb!

:dp:


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