InitKeyboard Probleme

Anfängerfragen zum Programmieren mit PureBasic.
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

InitKeyboard Probleme

Beitrag von carter »

Hi,

ich habe eine Frage, kann ich keyboard sachen also z.B.

if KeyboardPushed(1)
blub
endif

auch benutze, wenn ich mein fenster mit


If OpenWindow(0,100,100,500,400,"test",#PB_Window_SystemMenu)

öffne?

Weil ich bekomm dann immer die meldung, dass OpenScreen etc erst deklariert werden muss.

danke für hilfe!
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@carter
Hallo,

das sind Befehle für Spiele-Programmierung.

Wenn du in deiner Anwendung ermitteln möchtest, ob eine Taste gedrückt wurde: http://www.rsbasic.de/index.php?option= ... &Itemid=59

Oder:

Code: Alles auswählen

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  AddKeyboardShortcut(0, #PB_Shortcut_A,1)
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_Event_Menu
  Select EventMenu()
    Case 1
      MessageRequester("","Taste 'A' wurde gedrückt",0)
  EndSelect
EndIf
If EventID=#PB_Event_CloseWindow
  Quit=1
EndIf
Until Quit=1
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

Beitrag von carter »

es ist eigentlich auch mein ziel ein spiel zu programmieren, muss ich dafür das openscreen cmd benutzen? was mich dabei stört ist eben, dass das im fullscreen ist. ich les mir gerade einige tuts durch, da steht etwas von einem Windowed mode, den teste ich gleich mal, wieso ich aber schreibe ist, gibt es irgendwo eine liste von alle gadgets? Denn ich weiß nicht genau welche es gibt und da wäre dass doch hilfreich :)
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

carter hat geschrieben:es ist eigentlich auch mein ziel ein spiel zu programmieren, muss ich dafür das openscreen cmd benutzen? was mich dabei stört ist eben, dass das im fullscreen ist. ich les mir gerade einige tuts durch, da steht etwas von einem Windowed mode, den teste ich gleich mal, wieso ich aber schreibe ist, gibt es irgendwo eine liste von alle gadgets? Denn ich weiß nicht genau welche es gibt und da wäre dass doch hilfreich :)
Du musst keinen Screen oeffnen... Seh dir mal den Befehl OpenWindowedScreen() an:

Ein Beispiel:

Code: Alles auswählen

InitKeyboard()
InitSprite()

OpenWindow(0, 0, 0, 200, 200, "Windowed Screen", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)

OpenWindowedScreen(WindowID(0), 0, 0, 200, 200, 0, 0, 0)

Repeat
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  
  If WindowEvent() = #PB_Event_CloseWindow
    End
  EndIf
ForEver

Eine Liste aller Gadgets findest du in der PB-Hilfe...
Bild + Bild

Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@carter
Wenn du ein Spiel programmieren möchtest, dann kannst du entweder im Fullscreen oder in einem WindowScreen dein Spiel aufbauen...
Fullscreen: OpenScreen()
WindowScreen: OpenWindowedScreen()

Die Gadgets wie z.B. ButtonGadget, CheckBoxGadget u.s.w. kannst du nicht benutzen.
Welche PB-Version benutzt du?
Wenn du die neue Beta-Version benutzt, dann kannst du die Screen-Gadgets benutzen.
Eine Liste aller Befehle einer Library findest du hier: http://www.rsbasic.de/screenshots/158674018745610.png
(Das ist nur eine Beispiel-Library)
Da gibt es auch Libs wie ScreenGadgets oder so und ähnliche...
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

RSBasic hat geschrieben:Die Gadgets wie z.B. ButtonGadget, CheckBoxGadget u.s.w. kannst du nicht benutzen.
Gilt aber nicht fuer den WindowedScreen-Modus

Wenn der Screen nicht ueber das ganze Fenster erstellt wird, kannst du die Gadgets ausserhalb des Screens benutzen.

