Seite 2 von 4
Verfasst: 12.12.2008 21:03
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...
Verfasst: 12.12.2008 21:08
von carter
mh okay aber was genau nutzt mir das nun bei mir? also wie tu ich die maus damit "freilassen" ?
Verfasst: 12.12.2008 21:10
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.
Verfasst: 12.12.2008 21:20
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
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
Haette eh nicht gewusst was du meinst

Verfasst: 12.12.2008 21:27
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?
Verfasst: 12.12.2008 21:40
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...
Verfasst: 12.12.2008 21:44
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
Verfasst: 12.12.2008 21:49
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

Verfasst: 12.12.2008 21:51
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...
Verfasst: 12.12.2008 21:54
von Kaeru Gaman
schau dir mal beide beispiele an. da sind keine verzögerungen drin.
es ist alles eine Frage der Vorgehensweise.