Autor Beitrag
Majinor
Hält's aus hier
Beiträge: 7

Win XP, SuSE Linux 8.1
D3 Prof, D6 Pers
BeitragVerfasst: Mo 15.12.03 18:22 
Ahoi leuts,
hab mal wieder (*schnief*) wieder ein Prob mit Glscene. Und zwar geht es um das Auswaehlen mit der Maus. Ich wollte eigentlich folgende methode verwenden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
pick:= (GLFullScreenViewer1.Buffer.GetPickedObject(x, y) as TGLCustomSceneObject);
    if Assigned(pick) then begin
      ShowMessage('You clicked the '+pick.Name);
end;

Naja eigentlich funzt es auch aber ebend nur eigentlich. Denn wenn man auf ein non-3d-Objekt klickt gibt es einen Fehler. (invalid type cast)
Also bei dem gesammten HUD und der 'Maus' (Hab ein TGLCustomControl fuer das Mausbild benutzt) Es kommt also erstmal sofort zum Error da man ja immer das Mausbild unter der maus hat. Und dann kommt es immer zum Fehler wenn ich z.B. auf Menue etc im Hud klicke.

Hat da vllt einer ein paar Tips wie ich das HUD und die Maus fuer die Abfrage ignorieren lassen kann?
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 15.12.03 21:44 
Hmm, in deinerm anderen Thread hatte sich die Frage irgendwie anders angehört...
Jetzt verkompliziert sich das Ganze leider etwas...
Mit der Methode GetPickedObjects() (man achte auf das s am Ende) vom Buffer bekommst du eine Liste aller Objekte in einem bestimmten Area. Dieses wird übergeben mit einem Rect, also nimmst du am besten ein Rect, dessen "Oben-Links"-Koordinate der aktuellen Mausposition entspricht und die "Unten-Rechts"-Koordinate jeweils +1 ist, also ein Rect mit einer Breite und Höhe von jeweils zwei Pixeln (ich weiß nicht, ob es auch klappt, wenn das Rect nur einen Pixel groß ist, unten-rechts und oben-links also die gleichen Koordinaten haben, das kannst du ja leicht ausprobieren).

Dann gehst du die Liste, die von GetPickedObjects() zurückgegeben wird, durch und schaust jeweils, ob das aktuelle Glied der Liste vom Typ TGLBaseSceneObject ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if picklist[i] is TGLBaseSceneObject then
  // juhuu, es ist ein Szenenobjekt
else
  // verdammt, es ist meine Maus

Genauso kannst du auch überprüfen, ob das Objekt ein TGLTerrainRenderer ist, wenn der Anwender versehentlich auf den Boden anstatt auf das Objekt klickt.
Das erste Objekt, das dir über den Weg läuft und ein Szenenobjekt ist (Die Liste ist nach Tiefe von der Kamera aus gesehen sortiert), ist dein gewünschtes Objekt. Das kannst du jetzt typecasten und benutzen.
Aber wenn ich die Dokumentation zur PickList richtig lese, kann sie sowieso nur TGLBaseSceneObjects beinhalten. Das würde bedeuten, daß dein TGLCustomControl gar nicht enthalten ist, aber dein Mauszeiger ist ja nicht das einzige Objekt, es gibt ja noch die HUDSprites, die allesamt TGLBaseSceneObjects sind. Allerdings würde es dann eigentlich keinen Fehler geben, wenn du mit obiger Methode auf ein Menü im HUD klickst, ich weiß ja nicht, ob du das HUD mit den Window-Controls realisiert hast oder mit HUDSprites.
Die entsprechenden Klassen musst du dir dann raussuchen. Wenn alle deine Objekte eine bestimmte (eigene?) Klasse sind, lohnt es sich zum Beispiel zu gucken, ob das Objekt dieser Klasse entspricht, anstatt zu gucken, ob es anderen Klassen nicht entspricht ;-)


War jetzt mit den ganzen Klassen von GLScene ziemlich harter Tobak und ich war vorhin schon müde, ich weiß nicht ob das alles so verständlich ist. Wenn nicht, frag morgen nochmal nach, wenn ich wacher bin... ("I don't like Mondays" The Boomtown Rats)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Majinor Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, SuSE Linux 8.1
D3 Prof, D6 Pers
BeitragVerfasst: Mo 15.12.03 22:47 
Zitat:
Hmm, in deinerm anderen Thread hatte sich die Frage irgendwie anders angehört...
Jetzt verkompliziert sich das Ganze leider etwas..

Lag leider daran weil ich glaubte der Error kaem durch das große terrain. Es lag aber einfach am cursor und ich habs erst gestern um 1600 etwa bemerkt.

Bei dem anderen was du geschrieben hast hab ich teilweise irgendwie netmehr durchgeblickt drum bin ich einfach bei der alten methode geblieben. (getpickedobject ohne s ;) )
Ich hab mir jetzt ein bischen von dem was du geschrieben hast abegugt und jetzt sieht das Pick so aus:
ausblenden Delphi-Quelltext
1:
pick:= (GLFullScreenViewer1.Buffer.GetPickedObject(x-2, y-2));					

Statt TGLCustom. bin ich dann auch auf TGLBase. umgestiegen

Dann hab ich ebend noch n if abfrage gemacht um das HUD und terrain als non-selectable zu machen und nun funzt es :)
Nochmal n thx fuer die tips :)
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 15.12.03 23:55 
Majinor hat folgendes geschrieben:
Bei dem anderen was du geschrieben hast hab ich teilweise irgendwie netmehr durchgeblickt drum bin ich einfach bei der alten methode geblieben. (getpickedobject ohne s ;) )

Erstaunt mich ehrlich gesagt, daß das funktioniert, denn GetPickedObject() liefert AFAIK nur das Objekt, das der Kamera am nächsten ist, alle, die dahinter sind, kann man damit nicht erfassen (falls doch, ist es eigentlich ein Fehler :mrgreen:). D.h., wenn der User auf irgendwas klickt, was nicht erfasst werden soll (z.B. ein HUD-Objekt), dann ist das gepickte Objekt immer dieses HUD-Objekt, selbst wenn du es dann nicht beachtest. Ein Objekt, was dahinterliegt, kannst du nir mit GetPickedObjects() erfassen.

Zitat:
ausblenden Delphi-Quelltext
1:
pick:= (GLFullScreenViewer1.Buffer.GetPickedObject(x-2, y-2));					

Jetzt muss der User aber 2 Pixel daneben klicken :roll:

Zitat:
Dann hab ich ebend noch n if abfrage gemacht um das HUD und terrain als non-selectable zu machen und nun funzt es :)

Wie gesagt, erstunalich, daß es funktioniert user defined image

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert