Systemmauszeiger in "OpenScreen" verwenden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

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)::
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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..
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

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)::
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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:

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.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

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 ... ?
:: PureBasic v4.02 (Windows - x86)::
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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:

Code: Alles auswählen

0
0
0
-32767
32768
32768
32768
0
0
0
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 Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

hast du den mini-code nicht mal durchlaufen lassen?
Doch nur leider ist mir das - vorder Zahl entangen ...

Gut werde ich das mal umstrukturieren, ich hoffe ich kann wenn ich es geschafft habe wieder hier posten.
:: PureBasic v4.02 (Windows - x86)::
Antworten