Simulateur de lancé de dés
Bonsoir,
suite à différentes recherches infructueuses sur le NET je me suis enfin lancé dans la création d'un lanceur de dés sous Excel en VBA avec la technique de waard au niveau du crop des images afin de créer l'animation.
Ce soir je le met en validation auprès de Sébastien.
Ce projet est le début de ma volonté de création d'interface pour mon projet de La Quête des Héros. Ici il y a de 1 à 5 dés "normaux". Mon projet consiste à avoir un lancé de 2 dés normaux pour les déplacements et 5 dés spéciaux pour les combats. Cette deuxième partie n'est pas finalisée, il y a un gros travail à faire sur l'application de "sticker" correspondant aux faces spéciales de ces dés : 3 crânes, 2 boucliers noirs et 1 bouclier blanc.
Bref, la structure est faite, encore un peu de paint.net et les deux lanceurs seront prêts !
A moi le codage du reste du jeu !
@ bientôt
LouReeD
Bonjour,
la première barre est atteinte ! 10 téléchargements !
On se donne rendez-vous pour la barre des 100 !
@ bientôt
LouReeD
Bonjour,
je ne suis pas un fou de fichier de 3D, mais si l'un entre vous avez une séquence de rotation de dès plus "propre" alors je suis preneur !
@ bientôt
LouReeD
Hello,
il y a aussi possibilité de faire l'animation de lancer de dés dans une fenêtre edge en mode app (sans barres de titre et autres barres) en utilisant le protocole CDP pour lancer et communiquer avec Edge. Le principe , dans une macro VBA, on lance EDGE en mode app en positionnant et dimensionnant sa fenêtre , en ouvrant un fichier html qui contient du javascript pour faire l'animation. Au bout de 2 secondes , on lance les dés et on attend qu'il y ait un résultat. Quand il y a un résultat on met ce resultat dans la feuille Excel. Le code VBA :
Sub Test_CDP_Dices()
' J.P Juillet 2024
Dim objBrowser As New CDPBrowser
Dim elem As CDPElement
Dim de1 As CDPElement, de2 As CDPElement, lancer As CDPElement
On Error GoTo ErrHandler
'on lance MS EDGE avec une position et une taille données en chargeant la page avec les dés
1 objBrowser.start "edge", cleanActive:=True, reAttach:=True, _
addArgs:="--window-size=""400,350"" --window-position=""20,280""" & _
" --app=file:///D:/Temp/dices/index.html"
' on récupère les éléments utiles de la page
Set de1 = objBrowser.getElementByID("de1")
Set de2 = objBrowser.getElementByID("de2")
Set lancer = objBrowser.getElementByID("rollButton")
'on attend 2 secondes et on clique sur le bouton de lancer de dés
objBrowser.sleep 2
lancer.click
' on attend que les valeurs de dés changent
While de1.innerText = "0"
objBrowser.sleep 0.5
DoEvents
Wend
' on récupère les valeurs de dés
Debug.Print de1.innerText
Debug.Print de2.innerText
Worksheets("Lancer de dés").Range("A1") = de1.innerText
Worksheets("Lancer de dés").Range("B1") = de2.innerText
' on attend 10 secondes avant de fermer la fenêtre avec les dés
objBrowser.sleep 10
objBrowser.quit
Set objBrowser = Nothing
Exit Sub
ErrHandler:
Debug.Print "Erreur ligne " & Erl: objBrowser.quit: Set elem = Nothing: Set objBrowser = Nothing
End Sub
On peut utiliser d'autres scripts plus élaborés pour avoir une animation encore plus réaliste. Il existe d'autres animations où les faces de dés sont réalisées à partir d'images :
Ami calmant, J.P
Bonsoir,
merci pour la démonstration, mais ceci me semble "un peu lourd" pour ce quoi je veux en faire...
En effet il faut ajouter le protocole CDP si j'ai bien suivi, et ceci ne fonctionnera pas sur une machine où se dernier ne sera pas installé, n'est-ce pas ?
Non moi je cherche juste une ligne d'image de l'animation d'un dés qui se termine sur chacune des 6 faces possibles.
je ne maitrise pas les logiciels "3D" mais ceci pourrait être la solution d'autant que je cherche la "même chose" avec des faces de dés particulières...
Merci de vous être pencher sur cette affaire. Pour un jeu de Yams, ou bien un lancé de dés pour le déplacement d'un pion ce que je propose me convient, il me reste à créer les mêmes bandes d'images avec les faces spéciales Hero Quest.
@ bientôt
LouReeD
Salut,
non le protocole CDP n'a pas besoin d'être ajouté, il est présent dans les navigateurs Edge, chrome.
La seule exigence c'est d'être sous windows 10 ou 11 car edge est toujours installé sous ces environnements.
La gestion du CDP se fait par des modules de classes VBA qui sont soient dans le classeur ou dans un complément xlam. Le classeur a besoin d'un répertoire sous son chemin où il y a le fichier html .html , un fichier css .css, un fichier javascript .js , les images qui sont sur les faces des dés.
Le classeur avec les modules de classes dedans fait 250ko et le répertoire avec tous les fichiers web et images dedans : 60 ko
Entre temps , j'ai réussi à faire le lancer de dés avec des faces HeroQuest : voir ici : Lancer de dés
Ami calmant, J.P
Bonjour,
Cette vidéo me plaît énormément !
Comment tout récupérer "chez moi" ? Avec les explications passées je n'y suis point arrivé !
Une question : la vitesse de l'animation est elle réglable ?
Merci à vous pour votre proposition !
@ bientôt
LouReeD
Salut LouReed,
je ne maitrise pas ce paramètre , par contre je sais où l'on peut changer la durée de lancer des dés (dans le fichier javacript). Et avec l'I.A maintenant celle-ci est capable de te fabriquer un code qui fait ce que tu veux si tu expliques bien. D'ailleurs c'est l'I.A qui m'a réalisé toute la partie Web suivant mes directives. J'ai une version en préparation où les paramètres du lancer de dés sont fournis par des cellules nommées (type de dés, nombre de dés ). Je fournirai un fichier zip qui contient un répertoire avec dedans un classeur de démo qui contient les classes CDP , et aussi dans le répertoire les fichiers web et images . Voici où j'en suis :
Mais il faudrait que je sache comment tu comptes l'utiliser. Par exemple là je cache le bouton de lancer pour éviter de relancer un lancement pendant l'animation.
En tout cas c'est pas compliqué pour passer les paramètres qui sont dans la feuille et pour récupérer le résultat.
Ami calmant, J.P
Bonjour,
l'utilisation en serait très simple :
un plateau de jeu, avec des aventuriers, ces derniers se déplacent avec le lancé de dés normaux, deux par défaut, 1 ou 3 éventuellement suivant les effets des sorts en cours. Lors de rencontre avec des "monstres" (Lutins maléfiques, Orcs, Fimirs, Zonbis, Squelettes, Momies, Gargouilles, Guerrier du Chaos et le grand méchant sorcier), il y a un lancé de dés spéciaux (avec 3 crânes, 2 boucliers blancs et 1 bouclier noir) à tour de rôle, pour connaitre les points de dégâts infligés à la créature ou au joueur.
Donc lorsque le joueur arrivera à son tour de déplacement, il l'indique avec un bouton (en effet il peut faire des actions avant de bouger, ou bouger avant de faire des actions, donc il faut un clic pour annoncer son jeu), le module de lancement de dés normaux s'affiche, on lance les dés, on obtient un résultat, le module "peut s'effacer" . A voir selon la mise en place des éléments si vraiment il y a besoin qu'il disparaisse.
De même lors de la demande d'un combat, c'est le module avec les dés spéciaux qui s'affiche, le nombre de dés dépendant du personnage et des sorts éventuellement en place sur lui. Pour les monstre il en est de même, le nombre de dés dépend du type de monstre voir des ses caractéristiques propre en fonction du scénario.
Votre dernière proposition avec les dés spéciaux me va vraiment bien, j'avais un doute sur le "module complémentaire" page web, mais cela semble bien.
En plus vous me parlez de javascript, je connais un peu... Mais c'était il y a longtemps ! j'avais fait un site pour la famille pour distribuer les photos, tout était géré par javascript et PHP !
Mais avec le développement des blogs... Nul besoin de s'embêter avec des choses perso !
Si j'ai bien compris vous mettrez à disposition un fichier Excel équipé de tout ce qu'il faut pour créer ce module de lancement de dés ?
Restera plus qu'à vous de le mettre en téléchargement pour de futurs utilisateurs ! Ou bien je le ferais !
@ bientôt
LouReeD
Salut,
En pièce jointe,
un zip contenant tous les fichiers. Pas de soucis pour l'utilisation , à partir du moment où les auteurs des codes ne sont pas supprimés des commentaires des codes. CDP est en licence MIT ce qui permet de l'utiliser librement. J'ai ajouté quelques trucs pour améliorer le programme :
1 - J'utilise UIAutomation (toujours présent dans les windows) pour positionner la fenêtre de lancer de dé sur la cellule A4 de la feuille active.
2 - Je ne lance msedge qu'une seule fois au démarrage puis si on l'utilise plusieurs fois , je le cache et je le montre. Cela accélère le lancement de la fenêtre. Alors quand on ferme le classeur, il ne faut pas oublier de fermer l'appli edge, ce qui est fait dans le beforeclose de thisworkbook.
3 - dans le javascript je bloque les événements souris pour éviter de faire des actions dans la fenêtre.
4 - A voir aussi à ajouter du code avec des API pour que la fenêtre soit toujours devant (elle peut passer derrière).
Testé sur Excel 2016 windows 11.
Ami calmant, J.P
Bonjour,
Hummm, hummm ... vous avez oubliez de rendre le fichier visible...
A moins que ce soit le site... sinon loureed@laposte.net.
Merci à vous.
@ bientôt
LouReeD
Ha ben non il est là...
Mystère, Mystère...
Merci, je regarde cela le plus vite possible !
@ bientôt
LouReeD
Si tu as une erreur à cet endroit , c'est que certainement objBrowser est à Nothing. Il y a du avoir une erreur avant le InitBrowser. Dis moi Quelle ligne est indiquée en erreur dans la fenêtre d'exécution VBA sinon met en commentaire la ligne On Error au début du code. Si l'erreur se produit sur la ligne 1 , il y a un souci avec UIAutomation, vérifier que uiautomationclient est bien coché dans les références VBA. Attention si il y a des blancs ou des accents dans le chemin du fichier html index.html , il peut y avoir des problèmes.
et pour que cela soit plus propre remplacer le code du gestionnaire d'erreur :
ErrHandler:
MsgBox "Erreur ligne " & Erl & " : " & Err.Description
FermerEdge
End SubBonjour,
une fois les modifications faites, voici ce que j'obtiens :
et quand je débogue je tombe là dessus :
Le chemin d'accès est bon, à moins que le "file" soit de trop...
Pour info le fichier index.html lancé seul ne fonctionne pas, alors que je pense qu'il devrait pouvoir être utilisable en autonome, non ?
Merci @ vous.
@ bientôt
LouReeD
Bonjour,
en supprimant ceci de la fonction : cleanActive:=False,
cela fonctionne ! Cette instruction est-elle absolument nécessaire ?
il me reste à vérifier ce fonctionnement en "répétitif" comme dans le futur jeu, ainsi que sa position.
Merci @ vous.
@ bientôt
LouReeD
Salut,
qu'est-ce qui ne fonctionne pas quand tu lances l'index.html directement? Si tu vois la page mais que tu ne peux rien faire dedans , c'est normal j'ai bloqué l'utilisation de la souris dans le script js (bloquer interactions utilisateurs à la fin du script).
Pour le problème du cleanActive , j'ai eu le même problème , en fait il faut le mettre à True (réinitialise la session).
Ami calmant, J.P
Bonsoir,
Je commence à m'approprier les codes fournis.
J'ai déjà modifier pas mal de choses afin de l'adapter à mes besoins et "goûts" :
j'ai supprimé le fond pour le mettre en noir,
j'ai modifié les images des dés de combat,
j'ai modifié les faces des dés classiques (rouge à point blanc),
j'ai modifié l'ordre des faces de ces dés afin de respecter la règle du "7" : la somme des faces opposées doit être égale à 7 : 6-1, 5-2, 4-3.
j'ai supprimé l'effet 3D sur les dés à l'arrêt,
j'ai modifié la taille des dés afin de masquer au maximum les effet de bord lors de la rotation au niveau de la jonction des faces,
j'ai adapté la taille de la fenêtre en fonction du nombre de dés,
j'ai augmenté la possibilité du nombre de dés utilisables jusqu'à 10 (par rapport à la ligne du dessus j'adapte avec 5 dés de large et deux lignes de dés).
j'ai fait de façon à ce que le lancé précédent reste si un nouveau lancé "identique" est demandé.
Il me reste à faire :
Gardé en mémoire la position des derniers dés joués, lors de la modification du nombre de dés à jouer :
si pour les classique je lance 3 dés et que j'obtiens 1, 2 et 3, alors si je passe à 5 dés, je garde la position des 3 premiers : 1, 2 et 3 et j'en initialise 2 à 1.
Et si je passe à 2 dés, alors le troisième est effacée, la fenêtre est adaptée, et je garde les 2 dés restants à 1 et 2.
Je me demande une chose, on peut insérer un élément Web dans Excel je crois, afin que sa position soit "définitive" et cela éviterait la disparition suite à un clic, non ?
ou bien alors j'ai oublié de supprimer la suppression des évènement...
Faut que je regarde.
L'archive ainsi modifiée :
@ bientôt
LouReeD
Salut,
- 1 - ton classeur ne fonctionne pas chez moi car tu as mis en "dur" le chemin du fichier index.html
- 2 - les dés ne sont pas alignés et ils me semblent un peu petits.
- 3 - Pour avoir la fenêtre des dés toujours devant voilà ce qu'il faut faire :
- a - Dans le module de classe CDPBrowser rajouter une fonction publique pour récupérer le Handle de la fenêtre :
'===============================================================================================
' Experimental Functions
'===============================================================================================
Public Function getHwnd() As LongPtr
getHwnd = brHWnd
End Functionet dans le module module1 ajouter ceci dans la déclaration VBA 7
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
' Constants
Private Const HWND_TOPMOST As LongPtr = -1
Private Const HWND_NOTOPMOST As LongPtr = -2
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_SHOWWINDOW As Long = &H40et ajouter cette fonction :
Sub MakeWindowTopMost(hwnd)
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW
End SubDans la procédure de lancement ajouter ceci :
objBrowser.show xywh:=CStr(x) & " " & CStr(y) & " " & Largeur & " " & Hauteur
MakeWindowTopMost objBrowser.getHwnd()
Ami calmant, J.P
Bonjour,
Le but est "esthétique", donc oui les dés sont petit mais ce n'est pas un Yams...
C'est un jeu de plateau Héros Qu'est, donc c'est joli les dés qui tournent mais ça ne doit pas prendre la vedette au reste !🤣
Désolé pour le chemin en dur.
Merci pour l'ajout de code, je vais voir.
Sinon le protocole est un peu lourd, non ? Y a t il vraiment besoin de tout cela ?
L'alignement des dés en fin de lancé n'est pas utile et cela ajoute un peu de "vérité" au lancé !
J'ai commencé à l'intégrer à l'application La quête des Héros, mais j'ai une erreur dès le début de la Sub de lancé... A voir...
Merci encore à vous pour tout ceci.
@ bientôt
LouReeD

