IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Jeu d'échec et ressource


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut Jeu d'échec et ressource
    Bonjour,

    Je développe un jeu d'échec en WPF.
    J'ai placé dans un ResourceDictionary les Canvas nécessaires pour dessiner les pièces :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    	<Canvas x:Key="BlackBishop" Width="45" Height="45" ClipToBounds="True">
    	...
    	</Canvas>
    	<Canvas x:Key="BlackKing" Width="45" Height="45" ClipToBounds="True">
    	...
    	</Canvas>
    	...
    </ResourceDictionary>

    Dans ma classe ChessPiece qui est ma classe de base de mes pièces d'échec
    j'initialise un resourceDictionary en statique :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class ChessPiece : Piece
    {
    	private static ResourceDictionary resourceDictionary;
     
    	public ChessPiece(short x, short y, ChessPieceColor color) : base(x, y)
    	{
    		// Create the static resource
    		if(resourceDictionary == null)
    		{
    			resourceDictionary = new ResourceDictionary();
    			resourceDictionary.Source = new Uri("/EchecEtMat;component/Pieces/Resources/ResourceDictionary.xaml", UriKind.Relative);
    		}
    		Color = color;
    	}
     
    	public override void Draw()
    	{
    		// Get the canvas in the resource
    		this.Content = resourceDictionary[GetResourceKeyToDraw()];
    	}
    }

    La fonction GetResourceKeyToDraw() me retourne la clef de la ressource à utiliser pour la pièce à dessiner: c'est à dire BlackBishop ou BlackKing...

    Le problème c'est que je ne peux pas dessiner plusieurs fois la même pièce (dommage pour un jeu d'échec )
    L'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Content = resourceDictionary[GetResourceKeyToDraw()];
    sort en erreur si la ressource à déjà été utilisé :
    L'élément spécifié est déjà l'enfant logique d'un autre élément. Déconnectez-le d'abord
    Comment faire?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bah un Canvas est un contrôle, il ne peut avoir qu'un seul parent...
    Pourquoi tes pièces sont-elles des Canvas ? Ca devrait être des images plutôt... Ou alors, si tu veux les dessiner en vectoriel, déclare les ressources comme des Geometry, et affecte ces géométries à des contrôles Path

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    En fait je suis parti de fichiers svg trouvés sur Wikipedia et que j'ai transformé en xaml avec le converteur suivant : http://www.graphspe.com/svg-to-xaml-...ter#/Converter ( très pratique au passage )
    Pour exemple pour le BlackKing j'ai le xaml suivant :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    42
    43
    44
    45
     
    <Canvas x:Key="BlackKing" Width="45" Height="45" ClipToBounds="True">
    		<Canvas>
    			<Path Stroke="#FF000000" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M22.5,11.625L22.5,6" />
    				</Path.Data>
    			</Path>
    			<Path Fill="#FF000000" Stroke="#FF000000" StrokeThickness="1.5" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M22.5,25C22.5,25 27,17.5 25.5,14.5 25.5,14.5 24.5,12 22.5,12 20.5,12 19.5,14.5 19.5,14.5 18,17.5 22.5,25 22.5,25" />
    				</Path.Data>
    			</Path>
    			<Path Fill="#FF000000" Stroke="#FF000000" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeLineJoin="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M11.5,37C17,40.5,27,40.5,32.5,37L32.5,30C32.5,30 41.5,25.5 38.5,19.5 34.5,13 25,16 22.5,23.5L22.5,27 22.5,23.5C19,16 9.5,13 6.5,19.5 3.5,25.5 11.5,29.5 11.5,29.5L11.5,37z" />
    				</Path.Data>
    			</Path>
    			<Path Stroke="#FF000000" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M20,8L25,8" />
    				</Path.Data>
    			</Path>
    			<Path Stroke="#FFFFFFFF" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M11.5,29.5C17,27,27,27,32.5,30" />
    				</Path.Data>
    			</Path>
    			<Path Stroke="#FFFFFFFF" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeLineJoin="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M11.5,37C17,34.5,27,34.5,32.5,37" />
    				</Path.Data>
    			</Path>
    			<Path Stroke="#FFFFFFFF" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeLineJoin="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M11.5,33.5C17,31.5,27,31.5,32.5,33.5" />
    				</Path.Data>
    			</Path>
    			<Path Stroke="#FFFFFFFF" StrokeThickness="1.5" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeDashCap="Round" StrokeLineJoin="Round" StrokeMiterLimit="4">
    				<Path.Data>
    					<PathGeometry Figures="M32,29.5C32,29.5 40.5,25.5 38.026,19.847 34.147,13.997 25,18 22.5,24.5L22.512,26.597 22.5,24.5C20,18 9.9064,13.997 6.9975,19.847 4.5,25.5 11.846,28.847 11.846,28.847" />
    				</Path.Data>
    			</Path>
    		</Canvas>
    	</Canvas>

    donc comment faire pour :
    déclare les ressources comme des Geometry, et affecte ces géométries à des contrôles Path
    C'est mon premier projet en wpf et je ne maitrise pas trop le xaml

    Merci pour ton aide

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    En WPF, un objet Geometry permet de définir des formes géométriques. Ca sert par exemple à définir la forme d'un Path (propriété Data)

    Dans le cas présent, ça va pas être simple... vu qu'il y a des path en noir et d'autres en blanc, ça complique pas mal les choses, ça va pas être possible de faire ça avec une seule Geometry

    Je pense qu'on doit pouvoir le faire avec un DrawingImage, mais c'est du boulot...

    Sinon, tu peux toujours dupliquer les Canvas des pièces dont tu as besoin plusieurs fois. C'est pas très propre, mais c'est sans doute le plus simple...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Vu qu'il s'agit d'un projet pour apprendre, je préfère faire propre que simple

    sinon j'ai essayé quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.LoadComponent(this, new Uri("/EchecEtMat;component/Pieces/Resources/ResourceDictionary.xaml/"+ GetResourceKeyToDraw(), UriKind.Relative));
    Mais est ce possible de spécifier la clef de la ressource dans l'uri comme j'ai essayer de le faire?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Troopers Voir le message
    Mais est ce possible de spécifier la clef de la ressource dans l'uri comme j'ai essayer de le faire?
    Non, ça marche pas comme ça...
    Par contre tu pourrais avoir chaque pièce dans un fichier XAML différent, avec Canvas comme racine

    Ou alors tu en fais carrément des UserControls, et tu fais des trucs genre "new BishopPieceControl()"

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    ce que je comprends pas, c'est que cela fonctionne en mettant le ResourceDictionnary en non static et en local :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public override void Draw()
    {
    	ResourceDictionary resourceDictionary = new ResourceDictionary();
    	resourceDictionary.Source = new Uri("/EchecEtMat;component/Pieces/Resources/ResourceDictionary.xaml", UriKind.Relative);
    	// Get the canvas in the resource
    	this.Content = resourceDictionary[GetResourceKeyToDraw()];
    }


    Sinon autre question :
    Je dessine donc mes pièces qui héritent de UserControl sur un échiquier 8*8 qui est un Grid de 8 Columns et 8 Rows. Chaque pièce à une position en x et y qui va de 0 à 7 (jusque là c'est logique!)
    Je place donc les pièce ainsi :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach(Piece piece in player.Pieces)
    {
    	piece.Draw();
    	piece.SetValue(Grid.ColumnProperty, piece.Position.X);
    	piece.SetValue(Grid.RowProperty, piece.Position.Y);
    	grid.Children.Add(piece);
    }

    sauf que je sors en erreur :
    0 n'est pas une valeur valide pour la propriété Column

    Et si je mets X+1 et Y+1, cela fonctionne mais les pièces sont décalés sur l'échiquier (logique...)
    Pourquoi le 0 ne passe pas?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Troopers Voir le message
    ce que je comprends pas, c'est que cela fonctionne en mettant le ResourceDictionnary en non static et en local :
    C'est parce que quand tu fais ça, chaque pièce à sa propre instance du ResourceDictionary. Le problème avec cette technique est que chaque canvas est chargé autant de fois qu'il y a de pièces (donc 64 canvas chargés en mémoire alors que tu n'en n'as besoin que de 16)

    Citation Envoyé par Troopers Voir le message
    sauf que je sors en erreur : "0 n'est pas une valeur valide pour la propriété Column"
    Et si je mets X+1 et Y+1, cela fonctionne mais les pièces sont décalés sur l'échiquier (logique...)
    Pourquoi le 0 ne passe pas?
    Bizarre, j'ai jamais vu ça
    X et Y sont bien de type int ?
    Essaie avec Grid.SetColumn et Grid.SetRow (normalement ça revient au même mais bon...)
    Ou alors essaie de mettre d'abord la pièce dans la Grid

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    X et Y sont des short
    en castant en int cela fonctionne
    X + 1 et Y +1 fonctionnait car il y a une conversion implicite en int

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Troopers Voir le message
    X et Y sont des short
    en castant en int cela fonctionne
    X + 1 et Y +1 fonctionnait car il y a une conversion implicite en int
    Voilà
    En fait SetValue prend un paramètre de type object, donc il y a un boxing qui se produit, et quand il essaie d'unboxer vers un int ça pète...
    Avec Grid.SetColumn ça doit marcher, parce le paramètre est déclaré en int, donc il y a conversion implicite là aussi.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    c'est-y pas beau çà...
    Nom : chess.png
Affichages : 147
Taille : 95,5 Ko

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 73
    Points
    73
    Par défaut
    A part la petite faute de frappe sur "Payler", c'est joli

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Bien vu ! merci...

    J'avais également oublié de gérer une alternance des couleurs sur le damier.

    Bon maintenant on s'attaque à la gestion de l'intelligence artificielle

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par MiniCesc Voir le message
    A part la petite faute de frappe sur "Payler", c'est joli
    Et l'alignement de certaines pièces à corriger, et le petit bug sur la reine blanche

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    le petit bug sur la reine blanche
    Oui j'avais vu et corrigé

    l'alignement de certaines pièces à corriger
    Une petite piste pour centrer les pièces dans les cellules?

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Troopers Voir le message
    Une petite piste pour centrer les pièces dans les cellules?
    un petit HorizontalAlignement="Center" et VerticalAlignment="Center" devrait suffire

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 73
    Points
    73
    Par défaut
    Et une solution de globalisation (l'anglais c'est bien, mais rien ne vaut notre bon vieux français :p)

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    Je reviens sur mon problème original.
    J'ai étudié un peu ce qu'il est possible de faire avec WPF ( ControlTemplate, Binding et DataTemplate) mais j'arrive pas à l'appliquer à mon cas. On m'avais dit que WPF n'était pas evidant à appréhender pour un developpeur WinForm et je confirme mais cela à l'air puissant

    J'ai créer une UserControl PieceView, je souhaiterai que le contenu soit récupérer de mon ResourceDictionnary en fonction du nom de PieceViewModel.
    J'ai donc implémenter INotifyPropertyChanged dans PieceViewModel et créer la propriété Name qui renvoie BlackBishop, BlackKing, BlackQueen...

    Comment faire pour que le contenu du UserControl soit bindé sur la resource dont la clef correspond à la valeur de la propriété Name de PieceViewModel?

  19. #19
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Tu peux utiliser la propriété ContentTemplateSelector de ton UserCOntrol pour choisir quel sera le template appliqué au controle.

Discussions similaires

  1. Projet Jeu d'échec
    Par Layla dans le forum Langage
    Réponses: 10
    Dernier message: 23/12/2010, 13h06
  2. Mon jeu consomme trop de ressources
    Par Le Barde dans le forum Développement 2D, 3D et Jeux
    Réponses: 13
    Dernier message: 07/11/2007, 08h16
  3. Serveur de jeu d'échec en PHP
    Par S_Xavier dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2007, 15h02
  4. [Jeu PHP] - Amasser des ressources
    Par Leobaillard dans le forum Langage
    Réponses: 11
    Dernier message: 09/02/2006, 15h48
  5. Jeu d'échec borland soap
    Par rpoulin dans le forum Web & réseau
    Réponses: 2
    Dernier message: 20/10/2005, 05h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo