Nachteile von OpenWindowedScreen() bei Spielen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Mauscursor über Windowed screen?

Beitrag von Nalfein »

Ich hab bisher im Vollbild-Modus gearbeitet und immer MouseX und Y benutzt; jetzt hab ich mal getestet, wie viel "langsamer" eines meiner Programme läuft, wenn ich ein Grundgerüst für einen Windowed Screen drum schreibe. Ein paar Zeilen lauffähiges Beispiel in der Hilfe wären nicht schlecht gewesen, hätte etwas Ausprobieren erspart...
Nebenbei: Es IST nicht langsamer!

Dafür habe ich jetzt ein Problem: im Vollbild habe ich immer einen Sprite an MouseX,MouseY angezeigt.
Im Windowed screen stimmen entweder die Koordinaten nicht (wenn man Autostretch auf 1 setzt, was ich natürlich erstmal gemacht habe, wo es sowas schon gibt...) und außerdem habe ich da 2 Mauscursor!
Den von Windows und den, den mein Programm als Sprite anzeigt!
Die Sache mit den Koordinaten ist fast egal; habe erst versucht das mit ner Formel zu kompensieren, die den Unterschied zwischen Fenstergröße und Screengröße berücksichtigt, aber das lief nur entweder, wenn das Fenster frei vergrößerbar ist, oder maximiert; nie zusammen!)
Jetzt hab ich autostretch erstmal auf 0, dann tritt das Problem nicht auf. Eigentlich schade, denn das mit dem Weichzeichnen gefiel mir eigentlich...

Gibts ne Möglichkeit abzufragen, vielleicht mit WindowEvent, ob der Mauscursor auf dem Screen ist (gut, zur Not könnte ich da WindowMouseX<>-1 als Bedingung nehmen...) und wenn ja, kann man den Cursor für die Zeit unsichtbar machen oder solange ausschalten oder sowas?
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

dann mußt du die Fenstermausbefehle nutzen,
dann funzt es einwandfrei.
I´a dllfreak2001
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8814
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Nalfein hat geschrieben:kann man den Cursor für die Zeit unsichtbar machen oder solange ausschalten oder sowas?
Dazu gibt es schon einen Code in der PureArea:

Code: Alles auswählen

; http://www.purearea.net
; Author: Andre Beer / PureBasic Team
; Date: 27. September 2003

If OpenWindow(0,0,0,180,120,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ShowCursor on/off") And CreateGadgetList(WindowID(0))
  TextGadget(0,10,10,160,50,"The mouse cursor is on.")
  ButtonGadget(1,10,80,160,30,"Hide mouse cursor")
  Repeat
    ev.l= WaitWindowEvent()
    If ev = #PB_Event_Gadget
      If EventGadgetID()=1
        ShowCursor_(0)    ; <=== hide the mouse cursor
        SetGadgetText(0,"The mouse cursor is off. Wait 3 seconds, and the cursor will be back...")
        While WindowEvent() : Wend  
        Delay(3000)
        ShowCursor_(1)    ; <=== show the mouse cursor
        SetGadgetText(0,"The mouse cursor is on.")
      EndIf
    EndIf
  Until ev = #PB_Event_CloseWindow
EndIf
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Danke!

Beitrag von Nalfein »

Hab es mal als

Code: Alles auswählen

x=WindowMouseX()
y=WindowMouseY()

if (x<>-1) and (y<>1) ; im WindowedScreen
ShowCursor_(0)
DisplayTransparentSprite(Mauscursor,x,y)
Else ; außerhalb! dummerweise zählt der Fensterrahmen nicht als "außerhalb"... :(
ShowCursor_(1)
EndIf
eingebaut.

Man muß den Cursor zwar recht weit weg von dem Windowed Screen wegbewegen, bevor er wiederkommt (s.o. im Code), aber es geht...
Beim "Wiedereintritt" hat man im rechten Teil des Bildschirms oft für ein paar Sekunden 2 Cursor, aber meist verschwindet der Windows Cursor nach nem Moment und nur der Transparent Sprite wird noch angezeigt.

Gibt's noch ein Argument dagegen, die ShowCursor-Befehle mehr als einmal aufzurufen oder sollte ich noch einbauen, daß er jeden nur einmal ausführt, bis der jeweils andere einmal aufgerufen wurde, so daß es dann wieder Sinn macht, ihn von "zeigen" auf "nicht zeigen" ändern zu lassen?
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Benutzeravatar
Nalfein
Beiträge: 29
Registriert: 22.08.2005 13:14

Erledigt :)

Beitrag von Nalfein »

Hat sich erledigt!

So funktioniert es besser und hat nebenbei alle anderen Probleme gelöst... :) :

Vor der Schleife für Mausabfrage und so...:

Code: Alles auswählen

Zeigen=1
danach in der Schleife:

Code: Alles auswählen


x=WindowMouseX()
y=WindowMouseY()

if (x<>-1) and (y<>1) ; im WindowedScreen
If Zeigen=1
ShowCursor_(0)
Zeigen=0
endif
DisplayTransparentSprite(Mauscursor,x,y)
Else ; außerhalb! dummerweise zählt der Fensterrahmen nicht als "außerhalb"... :(
if Zeigen=0
ShowCursor_(1)
Zeigen=1
endif
EndIf 
Danke für den Code mit "ShowCursor_()"!
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wie kann ich ohne einen Gadget und ohne ExamineMouse ... herausfinden, welcher Kopf gedrückt worden ist?

EventType() liefert immer -1
>> setzt doch einen Gadget voraus, oder?

und irgendwie fehlt mir auch noch ein
Ergebnis=MouseButtonRelease(Mausknopf)


Simple-Aufgabe, aber irgendwie alles doof:

Fenster mit einem #Image
und darauf möchte ich zeichnen.

Wenn es ein ImageGadget ist, liefert mir EventType auch nur bedingt, dass, was ich möchte.

Es macht doch einen Unterschied, ob ich einen Mausknopf drücke und den Zeiger bewege (also Ziehen mit Maus) oder nur einmal Klicke auf einer Stelle.

Und MausX() ist im WindowScreen langsamer als WindowMouseX(Fenster)

Außerdem setzt die Abfrage nach MouseButton, wenn sie true ist, meinen Mauszeiger auf 0,0
>> Was ist das denn?


/:->
Zuletzt geändert von Xaby am 01.01.2007 16:17, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

sieht gut aus.

Für den ButtonRelease muss ich mir dann noch was ausdenken, wird aber wohl gehen :allright:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

flag-contolled.

Code: Alles auswählen

Define MLB    ; MouseLeft Button = corresponding #VK_LBUTTON
Define MLD    ; MouseLeft Down   = while pressed, to registrate changes
Define MLC    ; MouseLeft Click  = first frame when clicked
Define MLU    ; MouseLeft Up     = first frame when released
;...    
    MLB = GetAsyncKeyState_(#VK_LBUTTON) 
    If MLB
      If Not MLD 
        MLD = 1
        MLC = 1
      Else
        MLC = 0
      EndIf
    Else
      If MLD
        MLD = 0
        MLU = 1
      Else
        MLU = 0
      EndIf
    EndIf
sieht jetzt ein bissel kryptisch aus, aber gibt präzise auskunft über zustand und zustandswechsel.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten