Nachteile von OpenWindowedScreen() bei Spielen
Mauscursor über Windowed screen?
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?
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 !!!
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
- 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
Dazu gibt es schon einen Code in der PureArea:Nalfein hat geschrieben:kann man den Cursor für die Zeit unsichtbar machen oder solange ausschalten oder sowas?
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
EndIfDanke!
Hab es mal als
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?
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
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 !!!
Erledigt :)
Hat sich erledigt!
So funktioniert es besser und hat nebenbei alle anderen Probleme gelöst...
:
Vor der Schleife für Mausabfrage und so...:
danach in der Schleife:
Danke für den Code mit "ShowCursor_()"!
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
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
If OSVersion() <> #PB_OS_Windows_ME : End : EndIf !!!
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?

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
sieht gut aus.
Für den ButtonRelease muss ich mir dann noch was ausdenken, wird aber wohl gehen
Für den ButtonRelease muss ich mir dann noch was ausdenken, wird aber wohl gehen
Kinder an die Macht http://scratch.mit.edu/
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
flag-contolled.
sieht jetzt ein bissel kryptisch aus, aber gibt präzise auskunft über zustand und zustandswechsel.
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
EndIfDer Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.