Hello !
Je me suis décidé à me mettre au WPF et pour avoir qqch de concret à faire, je développe un jeu de yahtzee.
J'ai donc affiché des images représentant les dés et je voudrais lors du click sur le bouton "Roll !" que les dés se mettent à jour (logique).
Si c'est juste changer d'image, pas de souci. Le truc, c'est que je voudrais donner une impression de "roulement". Du coup, je fais une boucle dans laquelle je change l'image. Seulement, l'affichage ne se rafraichit que quand le traitement est terminé (à la fin de la boucle donc) et on ne voit donc le changement qu'une seule fois (au lieu de plusieurs fois très vite).
Voici le code que j'ai produit pour cette partie :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| Private Sub btnRoll_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
listDicesToRoll.Clear()
For Each ctl As CheckBox In listDicesCheckbox
If Not ctl.IsChecked Then
Select Case ctl.Name
Case "ckbDice1"
listDicesToRoll.Add(imgDice1)
Case "ckbDice2"
listDicesToRoll.Add(imgDice2)
Case "ckbDice3"
listDicesToRoll.Add(imgDice3)
Case "ckbDice4"
listDicesToRoll.Add(imgDice4)
Case "ckbDice5"
listDicesToRoll.Add(imgDice5)
End Select
End If
Next
Dim x As Integer = 0
Dim rnd As New Random()
For i As Integer = 0 To 20
For Each imgCtl As Image In listDicesToRoll
x = rnd.Next(5) + 1
Dim img As New BitmapImage
img.BeginInit()
img.UriSource = New Uri("Resources\de" & x.ToString & ".png", UriKind.Relative)
img.EndInit()
imgCtl.Source = img
Next
i += 1
Next
iRollsLeft -= 1
If iRollsLeft <= 1 Then
txtRolls.Text = CStr(iRollsLeft) & " roll left..."
If iRollsLeft = 0 Then
btnRoll.IsEnabled = False
End If
Else
txtRolls.Text = CStr(iRollsLeft) & " rolls left..."
End If
End Sub |
Ce n'est clairement pas parfait... Je chipote encore pas mal. Par exemple, pour les dés, au niveau visuel j'ai :
- un stackpanel (nommé spDices) en orientation horizontal qui contient 5 fois :
un stackpanel qui contient une image et une checkbox
Comment parcourir avec une boucle for each les comboboxes contenues dans spDices ?
Si je fais :
For Each ctl as CheckBox in spDices.Children.OfType(Of CheckBox)()
Forcément il ne trouve rien vu que les enfants sont des stackpanels... Bref, faut être récursif mais je n'avais pas envie de commencer à tester le type de l'enfant pour voir si je dois le parcourir aussi... Du coup, j'ai mis les checkboxes dans une liste et je parcours la liste... Une idée de comment améliorer cela ?
Merci d'avance,
Griftou.
Partager