![]() |
DelphiX DoCollision
Hallo zusammen,
ich möchte bei der Mausberührung mit einem Sprite eine zusätzliche grafische Information in Form eines weiteren Sprites am Bildschirm anzeigen - befindet sich der Mauscursor nicht mehr auf dem Sprite soll die Zusatzinformation ausgeblendet werden. Warum funktioniert folgender Code nicht? CardSprite ist das Sprite, welches ein situationsabhängiges Bild zusätzlich anzeigt.
Delphi-Quellcode:
Die Routine funktioniert bis auf das Ausblenden des CardSprites
procedure TACard.DoCollision(Sprite: TSprite; var Done: Boolean);
begin inherited; if Sprite is TCursorSprite then begin //beep; frmMain.DXSCARD.Items.Clear; frmMain.DXSCARD.Items.Add; frmMain.DXSCARD.Items[0].Picture.loadfromfile(MYPFAD+fed+'\small\'+fnummer+'.jpg'); frmMain.DXSCARD.Items[0].Name:='scard'; frmMain.DXSCARD.Items.Restore; CardSprite.Image :=frmMain.DXSCARD.Items.Find('scard'); CardSprite.Width:=90; CardSprite.Height:=127; CardSprite.X:=50; CardSprite.Y:=300; CardSprite.Visible:=true; end else CardSprite.Visible:=false; end;
Delphi-Quellcode:
wunderbar, denn nach einer ersten Collision ist CardSprite immer sichtbar. Es werden auch korrekt die Bilder geladen, nur bekomme ich, wenn sich die Maus nicht über einem TACard-Objekt befindet, das Sprite nicht unsichtbar.
else
CardSprite.Visible:=false; Gruß Kay |
Re: DelphiX DoCollision
Oder anders gesagt, ich möchte ein OnMouseOver für ein Sprite realisieren.
|
Re: DelphiX DoCollision
ich bin mir jetzt nicht sicher, aber ist es möglich das diese prozedur beim verlassen (keine Kollision) gar nicht erst aufgerufen wird?
dann wäre es auch logisch, das er niemals in den "else-block" gelangt! ciao haegar |
Re: DelphiX DoCollision
Zitat:
|
Re: DelphiX DoCollision
Also ich habe jetzt eine Lösung gefunden, verstehe sie aber nicht ;-)
Ich habe eine neue Variable bShowCardSprite eingeführt, welche im DoCollision wie folgt gesetzt wird:
Delphi-Quellcode:
Im OnTimer steht dann:
procedure TACard.DoCollision(Sprite: TSprite; var Done: Boolean);
begin inherited; if (Sprite = MouseCursor) AND (Done<>true) then begin //beep; frmMain.DXSCARD.Items.Clear; frmMain.DXSCARD.Items.Add; frmMain.DXSCARD.Items[0].Picture.loadfromfile(MYPFAD+fed+'\small\'+fnummer+'.jpg'); frmMain.DXSCARD.Items[0].Name:='scard'; frmMain.DXSCARD.Items.Restore; CardSprite.Image :=frmMain.DXSCARD.Items.Find('scard'); CardSprite.Width:=90; CardSprite.Height:=127; CardSprite.X:=50; CardSprite.Y:=300; CardSprite.Visible:=true; bShowCardSprite:=true; Done:=true; end else bShowCardSprite:=false; end;
Delphi-Quellcode:
Und damit funktioniert es - ob es schön ist und warum es funktioniert, weiß ich nicht.
procedure TfrmMain.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin try DXDraw1.Surface.Fill( clwhite ); ProcessGamestate; if bShowCardSprite=false then CardSprite.Visible:=false; DXSpriteENgine1.Dead; DXSpriteEngine1.Move(2); DXSpriteEngine1.Draw; except dxtimer1.Enabled:=false; messagedlg('An error has occurred',mterror,[mbok],0); end; dxdraw1.Flip; end; Gruß Kay |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 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