Seite 1 von 1

Irrlicht Tastaturabfrage klappt nicht!?

Verfasst: 14.06.2007 16:31
von D4uS1
So, ich weiß das ist viel verlangt, aber ich habe hier einen etwas längeren Code aus der Irrlicht Engine. Bitte sagt mir wo hier mein Fehler ist, dass ich keine Tastaturabfragen machen kann.

Code: Alles auswählen

IncludeFile "IrrlichtWrapper.pbi"
InitIrrlichtWrapperDll()

Define.b Menu, Spiel,  Ladebildschirm, Bildschirm_Geoeffnet, Schatten, Beenden
Define.w Bildschirmbreite, Bildschirmhoehe
Menu = 1
Ladebildschirm = 1
Bildschirmbreite = 1024
Bildschirmhoehe = 768
Schatten = 1

Repeat
 If Bildschirm_Geoeffnet = 0
  IrrStart(#IRR_EDT_DIRECT3D9, Bildschirmbreite, Bildschirmhoehe, #False, Schatten, #True) 
  IrrSetWindowCaption( "Irrlicht Engine" )
  Bildschirm_Geoeffnet = 1
 EndIf
 
  If Ladebildschirm = 1
   If Menu = 1

    Define.b Thema, Terrain_Nummer
    *Taste_Gedrueckt.IRR_KEY_EVENT
    *Kamera_Haupt.IRR_CAMERA
    *Kamer_Haupt_Objekt.IRR_NODE
    *Textur_Himmel.IRR_TEXTURE
    *Terrain.IRR_TERRAIN
    *Terrain_Objekt.IRR_NODE
    *Terrain_Textur.IRR_TEXTURE
    *Terrain_Textur_Detail.IRR_TEXTURE



    *Textur_Himmel = IrrGetTexture("3dArchiv/Himmel.jpg")
    IrrAddSkyDomeToScene( *Textur_Himmel, 30, 30, 3, 3) 
    
    Terrain_Nummer = Random(9)+1
    Thema = Random(2)
     If Thema = 0
      *Terrain_Textur = IrrGetTexture("3dArchiv/Terrain/Minimap_Üppig_" +Str(Terrain_Nummer) +".jpg")
     ElseIf Thema = 1
      *Terrain_Textur = IrrGetTexture("3dArchiv/Terrain/Minimap_Wüste_" +Str(Terrain_Nummer) +".jpg")
     ElseIf Thema = 2
      *Terrain_Textur = IrrGetTexture("3dArchiv/Terrain/Minimap_Schnee_" +Str(Terrain_Nummer) +".jpg")
     EndIf
    *Terrain_Textur_Detail = IrrGetTexture("3dArchiv/Terrain/Terrain_Detail.jpg")
    *Terrain = IrrAddTerrain("3dArchiv/Terrain/Terrain_"+Str(Terrain_Nummer)+".bmp")
    *Terrain_Objekt = *Terrain
    IrrSetNodeScale( *Terrain_Objekt, 40.0, 4.4, 40.0 )    
    IrrSetNodeMaterialTexture( *Terrain_Objekt, *Terrain_Textur, 0 )
    IrrSetNodeMaterialTexture( *Terrain_Objekt, *Terrain_Textur_Detail, 1 )
    IrrScaleTexture( *Terrain, 1.0, 20.0 )
    IrrSetNodeMaterialFlag( *Terrain_Objekt, #IRR_EMF_LIGHTING, #IRR_OFF ) 
    IrrSetNodeMaterialType ( *Terrain_Objekt, #IRR_EMT_DETAIL_MAP )
 
    *Kamera_Haupt = IrrAddCamera(0, 0, 0, 0, 0, 0)
    *Kamera_Haupt_Objekt = *Kamera_Haupt
    IrrSetNodePosition( *Kamera_Haupt_Objekt, 3942.8, 1102.7, 5113.9 )
    IrrSetNodeRotation( *Kamera_Haupt_Objekt, 19, -185.5, 0 )
    IrrHideMouse()
    LadeBildschirm = 0
   ElseIf Spiel = 1
   EndIf
  EndIf
  
  If Menu = 1 And LadeBildschirm = 0
   IrrBeginScene( 240, 255, 255 )
   IrrDrawScene()
   IrrEndScene()
      
  While IrrKeyEventAvailable()
   *Taste_Gedrueckt = IrrReadKeyEvent()
    Select *Taste_Gedrueckt\Key
    Case #IRR_KEY_ESCAPEt
     If *Taste_Gedrueckt\direction = #IRR_KEY_DOWN
      Beenden = 1
     EndIf
    EndSelect 
  Wend
 EndIf
 
Until Beenden = 1
IrrStop()
FreeIrrlichtWrapperDLL()
Danke im Voraus!

Verfasst: 14.06.2007 18:47
von Thalius
Sieht so aus als ob du deinen Pointer zur Keyevenstruktur in deinem Mainloop initialisierst.. das geht natürlich nicht da bei jedem Loop Durchgang der Event wieder überschrieben wird..

EDIT:
Sehe grade du hast da noch n typo ebenfalls - bei:

Code: Alles auswählen

Case #IRR_KEY_ESCAPEt 

Sollte in etwa so aussehen ( nicht kompilierbar - Beispiel! ):

Code: Alles auswählen

; -- Init Irrlicht objects
*BSPMesh.irr_mesh
*BSPNode.irr_node
*camera.irr_camera
*CameraNode.irr_node
*MapCollision.irr_selector
*BitmapFont.irr_font
*ret.irr_selector
*KeyEvent.IRR_KEY_EVENT
*MouseEvent.IRR_MOUSE_EVENT

;- Startup
If Irr3DRequester()
  ;- Load Objects etc
  ;...
  
  ;- Mainloop
  While IrrRunning()
    ; begin the scene, erasing the canvas with sky-blue before rendering
    IrrBeginScene( 240, 255, 255 )
    
    ; while there are key events waiting to be processed
    While IrrKeyEventAvailable()
      ; read the key event out. the key event has three parameters the key
      ; scan code, the direction of the key and flags that indicate whether
      ; the control key or the shift keys were also pressed
      *KeyEvent = IrrReadKeyEvent()
      ; arbitrate based on the key that was pressed
      Select *KeyEvent\key
        Case 37     ; Left Arrow
          ; if the key is going down
          If *KeyEvent\direction = #IRR_KEY_DOWN
            XStrafe = 5
          Else
            If XStrafe = 5
              XStrafe = 0
            EndIf
          EndIf
          
        Case 40     ; Up Arrow
          ; if the key is going down
          If *KeyEvent\direction = #IRR_KEY_DOWN
            ZStrafe = 5
          Else
            If ZStrafe = 5
              ZStrafe = 0
            EndIf
          EndIf
          
        Case 39     ; Right Arrow
          ; if the key is going down
          If *KeyEvent\direction = #IRR_KEY_DOWN
            XStrafe = -5
          Else
            If XStrafe = -5
              XStrafe = 0
            EndIf
          EndIf
          
        Case 38     ; Down Arrow
          ; if the key is going down
          If *KeyEvent\direction = #IRR_KEY_DOWN
            ZStrafe = -5
          Else
            If ZStrafe = -5
              ZStrafe = 0
            EndIf
          EndIf
          
      EndSelect
    Wend
    IrrDrawScene()
    ; end drawing the scene and render it
    IrrEndScene()
  Wend
  
EndIf
End 
Thalius

Verfasst: 14.06.2007 19:38
von D4uS1
Habe den Fehler jetzt gefunden, es lag eineerseits an dem Tippfehler^^, andererseits muss man noch eine Abfrage machen, ob IrrRunning() = 1 ist, dann funktioniuerts. Also um das rendern und die Abfrage einfach einen If Operator ziehen. Trotzdem Danke!