WindowedScreen und seltsames Mausverhalten

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

WindowedScreen und seltsames Mausverhalten

Beitrag von Christian »

Hallo,

ich fuchse mich gerade etwas in die Grafik-Befehle von PureBasic hinein und bin nun schon zu Beginn auf ein seltsames Verhalten gestoßen, welches ich nicht deuten kann. Vielleicht kann mir ja einer von euch etwas "Starthilfe" geben. Beim Anlegen großer "Windowed Screens", welche (fast) den gesamten Desktop einnehmen, zeigt meine Maus ein seltsames Verhalten. Sobald ich die Maus über das obere Drittel des Screen-Fensters bewege, verschwindet diese. Fahre ich aus diesem Bereich des Fenster heraus, in das zweite Drittel des Fensters, so taucht sie wieder auf. Bisher habe ich keinen Fehler im Quellcode gefunden und kann mir dieses seltsame und extrem störende Verhalten nicht erklären.

Hier einmal der Code, den ich zum Testen verwendet habe und bei dem dieser Fehler (auf meinem Rechner) auftaucht:

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    End
EndIf

If InitSprite3D() = 0
    MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
    End
EndIf



; - Desktop untersuchen
ExamineDesktops()

; - Fenster öffnen
hWnd = OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0) - 30, "Sprite3D", #PB_Window_BorderLess)

; - einen Screen im Fenster öffnen
If hWnd <> 0 And OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)

  ; - Hauptschleife 
  Repeat

    ; - normale Fenster-Ereignisse abfragen
    Repeat

      ; - letztes Ereignis
      Event = WindowEvent()
      
      ; - wenn letztes Ereignis ...
      Select Event 

        ; - wenn Taste losgelassen
        Case #WM_KEYUP

          ; - wenn ESCAPE gedrückt wurde
          If EventwParam() = #VK_ESCAPE
              
              ; - Statusvariable setzen: Programm beenden
              TerminateProgram = #True
              
          EndIf

        
        Case #PB_Event_CloseWindow
          End 

      EndSelect

    Until (Event = 0 Or TerminateProgram = #True)





    ; - Buffer vertauschen und auf dem Hintergrund-Buffer zeichnen
    FlipBuffers()

    ; - Screen leeren, d.h. mit schwarz überzeichnen
    ClearScreen(RGB(0, 0, 0))

    ; - eine Millisekunde warten
    Delay(1)

  Until TerminateProgram = #True

EndIf

End 
Kann einer von euch darin einen Fehler entdecken? Oder tritt der oben beschriebene Darstellungsfehler bei euch überhaupt auch auf?

Vielen Dank schoneinmal!

Grüße,
Christian
Zuletzt geändert von Christian am 04.03.2010 12:43, insgesamt 1-mal geändert.
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: WindowedScreen und seltsames Mausverhalten

Beitrag von Lord »

Außer der Tatsache, daß statt WaitWindowEvent() WindowEvent
verwendet wurde, so daß der Rechner kaum ansprechbar ist,
passiert da bei mir nichts außergewöhnliches.
Da verschwindet nichts.
Bild
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Re: WindowedScreen und seltsames Mausverhalten

Beitrag von Christian »

WaitWindowEvent kann ich hier ja nur schlecht verwenden, da sonst die Grafik-Befehle alle samt nicht ausgeführt würden, solange kein Ereignis auftritt. Es muss hier also WindowEvent() sein.
Wie meinst du das, dass der Rechner kaum ansprechbar ist? Verursacht obiger Code eine zu hohe CPU-Auslastung bei dir? Könnte daran liegen, dass ich ein Delay() vergessen habe. Ich füge es oben mal ein ...

Dass der andere Fehler bei dir nicht auftritt ist schonmal seltsam. Dann liegt es vermutlich an meinem Rechner ... allerdings verstehe ich nicht warum. Was für ein Betriebssystem nutzt du?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: WindowedScreen und seltsames Mausverhalten

Beitrag von Kaeru Gaman »

bei mir treten keine Anomalien auf.

ich habe mir trotzdem mal die Freiheit genommen, ein paar Falten auszubügeln:

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    End
EndIf

If InitSprite3D() = 0
    MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
    End
EndIf

; - Desktop untersuchen
ExamineDesktops()

; - Fenster öffnen
hWnd = OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "Sprite3D", #PB_Window_BorderLess | #PB_Window_Maximize )

; - einen Screen im Fenster öffnen
If hWnd <> 0 And OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)

  ; - Hauptschleife
  Repeat
    ; - normale Fenster-Ereignisse abfragen
    Repeat
      Event = WaitWindowEvent(10)
      Select Event
        Case #PB_Event_CloseWindow
          TerminateProgram = #True
      EndSelect
    Until (Event = 0 Or TerminateProgram = #True)

    ExamineKeyboard()

    If KeyboardPushed( #PB_Key_Escape )
      TerminateProgram = #True
    EndIf


    ; - Screen leeren, d.h. mit schwarz überzeichnen
    ClearScreen(RGB(0, 0, 0))

    ; - Buffer vertauschen und auf dem Hintergrund-Buffer zeichnen
    FlipBuffers()

  Until TerminateProgram = #True

EndIf

End
1. WaitWindowEvent mit TimeOut statt WindowEvent und Delay
2. Tastaturabfrage über DX-Lib, wenn du schon InitKeyboard benutzt
3. Erst löschen, dann zeichnen, dann flippen.

und als Beispiel mal die Taskleiste weggenommen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Re: WindowedScreen und seltsames Mausverhalten

Beitrag von Christian »

OK, dann liegt es wohl an meiner Hardware. Die Nutzung von WaitWindowEvent und einem größeren Timeout hat schonmal den Effekt gebracht, dass die Maus im oberen Fenster-Drittel nicht mehr verschwindet, sondern nur noch flackert. Werde mal noch ein wenig herumprobieren ...

Dann danke ich euch erstmal für's testen und Kaeru Gaman für die hilfreichen Tipps!

Grüße,
Christian
Antworten