Beispiel:

Code: Alles auswählen

InitKeyboard()
InitSprite()

OpenWindow(0, 0, 0, 200, 200, "Windowed Screen", #PB_Window_ScreenCentered |#PB_Window_SystemMenu)

OpenWindowedScreen(WindowID(0), 0, 0, 200, 100, 0, 0, 0)

CreateGadgetList(WindowID(0))

ButtonGadget(0, 20, 105, 100, 20, "Klick Mich")

Repeat
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  
  EventID = WindowEvent()
  
  If EventID = #PB_Event_CloseWindow
    End
  EndIf
  
  If EventID = #PB_Event_Gadget
    If EventGadget() = 0
      MessageRequester("Test", "Button wurde gedrueckt!")
    EndIf
  EndIf
  
  Delay(1)
ForEver
Ansonsten hat Kaeru Gaman im Code & Tipps - Bereich ein Beispiel erstellt wie man Gadget-aehnliche Objekte im Screen-Modus benutzt.
Bild + Bild

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

Beitrag von carter »

ja ich weiß, das bin ich gerade am anschaun, ich versuch das auch alles zu verstehen + nachzuvollziehen, ich habe pb 4.20

Irgendwie ist windowed screen ein wenig buggy, vlt bilde ich mir das aber auch nur ein, ich habe ein bereits vorgegebenes spiel (eines aus nem tutorial) versucht, im windowed mode zu starten, doch wenn ich das spiel minimiere, dann hängt es sich auf, es hängt sich auch so manchmal auf, und ich kann mit der maus irgendwie nicht aus dem fenster hinaus navigieren.
Ich habe es ersteinmal (zumindest für heute, flachgelegt mein eigenes spiel zu machen, ich habe erkannt dass ich erstmal alles verstehen muss, daher arbeite ich mit einem "tutorial-spiel")

hier ist mal der quelltext:

Code: Alles auswählen

InitSprite()
InitKeyboard()   
InitMouse()     
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
 ExamineMouse()    
 ExamineKeyboard() 
 If MouseButton(1) And Maus_Knopf = 0 
  Maus_Knopf = 1 
  For x = 1 To #Max_Fass 
   If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20
   
   FassExist(x) = 2 
   Punkte = Punkte + 10 
   EndIf
  Next
 EndIf
 If MouseButton(1) = 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,MouseX()-32,MouseY()-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

Until KeyboardPushed(1) Or Durchgefallen > 9 
Delay(1000) 
CloseScreen() 
MessageRequester("Game Over", "Du hast " + Str(Punkte) + " Punkte erreicht",0) 
und wie gesagt, da treten die oben genannten fehler auf und ich weiß leider nicht warum
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Das ist einfach.
Der Fehler tritt im WindowedScreen auf - weil du nicht ueberpruefst, ob ein Windowevent ausgeloest wurde. Ausserdem solltest du noch ne Delay(1)-Funktion hinzufuegen.

probier mal folgenden Code aus und sag mir obs geklappt hat:

Code: Alles auswählen

InitSprite() 
InitKeyboard()    
InitMouse()      
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 
 ExamineMouse()    
 ExamineKeyboard() 
 If MouseButton(1) And Maus_Knopf = 0 
  Maus_Knopf = 1 
  For x = 1 To #Max_Fass 
   If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20 
    
   FassExist(x) = 2 
   Punkte = Punkte + 10 
   EndIf 
  Next 
 EndIf 
 If MouseButton(1) = 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,MouseX()-32,MouseY()-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) 

Kann es leider nicht selbst ausprobieren, da ich die Bilder nicht habe :wink:
Bild + Bild

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

Beitrag von carter »

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^^
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 »

Eigentlich sollte man die Event-Queue pro FlipBuffers immer ganz leeren.

Ein einziger Aufruf hilft zwar im Moment, lässt die Queue aber u.U. dennoch immer voller werden.
Antworten