Page 1 sur 1

[résolu] keyboardpressed()

Publié : ven. 18/mars/2011 20:56
par blendman
salut

Existe un moyen d'obtenir ce genre de chose :

Code : Tout sélectionner

if keyboardpressed(#PB_key_A)
vie + 1
endif
Si j'utilise keyboardPushed() la vie augmente sans s'arrêter tant que j'appuie sur A.
je voudrais qu'elle n'augmente que de 1 en appuyant sur A (et en restant appuyé), pas en relâchant (donc, pas avec keyboardReleased()).

Du coup, j'ai écrit la procédure suivante :

Code : Tout sélectionner

Procedure keyboardPressed(idkey)
  
shared keyone, time

If keyone = 0
  If KeyboardPushed(idkey)
    time = 0
    keyone = 1
 EndIf
EndIf

If time <= -1
    keyone = 2
EndIf

If KeyboardPushed(idkey)
  time -1
EndIf
      
If KeyboardPushed(idkey) = 0
      keyone = 0
EndIf
  
ProcedureReturn keyone
EndProcedure
Mais ça ne marche que si j'utilise 1 sule fois ce code, logique car les variables sont "shared".

D'où ma question : existe -t-il une technique ou un code permettant d'avoir ce genre de chose ?

Merci :)

Re: keyboardpressed()

Publié : ven. 18/mars/2011 21:18
par venom
Salut,

je ne suis pas fortiche en prog jeux, mais G-Rom m'avais montrée un exemple qui fait cela

voici ce que je peut tiré du code :

Code : Tout sélectionner

	if Keyboardpushed(...)<>0 And Flag_Makey = 0 
	Flag_Makey = 1 
	Action 
	endif 
	 
	if Keyboardpushed(...)=0 
	Flag_Makey = 0 
	endif
ça se passe avec le flag
voici le topic au pire :wink:
http://www.purebasic.fr/french/viewtopi ... =2&t=10628






@++

Re: keyboardpressed()

Publié : ven. 18/mars/2011 21:25
par blendman
C'est assez proche de ce que je pensais faire, mais je voudrais une procédure assez générale, c'est à dire que je puisse réutiliser pour toutes les touches du clavier :).

Voici un exemple entier.

pour une seule touche, ça marche, mais dès qu'on utilise keyboardpressed() sur plusieurs touches, ça bugue (logique, les variables sont shared, mais si elle ne sont pas partagées, ça ne marche plus non plus :p)

le code :

Code : Tout sélectionner



;{ ************************enumeration ***********************
#window = 0
Enumeration
#player 
EndEnumeration
#ScreenW = 800
#ScreenH = 600
;}



;{ ************************ variables ************************

Global vitesse = 0
Global inscreen = 1
Global mouseClic = 0
Global alarm = 0

ShowCursor_(1)
;}

;{ ************************ declare ***************************

Declare gestion_souris()
Declare keyboardPressed(idkey)
Declare mousePressed(idmousebuton)
;}


;{ ************************ inititialisation *****************

InitKeyboard () 
InitSprite()

InitMouse()



;}


;{ ************************ open window *********************

OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "Collision" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen( WindowID (#window),0,0, 800,600, 1, 0,0)

;}



;{ ************************ boucle principale ***************

Repeat


Event= WindowEvent ()

ExamineKeyboard ()
ExamineMouse()
gestion_souris()


; If KeyboardPressed(#PB_Key_0) =1
;    vitesse +1 
;  EndIf
; 
If KeyboardPressed(#PB_Key_Space) =1
  vitesse +1 
 EndIf



 If mousePressed(#PB_MouseButton_Left)=1
   vitesse + 1
 EndIf
 






 StartDrawing(ScreenOutput())
 DrawText(50,50, "vitesse : "+Str(vitesse))
 DrawText(50,150, "keyone :"+ Str(keyone))
 StopDrawing()
 
 
FlipBuffers ()
ClearScreen (RGB (125,125,125)) 

Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) 

;}


Procedure gestion_souris() 
  mx = WindowMouseX(#window):my = WindowMouseY(#window)
  If inscreen = 1
        If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
          inscreen = 0
          ReleaseMouse(1)             
        EndIf     
  ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0 
      ReleaseMouse(0)
      MouseLocate(mx,my)
      inscreen = 1
  EndIf
EndProcedure


Procedure mousePressed(idmousebuton)
  
  
Shared mouseone, time2

If mouseone = 0
  If MouseButton(idmousebuton) =1
    time2 = 0
    mouseone = 1
 EndIf
EndIf

If time2 <= -1
    mouseone = 2
EndIf

If MouseButton(idmousebuton) =1
  time2 -1
EndIf

      
If MouseButton(idmousebuton) = 0
      mouseone = 0
EndIf

  
ProcedureReturn mouseone
  
EndProcedure


Procedure keyboardPressed(idkey)
  
Shared keyone, time


  If KeyboardPushed(idkey) And keyone = 0
    time = 0
    keyone = 1
 EndIf
;EndIf

If time <= -1
    keyone = 2
EndIf

If KeyboardPushed(idkey)
  time  -1
EndIf

      
If KeyboardPushed(idkey) = 0
      keyone = 0
EndIf

  
ProcedureReturn keyone

    
EndProcedure
oki, j'ai regardé sur ton sujet et effectivement, il y avait la solution, très simple et très rapide :D !

Merci à toi et à G-rom ;)

la solution :

Code : Tout sélectionner

Global NewMap KeyFlag.b()

Procedure.b KeyboardPushedEX(Const.i)
  If KeyboardPushed(Const) And KeyFlag(Str(Const)) = 0
    KeyFlag(Str(Const)) = 1
    ProcedureReturn #True
  EndIf
  If KeyboardPushed(Const)=0 And KeyFlag(Str(Const)) = 1
    KeyFlag(Str(Const)) = 0
  EndIf
  ProcedureReturn #False
EndProcedure 

Re: keyboardpressed()

Publié : ven. 18/mars/2011 21:39
par venom
bin voilà, ont s'en sort bien finalement :D :wink:







@++

Re: keyboardpressed()

Publié : ven. 18/mars/2011 21:44
par case
j'ai réfléchis a ton problème, sans vouloir te jeter de fleurs ca motive un peu de lire autre chose que du ouin ouin et du troll poilu sur le forum :)

Code : Tout sélectionner

InitKeyboard()
InitSprite()
main=OpenWindow(#PB_Any,0,0,50,50,"")
OpenWindowedScreen(WindowID(main),0,0,50,50,0,0,0)
Procedure keyboardPressed(idkey)    
  Static Dim keys.b(255)     ; stocke les touches enfoncées 
  ;
  If KeyboardReleased(idkey)  ; verifie que la touche testée n'a pas étée relachée                               
    If keys(idkey)=1
      keys(idkey)=0
      ProcedureReturn 0
    EndIf
  EndIf    
  ; 
  If KeyboardPushed(idkey)  ; verifie si la touche est enfoncée et si elle est deja
    If keys(idkey)=0           ; la touche n'est pas enfoncée    
      keys(idkey)=1          ; on l'enfonce
      ProcedureReturn 1   ; on renvoi 1
    EndIf
  EndIf   
EndProcedure
Repeat 
  ExamineKeyboard()
  If keyboardpressed(#PB_Key_Q)        
    vie + 1
  EndIf
  Debug vie  
  ev=WaitWindowEvent()  
Until ev=#PB_Event_CloseWindow