OVH Cloud OVH Cloud

[Dir] keyDown et Co, je patauge

7 réponses
Avatar
KRS
Je mêmpètre un peu dans la gestion des touches.

J'ai créé un nouvelle animation pour expérienter le gestionnaire on keyDown.

J'ai donc un script d'animation avec :

on keyDown
put "touche enfoncée"
end

mais il ne se passe absolument rien, impossible d'avoir le moindre put.

J'ai essayé de le mettre en comportement sur un objet champs, rien du tout.

C'est mon Director qui part en live ou je me broute totalement sur
l'utilisation de on keyDown?


autre chose, j'ai essayé également The keyDownScript :

à nouveau je l'ai associé à un put pour voir, et le résultat est
intéressant,

à l'enfocement d'une touche, le put est lancé, puis, après un laps de
temps, le put est relancé indéfiniment à toute vitesse.

après investigation, il se trouve que la répétition provient des
réglages de répétition de touches de windows... et c'est plutot génant.


Comment connaitre dans un comportement ou un script d'anim qu'une touche
vient d'être enfoncée sans que l'événement soit répété avant le
prochain enfoncement de touche ?

J'abuse ces temps-ci, mais je me tape beaucoup de doc, mais ça ne semble
pas se comporter comme ça devrait.

7 réponses

Avatar
Bubarnet
KRS wrote:
Je mêmpètre un peu dans la gestion des touches.

J'ai créé un nouvelle animation pour expérienter le gestionnaire on
keyDown.
J'ai donc un script d'animation avec :

on keyDown
put "touche enfoncée"
end

mais il ne se passe absolument rien, impossible d'avoir le moindre
put.


La syntaxe est correcte.
Tu es sûr :
1 - que c'est dans un script d'animation ?
2 - que l'élément qui a le focus n'a pas un gestionnaire keydown ?
3 - que l'élément qui a le focus n'est ni un champ, ni un Text ?
4 - qu'il n'y a pas un autre keydown dans un script d'animation ?
Ce n'est pas suffisant comme test, mais au moins nécessaire

J'ai essayé de le mettre en comportement sur un objet champs, rien du
tout.


Le champ avait le focus ?

C'est mon Director qui part en live ou je me broute totalement sur
l'utilisation de on keyDown?


Il faut bien voir la chaine des évènements dans l'ordre
- script de comportement sur un sprite
- membre/sprite
- script de comportement sur la piste comportement
- script d'animation
un évènement est envoyé dans cet ordre jusqu'à ce qu'il soit intercepté.

Si tu as un gestionnaire keydown sur le sprite qui a le focus, et un
gestionnaire keydown dans un script d'animation, le deuxième ne sera jamais
appelé tant que le premier qura le focus

autre chose, j'ai essayé également The keyDownScript :

à nouveau je l'ai associé à un put pour voir, et le résultat est
intéressant,

à l'enfocement d'une touche, le put est lancé, puis, après un laps de
temps, le put est relancé indéfiniment à toute vitesse.

après investigation, il se trouve que la répétition provient des
réglages de répétition de touches de windows... et c'est plutot
génant.


Pas le choix, c'est comme ça (je dirai même que je préfère ça comme ça sinon
on ne pourrait pas utiliser les répétitions ssystèmes)

Comment connaitre dans un comportement ou un script d'anim qu'une
touche vient d'être enfoncée sans que l'événement soit répété avant
le prochain enfoncement de touche ?


Tester si la touche a été relachée entre temps par exemple (sur un keyup,
dans un exitframe, mieux avec un xtra genre buddyapi, ...)

J'abuse ces temps-ci, mais je me tape beaucoup de doc, mais ça ne
semble pas se comporter comme ça devrait.


No problem

--
Bubar
Freelance Multimédia - internet
Création de logiciels multimédia et sites web
http://www.wapitistudio.com
Avatar
KRS
Bubarnet wrote:
La syntaxe est correcte.
Tu es sûr :
1 - que c'est dans un script d'animation ?
2 - que l'élément qui a le focus n'a pas un gestionnaire keydown ?
3 - que l'élément qui a le focus n'est ni un champ, ni un Text ?
4 - qu'il n'y a pas un autre keydown dans un script d'animation ?
Ce n'est pas suffisant comme test, mais au moins nécessaire



