InitKeyboard Probleme

Anfängerfragen zum Programmieren mit PureBasic.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

carter hat geschrieben:das funktioniert, vielen dank *wieder was gelernt hat* doch mit der maus kann ich immer noch nicht aus dem fenster rausfahren, weißt du woran das liegt? achja wenn du die bilder willst lad ich sie dir gerne hoch^^
\

Das liegt daran, dass die Maus fuer den Screen eingesperrt ist. Das ganze ist ne Sache fuer sich... Es gibt zwar Befehle - ausserhalb der ScreenMaus-Bibliothek zum Abfragen wo sich die Maus gerade befindet (WindowMouseX() und WindowMouseY()) - doch leider kann man nicht ueberpruefen, ob geklickt wurde.
Dazu gibt es einen WinAPI_Befehl, GetASyncKeyState_(), wenn du Windows benutzt:

Code: Alles auswählen

OpenWindow(0, 0, 0, 500, 200, "")

Repeat
  If GetAsyncKeyState_(#VK_RBUTTON)
    StartDrawing(WindowOutput(0))
    DrawText(20, 20, "Rechte Maustaste wurde gedrueckt auf Position: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    StopDrawing()
  ElseIf GetAsyncKeyState_(#VK_LBUTTON)
    StartDrawing(WindowOutput(0))
    DrawText(20, 20, "Linke Maustaste wurde gedrueckt auf Position: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    StopDrawing()
  EndIf
  
  Delay(1)
Until WindowEvent() = #PB_Event_CloseWindow
Musst halt etwas damit rumexperimentieren...

Glaube Kaeru Gaman hat mal vor einiger Zeit ein Beispiel zur Verwendung der Maus im WindowedScreen-Modus im Code & Tipps Bereich geschrieben...

edit: Die Maus-Bibliothek fuer den Screen sollte jedenfalls nur fuer den Fullscreen-Modus verwendet werden und nicht fuer den Windowed-Screen Modus...
Bild + Bild

Bild
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

Beitrag von carter »

mh okay aber was genau nutzt mir das nun bei mir? also wie tu ich die maus damit "freilassen" ?
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Dare Devil hat geschrieben: Glaube Kaeru Gaman hat mal vor einiger Zeit ein Beispiel zur Verwendung der Maus im WindowedScreen-Modus im Code & Tipps Bereich geschrieben...
http://www.purebasic.fr/german/viewtopic.php?t=11280

Ich muß das mit der Event-Queue übrigens revidieren, habe eben ein paar Tests gemacht und es scheint es kommen nie soviele Events an, dass sie nicht durch eine Abfrage pro FlipBuffers gehandelt werden könnte.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

carter hat geschrieben:mh okay aber was genau nutzt mir das nun bei mir? also wie tu ich die maus damit "freilassen" ?
Du musst die ganzen Befehle der Maus-Bibliothek ersetzen, ich hab das mal fuer dich gemacht. Pruefe mal obs geht :wink:

Code: Alles auswählen

InitSprite() 
InitKeyboard()         
OpenWindow(0, 0, 0, 1024, 768, "test screen", #PB_Window_ScreenCentered |#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar) 
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 0, 0, 0) 
#Max_Fass = 20                
Dim FassX.w(#Max_Fass)      
Dim FassY.w(#Max_Fass)      
Dim FassExist.w(#Max_Fass)    
Dim FassAnim.w(#Max_Fass)    
Global Level.w          
Global Maus_Knopf.w        
Global Punkte.w            
Global FassCount.w          
Global Durchgefallen.w      
Level = 1 

LoadSprite(0,"GFX\NeuKreuz.bmp",0)  
TransparentSpriteColor(0,255+256*0+256*256*255) 
LoadSprite(1,"GFX\Back.bmp" ,0)      
For x = 1 To 10 
 LoadSprite(10+x,"GFX\Fass" + Str(x) + ".bmp",0) 
 TransparentSpriteColor(10+x,255+256*0+256*256*255)          
Next 

Repeat    
 ExamineKeyboard() 
 If GetAsyncKeyState_(#VK_LBUTTON) And Maus_Knopf = 0 
  Maus_Knopf = 1 
  For x = 1 To #Max_Fass 
   If FassExist(x) = 1 And WindowMouseX(0) > FassX(x) And WindowMouseX(0) < FassX(x) + 20 And WindowMouseY(0) > FassY(x) And WindowMouseY(0) < FassY(x) + 20 
    
   FassExist(x) = 2 
   Punkte = Punkte + 10 
   EndIf 
  Next 
 EndIf 
 If GetAsyncKeyState_(#VK_LBUTTON) = 0 
  Maus_Knopf = 0        
 EndIf 

 DisplaySprite(1,0,0)  
 For x = 1 To #Max_Fass 
  If FassExist(x) > 0 
   DisplayTransparentSprite(10+FassAnim(x)/3,FassX(x),FassY(x)) 
  EndIf 
 Next 
 DisplayTransparentSprite(0,WindowMouseX(0)-32,WindowMouseY(0)-32) 
 StartDrawing(ScreenOutput()) 
 DrawingMode(1)                
 FrontColor(0+256*0+256*256*255)          
 DrawText(0,0,"Punkte:" + Str(Punkte)) 
 FrontColor(255+256*0+256*256*0)          
 DrawText(530,0,"Durchgefallen:" + Str(Durchgefallen)) ; ... 
 StopDrawing()              
 FlipBuffers()                
  

 FassCount = 0                
 For x = 1 To #Max_Fass      
  If FassExist(x) > 0          
   FassCount = FassCount + 1    
   If FassExist(x) < 3          
    FassY(x) = FassY(x) + 1    
   EndIf 
   If FassExist(x) > 1        
    FassAnim(x) = FassAnim(x) + 1 
    If FassAnim(x) > 30            
     FassExist(x) = 0          
    EndIf 
   EndIf 
   If FassExist(x) = 1 And FassY(x) > 460 
    Durchgefallen = Durchgefallen + 1    
    FassExist(x) = 3                      
   EndIf 
  EndIf 
 Next 
  
 If FassCount < Level  
  For x = 1 To #Max_Fass 
   If FassExist(x) = 0 
    FassExist(x) = 1    
    FassAnim(x) = 3    
    FassY(x) = -40    
    FassX(x) = Random(620) 
    x = #Max_Fass+1 
   EndIf 
  Next 
 EndIf 
 If (Punkte / 100) + 1 > Level 
  Level = Level + 1            
 EndIf 
  
 EventID = WindowEvent() 
  
 If EventID = #PB_Event_CloseWindow 
  Break 
 EndIf 

Delay(1) 

Until KeyboardPushed(1) Or Durchgefallen > 9 
Delay(1000) 
CloseScreen() 
MessageRequester("Game Over", "Du hast " + Str(Punkte) + " Punkte erreicht",0) 
Alle Befehle der Maus-Bibliothek wurden durch die Standard-Window-Mausbefehle ersetzt...
HeX0R hat geschrieben:http://www.purebasic.fr/german/viewtopic.php?t=11280

Ich muß das mit der Event-Queue übrigens revidieren, habe eben ein paar Tests gemacht und es scheint es kommen nie soviele Events an, dass sie nicht durch eine Abfrage / FlipBuffers gehandelt werden können.
Genau den meinte ich :D

Haette eh nicht gewusst was du meinst :mrgreen:
Bild + Bild

Bild
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

Beitrag von carter »

es funktioniert ^^ nun weiß ich auch was du vorhin meintest :S, das einzige prob ist, dass über meinem fadenkreuz, also das mouseimage nun die windows mouse ist, sprich ich seh beides^^ wenn das noch weggehen würde wäre das top :) und dann werd ich mich an das menu setzen, das werde ich alleine schaffen denk ich, achja noch eine frage, mit welchem cmd würde ich das spiel einfrieren? also möchte z.B. dass man mit "p" das spiel unterbricht gibts da irgendeine funktion?

//Edit das mit der pause hab ich hinbekommen, indem ich einfach eine MessageBox öffne, wenn man auf oke drückt, dann ist die message box weg und das spiel geht weiter^^ Gibt es eine Möglichkeit, den "OK" Button gegen z.B. Pause Beenden auszutauschen?
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

carter hat geschrieben:es funktioniert ^^ nun weiß ich auch was du vorhin meintest :S, das einzige prob ist, dass über meinem fadenkreuz, also das mouseimage nun die windows mouse ist, sprich ich seh beides^^ wenn das noch weggehen würde wäre das top :) und dann werd ich mich an das menu setzen, das werde ich alleine schaffen denk ich, achja noch eine frage, mit welchem cmd würde ich das spiel einfrieren? also möchte z.B. dass man mit "p" das spiel unterbricht gibts da irgendeine funktion?

//Edit das mit der pause hab ich hinbekommen, indem ich einfach eine MessageBox öffne, wenn man auf oke drückt, dann ist die message box weg und das spiel geht weiter^^
Mit ShowCursor_(0) blendest du die Maus fuer das Fenster weg und mit ShowCursor_(1) zeigst du sie.

Ein Pause kannst du z.B. realisieren, indem du den Screen einfrierst.

Code: Alles auswählen

If KeyboardReleased(#PB_Key_P)
  Repeat
    ExamineKeyboard()
    
    If WindowEvent() = #PB_Event_CloseWindow
      Break 2
    EndIf
    
    Delay(1)
  Until KeyboardReleased(#PB_Key_P)
EndIf
Probier das mal am Anfang der Schleife zu setzen...
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das mit der Pause kannst du beliebig gestalten,
du musst nur nicht deinen loop weiter durchlaufen lassen,
bzw. wenn du ein Window-Game hast, nur den Event-Teil durchlaufen lassen, nicht den Game-Teil.


das mit den doppelten zeigern...

was für code verwendest du denn jetzt? hier wurden mehrere beispiele gegeben.
(danke an die lieben kollegen, die mein beispiel verlinkt haben. es tut gut, wenn deine beispiele benutzt werden.)

wenn du die MouseLib für Games benutzt, musst du ReleaseMouse(#True/#False) verwenden,
um die maus freizugeben/einzufangen, und den OS-cursor ein/aus zu schalten.

wenn du WindowMouseX/Y verwendest, musst du den Zeiger selber ein/aus schalten.

beides ist übrigens in meinen beiden beispielen vorgestellt.
mit API: http://www.purebasic.fr/german/viewtopi ... 536#130536
ohne API: http://www.purebasic.fr/german/viewtopi ... 760#130760
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

Beitrag von carter »

das hat mir alles sehr geholfen + mir viel stoff gegeben mein bisher noch spärliches wissen zu erweitern, ich bin total lernmotiviert im moment und die nacht wird heute wohl noch lang :)
habe eine kleine frage, konnte in der suche etc nichts dazu finden, noch was nebenbei, kann es sein dass es kaum gute tutorials gibt? hier lautet die devise wohl error'n and trying, learning by doing + ask the nice guys in forum, oder täusche ich mich?

nun zu meinen fragen

1: wie lautet das commando um hintergrundmusik einzubinden,
2: ist es mit DrawText möglich die schriftgröße + den font zu ändern? wenn ja wie?


danke an alle antworten, hier fühl ich mich wirklich wohl :)

mfg carter

//Edit ShowCursor_(0) funktioniert zwar, doch dann ist z.B. oben bei dem x und dem minimize etc auch keine maus und das ist ja doof :)
Zuletzt geändert von carter am 12.12.2008 21:52, insgesamt 1-mal geändert.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Kaeru Gaman hat geschrieben:wenn du die MouseLib für Games benutzt, musst du ReleaseMouse(#True/#False) verwenden,
um die maus freizugeben/einzufangen, und den OS-cursor ein/aus zu schalten.
Ist das nicht mit Verzoegerungen verbunden?
Kann mich erinnern mal vor einiger Zeit Probleme damit gehabt zu haben. Zwar hat es funktioniert, hat aber gelagged...
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau dir mal beide beispiele an. da sind keine verzögerungen drin.
es ist alles eine Frage der Vorgehensweise.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten