-
Conseils pour un jeu
Bonjour !
J'ai en projet la création d'un jeu de lettres sur Silverlight. C'est un jeu de type Scrabble, avec un plateau de 15x15 cases et un chevalet contenant 7 lettres tirées au hasard.
Je découvre Silverlight et je ne sais pas trop dans quelle direction me tourner pour créer le plateau (quels contrôles seraient les mieux appropriés ?), le chevalet, ainsi que gérer le drag and drop des lettres entre le chevalet et les cases du plateau.
Avant de partir dans une mauvaise direction... que me conseilleriez-vous ? Je ne cherche pas du code tout fait mais juste une orientation pour éviter de patauger. :) Merci !
-
Hello,
Pour la gestion du drap'n'drop, je te conseille au mois de jeter un oeil sur le dernier Toolkit : http://www.codeplex.com/silverlight . D'une manière générale, c'est une bonne base de travail aussi.
Bon courage et n'hésites pas à revenir nous dire où tu en es!
Bye,
David Rousset
Microsoft France
-
Pour l'affichage je te dirais bien de partir sur des ListBox dont tu modifies le template et le paneltemplate.
Un StackPanel horizontal pour le chevalet et un WrapPanel limité à 15 cases pour le plateau.
Tu peux du coup bénéficier du Drag&Drop du Toolkit :)
-
Merci pour vos conseils !
J'avance bien, j'ai terminé le lobby (tchat et accès aux tables de jeu) et presque fini la gestion des entrées-sorties dans les tables. Une vingtaine d'accros à l'ancien jeu viennent tester tout ça régulièrement, pour l'instant ça tient le choc. Je vais pouvoir commencer à m'amuser avec le jeu proprement dit.
Je retiens l'idée des ListBox avec les Templates.
Je découvre toute la richesse de Silverlight au fur et à mesure de mon avancée, je trouve ce truc-là prodigieux.
Une question concernant Silverlight 4 : je suis bien tenté de continuer le développement avec la bêta, mais je ne sais pas si c'est encore prématuré ? Sachant que mon application n'exploite aucun truc sophistiqué, juste des contrôles très classiques.
-
Si ça intéresse d'autres personnes, voila comment j'ai procédé finalement :
- Deux Grids pour le chevalet et pour la grille
- Les "cellules" de ces deux Grids sont remplies avec des rectangles
Les lettres sont figurées par des UserControls "Piece" (Rectangle + TextBlock affichant la lettre).
Le Drag and Drop est géré par les événements MouseLeftButtonDown, MouseMove et MouseLeftButtonUp, comme proposé par la doc de Silverlight.
Pour déplacer la pièce, je modifie tout bêtement ses quatre marges (Margin).
Des marges -éventuellement négatives- qui excèdent les dimensions du conteneur permettent à un contrôle de s'extraire visuellement de celui-ci.
Affecter -1 aux marges Top et Left et +1 aux marges Bottom et Right déplace par exemple la pièce d'1 pixel vers la gauche et le haut. Tout en restant "enfant" du chevalet, visuellement elle peut se ballader sur toute la fenêtre.
Au moment du "Drop", je peux vérifier si la pièce se trouve sur la grille ou sur le chevalet à l'aide de ses nouvelles coordonnées et de la méthode VisualTreeHelper.FindElementsInHostCoordinates :
Code:
Dim coll = VisualTreeHelper.FindElementsInHostCoordinates(coords, Me.Grille)
Si la pièce se trouve sur la grille, je retrouve un des rectangles qui la remplissent dans la collection renvoyée. Il suffit que je récupère les index de ligne et de colonne de ce rectangle pour atterrir au bon endroit. Idem pour le chevalet.
Si le mouvement est interne à la grille ou au chevalet, je modifie simplement la ligne et la colonne de la pièce dans la Grid où elle se trouve. Si elle s'est baladée de l'un à l'autre, je supprime la pièce d'origine et j'en recrée une nouvelle dans la Grid de destination.
Pour éviter que la pièce se ballade "derrière" d'autres contrôles, je mets son ZIndex à 100 au moment du Drag et je le rabaisse au moment du Drop.
Enfin, pour annuler le mouvement d'une pièce (si elle n'a été lâchée ni sur la grille ni sur le chevalet), je remets tout bêtement ses marges à zéro.