Systemmauszeiger in "OpenScreen" verwenden
Mhh, klappt nur teilweise er reagiert jetzt zwar nicht mehr wenn ich wenn ich die linke Maustaste gedrückt halte und über ein Feld gehe, aber springt immer noch zurück sobald eine Schaltfläche darunter ist .... und springt mir wieder zurück ..
Zuletzt geändert von oliXon am 30.07.2007 19:01, insgesamt 2-mal geändert.
:: PureBasic v4.02 (Windows - x86)::
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
hm.. also..
du darfst dann natürlich die geänderte schaltfläche erst im nächsten frame abfragen.
also, in dem durchgang, wo sich die darstellung ändert, darfst du noch nicht auf das veränderte layout reagieren.
kannst du das reduzieren auf so nen ähnlich kurzen code wie den von fluid?
dann kann ich dir bestimmt genau sagen, an welcher stelle du was anders machen musst..
du darfst dann natürlich die geänderte schaltfläche erst im nächsten frame abfragen.
also, in dem durchgang, wo sich die darstellung ändert, darfst du noch nicht auf das veränderte layout reagieren.
kannst du das reduzieren auf so nen ähnlich kurzen code wie den von fluid?
dann kann ich dir bestimmt genau sagen, an welcher stelle du was anders machen musst..
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Ich hofffe das reicht so, funktionieren wird er nicht, ich hab nur mal die Schaltfläche credits drin gelassen und das credits menü ...
Code: Alles auswählen
Declare main()
;Credits
Procedure credits()
Repeat
ExamineKeyboard()
GetCursorPos_(pt.POINT)
If GetAsyncKeyState_(#VK_LBUTTON) & $FFFF
If MLB_act = 0
MLB_act = 1
MLB = 1
Else
MLB = 0
EndIf
Else
MLB_act = 0
EndIf
StartSpecialFX()
DisplaySprite(#Sprite_0006, 0, 0)
If pt\x >= 0 And pt\x < 640 And pt\y >= 0 And pt\y < 480
;DisplayRGBFilter(0,0,640,480,50,50,50)
If MLB
main()
EndIf
EndIf
StopSpecialFX()
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until KeyboardPushed(1)
EndProcedure
;-Hauptmenü
Procedure main()
Repeat
ExamineKeyboard()
GetCursorPos_(pt.POINT)
If GetAsyncKeyState_(#VK_LBUTTON) & $FFFF
If MLB_act = 0
MLB_act = 1
MLB = 1
Else
MLB = 0
EndIf
Else
MLB_act = 0
EndIf
StartSpecialFX()
DisplaySprite(#Sprite_0001, 0, 0)
;Credits
If pt\x >= 445 And pt\x < 625 And pt\y >= 110 And pt\y < 195
;DisplayRGBFilter(445,110,180,85,50,50,50)
If MLB
PlaySound(#Sound_046)
credits()
EndIf
EndIf
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(0,0,"ImpR 0.1a",$FFFFFF)
StopDrawing()
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until MouseButton(4)
EndProcedure
main()
:: PureBasic v4.02 (Windows - x86)::
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
ok..
also das erste problem ist, dass du komplette procedures benutzt.
ich persönlich würde vorziehen, nur eine einzige hauptschleife zu haben,
innerhalb derer mit zustandsvariablen und Select entschieden wird,
welche bereiche wo gezeichnet und abgefragt werden.
mit den procedures ist klar wo das problem liegt:
MLB_act ist nicht global, d.h. er kann sich den Frame garnicht merken,
weil das merkflag in der einen proc ne ganz andere variable ist als in der anderen proc.
die schnellste abhilfe wäre, die flags Global oder Shared zu machen.
grundsätzlich würde ich dir aber schon dazu raten, mit nur einer hauptschleife zu arbeiten.
außerdem:
die Flag-behandlung brauchst du eigentlich nur mit der PB-mouselib für den screen.
wenn du wirklich GetAsyncKeystate verwenden willst, löst sich das problem praktisch von alleine:
der rückgabewert hat bei der ersten abfrage eines clicks einen anderen wert als bei weiteren abfragen des selben clicks (gedrückt halten).
lass dir mal den rückgabewert debuggen, dann siehst du was ich meine:
also das erste problem ist, dass du komplette procedures benutzt.
ich persönlich würde vorziehen, nur eine einzige hauptschleife zu haben,
innerhalb derer mit zustandsvariablen und Select entschieden wird,
welche bereiche wo gezeichnet und abgefragt werden.
mit den procedures ist klar wo das problem liegt:
MLB_act ist nicht global, d.h. er kann sich den Frame garnicht merken,
weil das merkflag in der einen proc ne ganz andere variable ist als in der anderen proc.
die schnellste abhilfe wäre, die flags Global oder Shared zu machen.
grundsätzlich würde ich dir aber schon dazu raten, mit nur einer hauptschleife zu arbeiten.
außerdem:
die Flag-behandlung brauchst du eigentlich nur mit der PB-mouselib für den screen.
wenn du wirklich GetAsyncKeystate verwenden willst, löst sich das problem praktisch von alleine:
der rückgabewert hat bei der ersten abfrage eines clicks einen anderen wert als bei weiteren abfragen des selben clicks (gedrückt halten).
lass dir mal den rückgabewert debuggen, dann siehst du was ich meine:
Code: Alles auswählen
Repeat
Debug GetAsyncKeyState_(#VK_LBUTTON)
Delay(100)
Until GetAsyncKeyState_(#VK_ESCAPE)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Also sollte ich es in etwa umbauen wie es dieses Beispiel zeigt ?
GameMenu_Example.pb
Gibt es ein einfachere beispiel der eine Hauptschleife zeigt ?
GetAsyncKeystate werde ich wohl dann mal rausschmeissen.
Der Rückgabewert ist 32768 ... ?
GameMenu_Example.pb
Gibt es ein einfachere beispiel der eine Hauptschleife zeigt ?
GetAsyncKeystate werde ich wohl dann mal rausschmeissen.
Der Rückgabewert ist 32768 ... ?
:: PureBasic v4.02 (Windows - x86)::
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
schau doch genau hin...
der rückgabewert ist beim click -32767, und beim gedrückt halten 32768.
bei mir sieht die debug-ausgabe so aus:hast du den mini-code nicht mal durchlaufen lassen?
> Also sollte ich es in etwa umbauen wie es dieses Beispiel zeigt ?
das ist grundsätzlich schon mal besser, ja.
im endeffekt bleibt es dir natürlich überlassen, wieviel du wie in Procedures packst,
aber eine einzige hauptschleife ist grundsätzlich ein guter tip.
eventuell wärs nachher sinnvoll,
für die menus ne andere hauptschleife zu verwenden als für das game selber,
aber da musst du sehen, was wie komplex und unübersichtlich wird.
im endeffekt geht es, und ich mache das des öfteren,
für alles nur eine einzige hauptschleife zu benutzen,
also für vorspann, menu, game und abspann.
...es geht. ob es immer praktisch ist, hängt vom projekt und vom persönlichen geschmack ab.
aber da es bei dir konkret zu nem problem geführt hat,
für zwei menu-schleifen unterschiedliche procs zu benutzen,
würde ich zumindest dort was dran ändern...
der rückgabewert ist beim click -32767, und beim gedrückt halten 32768.
bei mir sieht die debug-ausgabe so aus:
Code: Alles auswählen
0
0
0
-32767
32768
32768
32768
0
0
0
> Also sollte ich es in etwa umbauen wie es dieses Beispiel zeigt ?
das ist grundsätzlich schon mal besser, ja.
im endeffekt bleibt es dir natürlich überlassen, wieviel du wie in Procedures packst,
aber eine einzige hauptschleife ist grundsätzlich ein guter tip.
eventuell wärs nachher sinnvoll,
für die menus ne andere hauptschleife zu verwenden als für das game selber,
aber da musst du sehen, was wie komplex und unübersichtlich wird.
im endeffekt geht es, und ich mache das des öfteren,
für alles nur eine einzige hauptschleife zu benutzen,
also für vorspann, menu, game und abspann.
...es geht. ob es immer praktisch ist, hängt vom projekt und vom persönlichen geschmack ab.
aber da es bei dir konkret zu nem problem geführt hat,
für zwei menu-schleifen unterschiedliche procs zu benutzen,
würde ich zumindest dort was dran ändern...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.