Page 1 sur 1

Touches simultanées ?

Publié : mer. 04/nov./2009 13:43
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 ?

Re: Touches simultanées ?

Publié : mer. 04/nov./2009 17:02
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 ^^
    

Re: Touches simultanées ?

Publié : mer. 04/nov./2009 19:10
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...

Re: Touches simultanées ?

Publié : mer. 04/nov./2009 19:36
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

Re: Touches simultanées ?

Publié : mer. 04/nov./2009 21:35
par djes
Tu peux aussi mettre un flag pour attendre que la touche soit relachée avec keyboardreleased()

Re: Touches simultanées ?

Publié : jeu. 05/nov./2009 9:13
par foossile
Merci pour toutes ces réponses :)

Re: Touches simultanées ?

Publié : jeu. 05/nov./2009 10:15
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...