Seite 25 von 35
Verfasst: 13.12.2007 08:59
von neotoma
Hallo tft !
Es gibt 2 Möglichkeiten mit dem Wraper Events abzufangen.
1. Wie in den meisten Beispielen (z.B. 14_Example_KeyboardAndMouse.pb) vorhanden, mittels IrrReadKeyEvent(). Da werden die Events von einem Eventhandler in eine Queue gepackt, und mittels der Funktionen wiedr ausgelesen.
2. (bessere) Man kann einen eigenen eventReceiver Schreiben. (z.B. wie in 30_Example_ImageGui.pb). Das ist nicht wesentlich schwieriger als bisher, nur das man jetzt sämtliche Events sofort bekommt.
Und zur Frage wg. nutzen des PB-Screens. Ja, das geht.
Dafür gibt es die Funktion IrrStartEx(), die als letzten parameter ein Window-Handle akzeptiert. Also erst das PB-Windowd öffnen, dann den Screen, und dann mit IrrStartEx() als letzten Parameter den Window-Handle (z.B. WindowID(0) ) übergeben.
Mike
tft hat geschrieben:Hallo ...
coole Wrapper... habe eine Frage. Ich bekomme bei den IrrMouse und IrrKey Events, immer nur den Hit state. Nie den down state. Bei Tasten gibt es nach einer kleinen Pause nur Repeatet Keys, 200 ms. Ich brauche aber den Status von Tastatur und Mouse key unmittelbar. Kann man die Abfrage Intervalle einstellen, oder fileicht das Irrlicht Fenster auf ein Pure Fenster/Screen umlenken. Damit die Pure Mouse und Tasttatur abfrage verwendet werden kann. Die funktionieren ja nur mit geöffneten Fenster/Screen.
MfG TFT
Verfasst: 13.12.2007 19:33
von tft
Hallo ..
danke für die schnelle antwort. Ich werde beide methoden ausprobieren.
MfG TFT
Verfasst: 13.12.2007 20:23
von tft
Hi ...
also die sache mit dem Event Reciver funktioniert bei mir garnicht. Weder das beispiel noch ein Code snipe. Wenn ich den ProcedureDLL teil übernehme
dann bekomme ich immer beim ProcedureReturn einen fehler.
Verfasst: 13.12.2007 22:14
von neotoma
tft hat geschrieben:Hi ...
also die sache mit dem Event Reciver funktioniert bei mir garnicht. Weder das beispiel noch ein Code snipe. Wenn ich den ProcedureDLL teil übernehme
dann bekomme ich immer beim ProcedureReturn einen fehler.
Sorry !
Da ist der Fehler in der Doku/Example (?).
Es muss eine ProcedureC sein :
Code: Alles auswählen
ProcedureC _Game_Events(*event.SEvent)
If *event\EventType = #IRR_EET_KEY_INPUT_EVENT
key.l = *event\KeyEvent\key
Select key
Case #IRR_KEY_F9
IrrSaveScreenshot("./game.bmp")
EndSelect
EndIf
ProcedureReturn #True
EndProcedure
Erstellt wird der EventReceiver so :
Code: Alles auswählen
;Create our own Event-Receiver
*Game_ER.l = IrrCreateEventReceiver(@_Game_Events())
Und so wird er in Irrlicht gesetzt (damit er auch events bekommt) :
MIke
Verfasst: 14.12.2007 20:57
von tft
Hallo ....
also nun funktioniert die CallBack Rutine zwar. Aber die abfrage kommt immernoch verzögert. Einer eine Idee woran das liegen kann. Es muss doch die möglichkeit geben Tastatur und MouseTasten direckt abzufragen. Bei PB Windows funktioniert das doch auch.
Verfasst: 14.12.2007 22:31
von tft
Hallo ..
so... habe das Problem jetzt selber gefunden. Da ich von B3D stark beeinflust bin. Habe ich völlig vergessen wie das mit den EVENTS funktioniert. Es gibt getrennte Nachrichten für KeyUp und KeyDown. Darauf muss man achten und dann die KeyStates selber definieren.
BRETBRETBRETBRET ..........
MfG TFT
Verfasst: 15.12.2007 22:22
von tft
Hallo...
je weiter ich mich in Irrlicht einarbeite. Je besser finde ich das teil. Jetzt stosse ich aber auf ein Problem. Ich möchte selber bestimmen welche Nods in welcher reihenfolge gezeichnet werden.
Ich möchte das eine immer im hintergrund gerendert wird. Und andere davor. Und der rest in abhängigkeit ihrer entfernung.
Verfasst: 17.12.2007 12:42
von neotoma
tft hat geschrieben:Hallo...
je weiter ich mich in Irrlicht einarbeite. Je besser finde ich das teil. Jetzt stosse ich aber auf ein Problem. Ich möchte selber bestimmen welche Nods in welcher reihenfolge gezeichnet werden.
Ich möchte das eine immer im hintergrund gerendert wird. Und andere davor. Und der rest in abhängigkeit ihrer entfernung.
Hi tft,
das ist nicht ganz 'trivial'. Aber auch nicht unmöglich. Doch bevor wir die tiefen der engine ausloten, würde ich gerne wissen wofür Du das benötigst. Wenn Du z.B. ein HUD (Head-Up-Display) darstellen willst, dann gibt es dafür auch andere Möglichkeiten (Man kann auch proma 2D mit Irrlicht nutzen. Und im wrapper ist sogar ein Animator dafür vorhanden...)
Wenn Du nun aber der Engine ins Handwerk 'pfuschen' willst

