Touches simultanées ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
foossile
Messages : 25
Inscription : sam. 15/juil./2006 11:35

Touches simultanées ?

Message par foossile »

Bonjour à tous,

dans mon programme, je ne veux pas qu'on puisse appuyer deux touches de direction en même temps.
Voilà donc ma procédure :

Code : Tout sélectionner

Procedure ControlInput()


ToucheApp=0
If KeyboardPushed ( #PB_Key_Left ) And ToucheApp=0
ToucheApp=1
ScrollX-20
ScrollY-10
EndIf

If KeyboardPushed ( #PB_Key_Right ) And ToucheApp=0
ToucheApp=1
ScrollX+20
scrollY+10
EndIf

If KeyboardPushed ( #PB_Key_Down ) And ToucheApp=0
ToucheApp=1
ScrollX-20
ScrollY+10
EndIf

If KeyboardPushed ( #PB_Key_Up ) And ToucheApp=0
ToucheApp=1
ScrollX+20
ScrollY-10
EndIf

If KeyboardReleased(#PB_Key_All)
ToucheApp=0
EndIf

EndProcedure
Ca fonctionne, mais y'a-t-il une méthode plus simple ?
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Re: Touches simultanées ?

Message par Le psychopathe »

Comme ça ?

c'est juste une piste, ce code n'est pas complet

Code : Tout sélectionner

repeat
up = 0
down = 0
left = 0
right = 0
    If KeyboardPushed(#PB_Key_Up) : up=1 : EndIf
    If KeyboardPushed(#PB_Key_Down) :down=1 : EndIf
    If KeyboardPushed(#PB_Key_Left) : left=1 : EndIf
    If KeyboardPushed(#PB_Key_Right) : right=1 : EndIf

if up = 1
move up + 1
if left =1
move gauche +1
endif
if right = 1
move droite +1 
endif
.....
until ce que tu veux ^^
    
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Touches simultanées ?

Message par Cool Dji »

Hello Foosile,
Ta méthode marche mais elle priorise une touche quand plusieurs sont appuyées en même temps.
Typiquement, ce sera toujours la left qui passera en premier...

Je te propose de faire un test global qui ne fait rien bouger dès lors que plusieurs touches sont appuyées
Ensuite, la routine du psy marchera bien.

ex :
nombredetouches=0
if testleftpress : nombredetouches+1 : pressleft=1 : endif
if testrightpress : nombredetouches+1 : pressright=1 : endif
if testuppress : nombredetouches+1 : pressup=1 : endif
if testdownpress : nombredetouches+1 : pressdown=1 : endif

if nombredetouches=1 ; si c'est 1 c'est qu'il y a qu'une et une seule touche d'appuyée
C'est là que tu mets les tests de direction
endif

Je ne sais pas si c'est plus simple que ta routine mais ça évite de différencier les touches les unes par rapport aux autres selon leur rang dans le test...
Only PureBasic makes it possible
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Touches simultanées ?

Message par comtois »

ou comme ça

Code : Tout sélectionner

Procedure ControlInput()

If KeyboardPushed ( #PB_Key_Left ) 
  ScrollX-20
  ScrollY-10
ElseIf KeyboardPushed ( #PB_Key_Right ) 
  ScrollX+20
  scrollY+10
ElseIf KeyboardPushed ( #PB_Key_Down ) 
  ScrollX-20
  ScrollY+10
ElseIf KeyboardPushed ( #PB_Key_Up ) 
  ScrollX+20
  ScrollY-10
EndIf

EndProcedure
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Touches simultanées ?

Message par djes »

Tu peux aussi mettre un flag pour attendre que la touche soit relachée avec keyboardreleased()
foossile
Messages : 25
Inscription : sam. 15/juil./2006 11:35

Re: Touches simultanées ?

Message par foossile »

Merci pour toutes ces réponses :)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Touches simultanées ?

Message par Cool Dji »

Le code de Comtois est le plus efficace
Mais je te propose une petite variante de ma prop qui peut être utile par la suite pour justement gérer plusieurs touches enfoncées en meme tempsex :

nombredetouches=0
if testleftpress : nombredetouches+1 : pressleft=1 : endif
if testrightpress : nombredetouches+2 : pressright=1 : endif
if testuppress : nombredetouches+4 : pressup=1 : endif
if testdownpress : nombredetouches+8 : pressdown=1 : endif

Dans ce cas :
nombredetouches=1 : left est pressée
nombredetouches=2 : right est pressée
nombredetouches=3 = 1 + 2 : left et right sont pressées
nombredetouches=4 : up est pressée
nombredetouches=5 = 1+5 : up et left sont est pressées
...
nombredetouches=15 = 1+2+4+8 : toutes les touches sont pressées

là tu dois pouvoir gérer le dispatch des routines avec un case...
Only PureBasic makes it possible
Répondre