Projet Pocket-Cible
L'arrivée de Livecode dans sa version Community m’a donné le goût de reprendre mon projet. Dans un premier temps, je dois m'approprier ce langage très littéral et assez déroutant au début. Le projet sera porté sur Mac, Linux et Windows dans un premier temps. Puis certainement sur Android, j'en connais une qui attends cela depuis longtemps. Et enfin, en fonction de mes moyens, sur iMachine car il faut une version payante de Livecode.
Je vais vous présenter mon premier projet très modeste. Celui-ci va servir de base à un projet plus ambitieux que je vais enrichir dans les prochains mois. Je vais aborder la saisie simplifiée d'une feuille de marque d'entraînement de tir à l'arc.
Pour débuter, nous partirons sur un entraînement de deux séries de six volées de six flèches ce qui correspond à un tir Fédéral ou FITA. Pour plus de renseignements sur la pratique du tir à l'arc, voir le site de la F.F.TA.
Présentation du projet
Notre programme ne comportera pas encore de base de données. Nous utiliserons un tableau multidimensionnel pour stocker la saisie des impacts de flèches.
Nom du Tableau | Série | Volée | Flèche |
---|---|---|---|
1ère dimension | 2 ème dimension | 3 ème dimension | |
gArrayImpact | 1 à 2 | 1 à 6 | 1 à 6 |
Pour l'instant, nous opterons pour un entraînement de deux séries comprenant chacune six volées de six flèches.
Nous utiliserons de simples objets button pour la saisie des impacts. Des field seront utilisés pour afficher le résultat.
Nous utiliserons de simples objets button pour la saisie des impacts. Des field seront utilisés pour afficher le résultat.
Création de la pile (mainstack) volee.livecode
La pile comportera une carte (card) nommée SaisieBlason. Créez les boutons correspondants à la saisie des impacts sur le blason, les label fields correspondants à valeurs des impacts de flèches, les trois scroolbars représentant de haut en bas : la série, la volée et les flèches. Le bouton M représente un manqué, une flèche hors du blason. Le bouton AC permet d'annuler toute la volée. Le bouton suivant permet d'accéder à la volée suivante. Il sera visible seulement lorsque la saisie se trouvera sur la dernière flèche du blason.
Fonctionnement du programme
L'initialisation du programme
On centralisera le code au maximum dans le handler de la carte SaisieBlason, celui-ci contiendra les déclarations de variables, les événements (command handler), les commandes personnalisées et les fonctions de notre programme. On commencera par l'initialisation du tableau gArrayImpact et des objets de la pile. Pour plus de souplesse, déclarons notre tableau en portée global.
global gArrayImpact
Nous allons utiliser l'événement preopenstack pour faire l'initialisation des variables et objets. A chaque chargement de la pile, on appliquera l'initialisation. Pour initialiser le tableau, on utilisera une commande personnalisée avec le passage du tableau en argument.
on preopenstack
#initialisation du tableau gArrrayImpact
initialisation_tableau gArrayImpact
#initialisation des scrollbars
set the endValue of Scrollbar "ScrollNumFleche" to 6
Set the thumbPosition of Scrollbar "ScrollNumFleche" to 1
set the endValue of Scrollbar "ScrollNumSerie" to 2
Set the thumbPosition of Scrollbar "ScrollNumSerie" to 1
set the endValue of Scrollbar "ScrollNumVolee" to 6
Set the thumbPosition of Scrollbar "ScrollNumVolee" to 1
#initialisation bouton volée suivante
Set the visible of button "BtnSuivant" to false
#remise à zéro de l'affichage
Affiche_Volee
end preopenstack
Voici la commande personnalisée Affiche_Volee. On peut la comparer à une procédure. On récupère la position de notre volée avec les scrollbars. On identifie la flèche courante pour la saisie en affichant le texte du label field en rouge. Une commande personnalisée trie_volee nous permettra d"'afficher les valeurs de la volée triées en commençant par la valeur la plus forte. Nous terminerons par le calcul de la somme.
on Affiche_Volee
# Déclaration des variables
local tNumSerie, tNumVolee, tNumFleche, tArrayTri
# récupération de la position dans le tableau Série, Volée, Flèche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
# focus en rouge de la flèche active
set the textColor of Field "LblImpact1" to black
set the textColor of Field "LblImpact2" to black
set the textColor of Field "LblImpact3" to black
set the textColor of Field "LblImpact4" to black
set the textColor of Field "LblImpact5" to black
set the textColor of Field "LblImpact6" to black
switch tNumFleche
case 1
set the textColor of Field "LblImpact1" to red
break
case 2
set the textColor of Field "LblImpact2" to red
break
case 3
set the textColor of Field "LblImpact3" to red
break
case 4
set the textColor of Field "LblImpact4" to red
break
case 5
set the textColor of Field "LblImpact5" to red
break
case 6
set the textColor of Field "LblImpact6" to red
break
end switch
# affectation des valeurs des impacts de flèche dans les label field
put gArrayImpact[tNumSerie][tNumVolee][1] into Field "LblImpact1"
put gArrayImpact[tNumSerie][tNumVolee][2] into Field "LblImpact2"
put gArrayImpact[tNumSerie][tNumVolee][3] into Field "LblImpact3"
put gArrayImpact[tNumSerie][tNumVolee][4] into Field "LblImpact4"
put gArrayImpact[tNumSerie][tNumVolee][5] into Field "LblImpact5"
put gArrayImpact[tNumSerie][tNumVolee][6] into Field "LblImpact6"
# tri de la volée du plus fort au plus faible (convention des feuilles de marque)
#affectation d'un tableau provisoire
put gArrayImpact[tNumSerie][tNumVolee][1] into tArrayTri[1]
put gArrayImpact[tNumSerie][tNumVolee][2] into tArrayTri[2]
put gArrayImpact[tNumSerie][tNumVolee][3] into tArrayTri[3]
put gArrayImpact[tNumSerie][tNumVolee][4] into tArrayTri[4]
put gArrayImpact[tNumSerie][tNumVolee][5] into tArrayTri[5]
put gArrayImpact[tNumSerie][tNumVolee][6] into tArrayTri[6]
#commande personnalisée de tri
trie_volee tArrayTri
# Calcul de la volée
put 0 into Field "LblVolee"
repeat with count = 1 to 6
add gArrayImpact[tNumSerie][tNumVolee][count] to Field "LblVolee"
end repeat
end Affiche_Volee
La procédure de tri trie_volee utilise des particularité du langage Livecode récupéré sur le forum de Livecode.
on trie_volee @tArray
#récupération des clés du tableaux dans la variable spéciale it
get the keys of tArray
#tri des clés en fonction des valeurs du tableau
sort lines of it numeric descending by tArray[each]
#conversion en array du resultat
split it by return
#affichage par rapport au tableau trié it
put tArray[it[1]] into Field "LblImpactGroupe1"
put tArray[it[2]] into Field "LblImpactGroupe2"
put tArray[it[3]] into Field "LblImpactGroupe3"
put tArray[it[4]] into Field "LblImpactGroupe4"
put tArray[it[5]] into Field "LblImpactGroupe5"
put tArray[it[6]] into Field "LblImpactGroupe6"
end trie_volee
global gArrayImpact
Nous allons utiliser l'événement preopenstack pour faire l'initialisation des variables et objets. A chaque chargement de la pile, on appliquera l'initialisation. Pour initialiser le tableau, on utilisera une commande personnalisée avec le passage du tableau en argument.
on preopenstack
#initialisation du tableau gArrrayImpact
initialisation_tableau gArrayImpact
#initialisation des scrollbars
set the endValue of Scrollbar "ScrollNumFleche" to 6
Set the thumbPosition of Scrollbar "ScrollNumFleche" to 1
set the endValue of Scrollbar "ScrollNumSerie" to 2
Set the thumbPosition of Scrollbar "ScrollNumSerie" to 1
set the endValue of Scrollbar "ScrollNumVolee" to 6
Set the thumbPosition of Scrollbar "ScrollNumVolee" to 1
#initialisation bouton volée suivante
Set the visible of button "BtnSuivant" to false
#remise à zéro de l'affichage
Affiche_Volee
end preopenstack
Voici la commande personnalisée Affiche_Volee. On peut la comparer à une procédure. On récupère la position de notre volée avec les scrollbars. On identifie la flèche courante pour la saisie en affichant le texte du label field en rouge. Une commande personnalisée trie_volee nous permettra d"'afficher les valeurs de la volée triées en commençant par la valeur la plus forte. Nous terminerons par le calcul de la somme.
on Affiche_Volee
# Déclaration des variables
local tNumSerie, tNumVolee, tNumFleche, tArrayTri
# récupération de la position dans le tableau Série, Volée, Flèche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
# focus en rouge de la flèche active
set the textColor of Field "LblImpact1" to black
set the textColor of Field "LblImpact2" to black
set the textColor of Field "LblImpact3" to black
set the textColor of Field "LblImpact4" to black
set the textColor of Field "LblImpact5" to black
set the textColor of Field "LblImpact6" to black
switch tNumFleche
case 1
set the textColor of Field "LblImpact1" to red
break
case 2
set the textColor of Field "LblImpact2" to red
break
case 3
set the textColor of Field "LblImpact3" to red
break
case 4
set the textColor of Field "LblImpact4" to red
break
case 5
set the textColor of Field "LblImpact5" to red
break
case 6
set the textColor of Field "LblImpact6" to red
break
end switch
# affectation des valeurs des impacts de flèche dans les label field
put gArrayImpact[tNumSerie][tNumVolee][1] into Field "LblImpact1"
put gArrayImpact[tNumSerie][tNumVolee][2] into Field "LblImpact2"
put gArrayImpact[tNumSerie][tNumVolee][3] into Field "LblImpact3"
put gArrayImpact[tNumSerie][tNumVolee][4] into Field "LblImpact4"
put gArrayImpact[tNumSerie][tNumVolee][5] into Field "LblImpact5"
put gArrayImpact[tNumSerie][tNumVolee][6] into Field "LblImpact6"
# tri de la volée du plus fort au plus faible (convention des feuilles de marque)
#affectation d'un tableau provisoire
put gArrayImpact[tNumSerie][tNumVolee][1] into tArrayTri[1]
put gArrayImpact[tNumSerie][tNumVolee][2] into tArrayTri[2]
put gArrayImpact[tNumSerie][tNumVolee][3] into tArrayTri[3]
put gArrayImpact[tNumSerie][tNumVolee][4] into tArrayTri[4]
put gArrayImpact[tNumSerie][tNumVolee][5] into tArrayTri[5]
put gArrayImpact[tNumSerie][tNumVolee][6] into tArrayTri[6]
#commande personnalisée de tri
trie_volee tArrayTri
# Calcul de la volée
put 0 into Field "LblVolee"
repeat with count = 1 to 6
add gArrayImpact[tNumSerie][tNumVolee][count] to Field "LblVolee"
end repeat
end Affiche_Volee
La procédure de tri trie_volee utilise des particularité du langage Livecode récupéré sur le forum de Livecode.
on trie_volee @tArray
#récupération des clés du tableaux dans la variable spéciale it
get the keys of tArray
#tri des clés en fonction des valeurs du tableau
sort lines of it numeric descending by tArray[each]
#conversion en array du resultat
split it by return
#affichage par rapport au tableau trié it
put tArray[it[1]] into Field "LblImpactGroupe1"
put tArray[it[2]] into Field "LblImpactGroupe2"
put tArray[it[3]] into Field "LblImpactGroupe3"
put tArray[it[4]] into Field "LblImpactGroupe4"
put tArray[it[5]] into Field "LblImpactGroupe5"
put tArray[it[6]] into Field "LblImpactGroupe6"
end trie_volee
La saisie des impacts
Chaque bouton sera pourvu d'un événement dans son handler. Pour les boutons 10 à 1, le chiffre correspond à la valeur de l'impact.
on mouseUp
Saisie_impact 10
end mouseUp
la valeur bouton 10+ est 10 et pour le bouton M la valeur sera 0.
La commande personnalisée Saisie_impact sera stockée dans le handler de la carte.
on Saisie_impact NbValue
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
put NbValue into gArrayImpact[tNumSerie][tNumVolee][tNumFleche]
if the thumbPosition of Scrollbar "ScrollNumFleche" < 6 then
add 1 to tNumFleche
Set the thumbPosition of Scrollbar "ScrollNumFleche" to tNumFleche
else
if tNumSerie < 2 and tNumVolee < 6 then
Set the visible of button "BtnSuivant" to true
end if
end if
Affiche_Volee
end Saisie_impact
A chaque nouvelle saisie nous recalculons les impacts de flèches. On détermine si nous nous positionnons sur la dernière flèche l'affichage ou non du bouton volée suivante.
on mouseUp
Saisie_impact 10
end mouseUp
la valeur bouton 10+ est 10 et pour le bouton M la valeur sera 0.
La commande personnalisée Saisie_impact sera stockée dans le handler de la carte.
on Saisie_impact NbValue
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
put NbValue into gArrayImpact[tNumSerie][tNumVolee][tNumFleche]
if the thumbPosition of Scrollbar "ScrollNumFleche" < 6 then
add 1 to tNumFleche
Set the thumbPosition of Scrollbar "ScrollNumFleche" to tNumFleche
else
if tNumSerie < 2 and tNumVolee < 6 then
Set the visible of button "BtnSuivant" to true
end if
end if
Affiche_Volee
end Saisie_impact
A chaque nouvelle saisie nous recalculons les impacts de flèches. On détermine si nous nous positionnons sur la dernière flèche l'affichage ou non du bouton volée suivante.
Le déplacement avec les scroolbars
Le programme permet de se positionner automatiquement sur n'importe quel impact du tableau. On utilisera l'événement scrollbarDrag dans chaque handler des scrollbars.
on scrollbarDrag newValue
Affiche_Volee
end scrollbarDrag
Nous appellerons la commande personnalisée Affiche_Volee en utilisant les nouvelles valeurs des scrollbars.
on scrollbarDrag newValue
Affiche_Volee
end scrollbarDrag
Nous appellerons la commande personnalisée Affiche_Volee en utilisant les nouvelles valeurs des scrollbars.
L'annulation d'une volée
Pour annuler une volée, nous utiliserons l'handler du bouton AC
on mouseUp
annule_volee
end mouseUp
Nous appellerons une commande personnalisée nommé annule_volee stockée dans le handler de la carte.
on annule_volee
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put 0 into gArrayImpact[tNumSerie][tNumVolee][1]
put 0 into gArrayImpact[tNumSerie][tNumVolee][2]
put 0 into gArrayImpact[tNumSerie][tNumVolee][3]
put 0 into gArrayImpact[tNumSerie][tNumVolee][4]
put 0 into gArrayImpact[tNumSerie][tNumVolee][5]
put 0 into gArrayImpact[tNumSerie][tNumVolee][6]
Set the thumbPosition of Scrollbar "ScrollNumFleche" to 1
Affiche_Volee
end annule_volee
on mouseUp
annule_volee
end mouseUp
Nous appellerons une commande personnalisée nommé annule_volee stockée dans le handler de la carte.
on annule_volee
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put 0 into gArrayImpact[tNumSerie][tNumVolee][1]
put 0 into gArrayImpact[tNumSerie][tNumVolee][2]
put 0 into gArrayImpact[tNumSerie][tNumVolee][3]
put 0 into gArrayImpact[tNumSerie][tNumVolee][4]
put 0 into gArrayImpact[tNumSerie][tNumVolee][5]
put 0 into gArrayImpact[tNumSerie][tNumVolee][6]
Set the thumbPosition of Scrollbar "ScrollNumFleche" to 1
Affiche_Volee
end annule_volee
Volée suivante
Le bouton > permettra de passer à la volée suivante lorsque le bouton est visible.
on mouseUp
Nouvelle_Volee
end mouseUp
Nous appellerons une commande personnalisée nommé Nouvelle_volee stockée dans le handler de la carte.
on Nouvelle_Volee
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
if the the thumbPosition of Scrollbar "ScrollNumVolee" < 6 then
add 1 to tNumVolee
put 1 into tNumFleche
else
add 1 to tNumSerie
put 1 into tNumVolee
put 1 into tNumFleche
Set the thumbPosition of Scrollbar "ScrollNumSerie" to tNumSerie
end if
Set the thumbPosition of Scrollbar "ScrollNumVolee" to tNumVolee
Set the thumbPosition of Scrollbar "ScrollNumFleche" to tNumFleche
Set the visible of button "BtnSuivant" to false
Affiche_Volee
end Nouvelle_Volee
on mouseUp
Nouvelle_Volee
end mouseUp
Nous appellerons une commande personnalisée nommé Nouvelle_volee stockée dans le handler de la carte.
on Nouvelle_Volee
local tNumSerie, tNumVolee, tNumFleche
put the thumbPosition of scrollbar "ScrollNumSerie" into tNumSerie
put the thumbPosition of scrollbar "ScrollNumVolee" into tNumVolee
put the thumbPosition of scrollbar "ScrollNumFleche" into tNumFleche
if the the thumbPosition of Scrollbar "ScrollNumVolee" < 6 then
add 1 to tNumVolee
put 1 into tNumFleche
else
add 1 to tNumSerie
put 1 into tNumVolee
put 1 into tNumFleche
Set the thumbPosition of Scrollbar "ScrollNumSerie" to tNumSerie
end if
Set the thumbPosition of Scrollbar "ScrollNumVolee" to tNumVolee
Set the thumbPosition of Scrollbar "ScrollNumFleche" to tNumFleche
Set the visible of button "BtnSuivant" to false
Affiche_Volee
end Nouvelle_Volee
Conclusion
Et voici comment réaliser une petite application fonctionnelle en très peu de temps. Bon, c'est vrai, il m'a fallu quelques heures de travail pour s'approprier la syntaxe et trouver les solutions de tri mais avec l'expérience je devrais m'améliorer.
Voici le code source, vous pouvez l'améliorer, j'en suis sur ! n'hésitez pas à poster vos améliorations ou vos questions. Prochaine étape, le graphisme...
Voici le code source, vous pouvez l'améliorer, j'en suis sur ! n'hésitez pas à poster vos améliorations ou vos questions. Prochaine étape, le graphisme...