AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DelphiX DoCollision

Ein Thema von Igotcha · begonnen am 29. Dez 2003 · letzter Beitrag vom 30. Dez 2003
Antwort Antwort
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

DelphiX DoCollision

  Alt 29. Dez 2003, 12:08
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:
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;
Die Routine funktioniert bis auf das Ausblenden des CardSprites

Delphi-Quellcode:
else
   CardSprite.Visible:=false;
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.

Gruß Kay
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#2

Re: DelphiX DoCollision

  Alt 29. Dez 2003, 23:33
Oder anders gesagt, ich möchte ein OnMouseOver für ein Sprite realisieren.
  Mit Zitat antworten Zitat
Haegar

Registriert seit: 10. Dez 2002
Ort: Peitz
319 Beiträge
 
Delphi 7 Professional
 
#3

Re: DelphiX DoCollision

  Alt 30. Dez 2003, 09:54
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
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#4

Re: DelphiX DoCollision

  Alt 30. Dez 2003, 10:08
Zitat von Haegar:
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!
Hmmm, das wäre natürlich eine mögliche Erklärung, aber ich dachte, DoMove löst auch immer ein DoCollision aus - zumindest, wenn im DoMove ein "Collision" steht. Und DoMove wird bei mir ja durch die Spriteengine im Timer ausgelöst.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#5

Re: DelphiX DoCollision

  Alt 30. Dez 2003, 10:35
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:
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;
Im OnTimer steht dann:

Delphi-Quellcode:
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;
Und damit funktioniert es - ob es schön ist und warum es funktioniert, weiß ich nicht.

Gruß Kay
  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 16:22 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