- btw: im normalfall ist es natürlich die Aufgabe der Engine die richtige Reihenfolge zu bestimmen.
Okay - die einfachste Methode ist natürlich mit 2 Renderzyklen zu arbeiten, im ersten ist da 'obenliegende' disbaled, und im zweiten allen anderen..... (am besten mit eine 'hierarichischen Node-Struktur arbeiten, dann musst Du nur das Parent disablen')
Gruß,
Mike
Verfasst: 17.12.2007 19:58
von tft
Hallo ...
Zwei mal Rendern ist zwar nicht schlimm. Aber wie sage ich Irrlicht das er beim Zweiten Rendern nicht den ZBuffer löscht. In den Camera Optionen habe ich nichts gefunden.
Die sache mit der Node reihenfolge ist für bestimmte tricks nötig. Wenn zum beispiel der Raum durch den ZBuffer in der Tiefe begrenzt ist. Kann man durch geschicktes Arbeiten mit Scale und Node reihenfolge, einen fiel Teiferen Raum darstellen. Ich brauche konkret eine Mesh das den Sternen hintergrund darstellt. Das mesh ist aus etwa 32000 Planes mit einer TExture 2*2. Nun kann ich wegen der unterschiedlichen Grafikkarteneigenschafften die Planes nicht 200000 einheiten in die Tiefe versetzten. Da sonst der rechenaufwand durch die benötigte grössere Scalierung ins bodenlose fällt. Wenn das Mesh aber nur 10 Einheiten im Radius hat. Dafür aber immer als erstes gerendert wird. Geht es schnell und siet toll aus. Dann sind da natürlich noch die Planeten ... (SPACEGAME) Um ein einigermassen echtes ausssehen und noch dazu das Landen auf demselben zu realisieren. Benötige ich eine Sphere von mindestens 1000000 einheiten durchmesser. Das gibt ganz eklige Rechenfehler auf dem Bildschirm. Aber eine Sphere mit 1000 Durchmesser und in der reihenfolge gleich nach dem Sternen Mesh plaziert. Wirkt erstaunlich echt. Die restlichen objecte können normal dargestellt werden. Da ihre entfernung sowiso durch ein Object LOD gesteuert wird.
In der hoffnung dir etwas mer Klarheit zu meinen Ziehlen zu gewären.
TFT
Verfasst: 17.12.2007 20:14
von tft
Hallo ..
und wenn wir schon mal beim palavern sind ... warum wird bei folgendem Code Abschnitt die Node nicht verschoben.
Code: Alles auswählen
AddElement(obj_liste())
obj_liste()\obj = IrrAddMeshToScene( *Mesh )
IrrSetNodeScale(obj_liste()\obj,0.01,0.01,0.01)
IrrSetNodeMaterialTexture( obj_liste()\obj, *stone_texture, 0 )
IrrSetNodeMaterialFlag( obj_liste()\obj, #IRR_EMF_LIGHTING, #IRR_OFF )
IrrSetNodePosition(obj_liste()\obj,0,0,0)
IrrSetNodeRotation(obj_liste()\obj,Random(360),Random(360),Random(360))
IrrMoveNodeForward(obj_liste()\obj,-150)
Der MoveForward sollte eigentlich das object in Blickrichtung um 150 Verschieben. Aber es bleibt immer im Zentrum 0,0,0 .