Effectivement, un champ avait le focus, j'ai mis mon script en script
d'acteur et ça fonctionne.
J'ai mal lu l'aide, mea culpa.

Pas le choix, c'est comme ça (je dirai même que je préfère ça comme ça sinon
on ne pourrait pas utiliser les répétitions ssystèmes)



Justement, je me suis dit que je pourrais utiliser directement ça au
lieu de lancer un timer pour recréer cet effet de répétition, hélas ça
vas beaucoup trop vite pour mon anim et les répétitions sur touche
flèche bas par ex. se mettent en mémoire et ma liste défile encore même
après avoir relaché la touche (le temps que toutes les répétitions en
mémoire soient traitées)

Comment connaitre dans un comportement ou un script d'anim qu'une
touche vient d'être enfoncée sans que l'événement soit répété avant
le prochain enfoncement de touche ?



Tester si la touche a été relachée entre temps par exemple (sur un keyup,
dans un exitframe, mieux avec un xtra genre buddyapi, ...)



Alors, le exitframe serait l'idéal, seulement, dans un script d'anim, le
exitFrame est capté dabord par le script d'image "go to the frame" et le
exitFrame du script d'anim n'est pas traité.

peut-on "passer" le on exit frame à un script d'anim après l'avoir
traité dans un script d'image?


Merci beaucoup pour tes renseignements précis!
Avatar
KRS
Finalement, j'ai trouvé une solution pour mon problème de répétition de
touches, je la met ici, au mieux ça peut vous faire rire, mais je fais
avec les moyens du bord.

Un grand merci à vous tous pour vos conseils.


Mon astuce en 2 scritp, un comportement associé a un sprite caché qui
est présent temps que je veux que les touches soient prises en compte,
et un script d'anim.
______________
comportement :

property pNdReplay

on beginSprite me
pNbreplay
-- appel dans le script d'anim
the keyDownScript = "shortcutDown"
the keyUpScript = "shortcutUp"
end

on exitFrame me
if pNbReplay > 2 then
--lance le gestionnaire de raccourci clavier
shortcutList()
end if
end

__________________
le script d'anim :

on shortcutDown
-- compte le nombre de répétition de la touche
spriteCaché.pNbReplay = spriteCaché.pNbReplay + 1
end

on shortcutUp
-- reset le nombre de répétition
spriteCaché.pNbReplay = 0
--lance le gestionnaire de raccourci
shortcutList()
end

on shortcutList

fais ce que je veux de mes touches

end
______________________

Voilà, je trouve le tout relativement simple et ça marche bien.
Avatar
Bubarnet
KRS wrote:
Finalement, j'ai trouvé une solution pour mon problème de répétition
de touches, je la met ici, au mieux ça peut vous faire rire, mais je
fais avec les moyens du bord.

Un grand merci à vous tous pour vos conseils.


Mon astuce en 2 scritp, un comportement associé a un sprite caché qui
est présent temps que je veux que les touches soient prises en compte,
et un script d'anim.
______________
comportement :

property pNdReplay

on beginSprite me
pNbreplay
-- appel dans le script d'anim
the keyDownScript = "shortcutDown"
the keyUpScript = "shortcutUp"
end

on exitFrame me
if pNbReplay > 2 then
--lance le gestionnaire de raccourci clavier
shortcutList()
end if
end


Je ne saisis pas l'intérêt de tester pNBReplay ?
(dans ton beginsprite, je suppose que tu voulais mettre pNBreplay=0 )
Premier appui->appel à shortcutdown : pNBreplay=1. La touche ne réagit pas à
l'appui
Première répétition -> appel à shortcutdown : pNBreplay=2. Ca réagit
Chaque répétition-> pNBreplay>2. Ca réagit à la vitesse des répétitions
claviers

A part empêcher la première action, qu'as-tu voulu faire ?

__________________
le script d'anim :

on shortcutDown
-- compte le nombre de répétition de la touche
spriteCaché.pNbReplay = spriteCaché.pNbReplay + 1
end

on shortcutUp
-- reset le nombre de répétition
spriteCaché.pNbReplay = 0
--lance le gestionnaire de raccourci
shortcutList()
end


Tu exécutes shortcutlist() à chaque keyup. C'est bon pour compenser la
non-action sur le premier keydown()
Mais dès que les répétitions ont commencé, tu vas exécuter un shortcutlist()
en plus.

--
Bubar
Freelance Multimédia - internet
Création de logiciels multimédia et sites web
http://www.wapitistudio.com
Avatar
KRS
Bubarnet wrote:
KRS wrote:
Je ne saisis pas l'intérêt de tester pNBReplay ?



pour que l'action se fasse au relachement de la touche (ou en rpétition)

sinon, elle s'effectue à l'enfoncement, et à nouveau une fois au
relachement.

(dans ton beginsprite, je suppose que tu voulais mettre pNBreplay=0 )



oui, coquille.

Premier appui->appel à shortcutdown : pNBreplay=1. La touche ne réagit pas à
l'appui
Première répétition -> appel à shortcutdown : pNBreplay=2. Ca réagit
Chaque répétition-> pNBreplay>2. Ca réagit à la vitesse des répétitions
claviers

A part empêcher la première action, qu'as-tu voulu faire ?



rien d'autre que d'empècher cette première action.

Tu exécutes shortcutlist() à chaque keyup. C'est bon pour compenser la
non-action sur le premier keydown()
Mais dès que les répétitions ont commencé, tu vas exécuter un shortcutlist()
en plus.



Cette execution en plus ne se ressent pas puisque la répétition se fait
à toute vitesse, mais effectivment ce n'est pas très propre.

En fait après réfléxion, j'aurais très bien pu me contenter de
répercuter directement l'activation du keyDownScript sur le on
exitFrame, sans me soucier de pNbReplay.
Mais je suis partit de l'idée que l'action devais se faire au
relachement de la touche, et non à l'enfoncement. tout ce bazar sert
donc à éviter d'avoir une double action quand on appuie brièvement sur
la touche.
Avatar
Bubarnet
[snip]
En fait après réfléxion, j'aurais très bien pu me contenter de
répercuter directement l'activation du keyDownScript sur le on
exitFrame, sans me soucier de pNbReplay.
Mais je suis partit de l'idée que l'action devais se faire au
relachement de la touche, et non à l'enfoncement. tout ce bazar sert
donc à éviter d'avoir une double action quand on appuie brièvement sur
la touche.


J'avais compris le fonctionnement, mais c'est le coté utilisateur qui
m'avait "dérangé". Une liste déroulante ne fonctionne pas comme ça.
Regarde du coté de flushinputevent : tu réagis à chaque keydown. En cas de
keyup, tu flush les keydown restant pour éviter que ton prog ne tourne en
boucle après l'arrêt du keydown

Mais pour réagir bien mieux, je suis partisan de l'utilisation de the
actorlist (une manière détournée de faire un exitframe), en gérant toi-même
la répétition (si la touche est appuyé alors je réagis, et pas à chaque
envoi d'un message je réagis)

C'est un peu plus complexe à mettre en oeuvre, mais bien plus propre au
niveau gestion des évènements

--
Bubar
Freelance Multimédia - internet
Création de logiciels multimédia et sites web
http://www.wapitistudio.com
Avatar
KRS
> J'avais compris le fonctionnement, mais c'est le coté utilisateur qui
m'avait "dérangé". Une liste déroulante ne fonctionne pas comme ça.
Regarde du coté de flushinputevent : tu réagis à chaque keydown. En cas de
keyup, tu flush les keydown restant pour éviter que ton prog ne tourne en
boucle après l'arrêt du keydown



FlushInputEvents() ça c'est une découverte bien pratique!


Mais pour réagir bien mieux, je suis partisan de l'utilisation de the
actorlist (une manière détournée de faire un exitframe), en gérant toi-même
la répétition (si la touche est appuyé alors je réagis, et pas à chaque
envoi d'un message je réagis)

C'est un peu plus complexe à mettre en oeuvre, mais bien plus propre au
niveau gestion des évènements



Et bien merci pour ces astuces, j'en prend bonne note.