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 :

Collision avec wpf


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut Collision avec wpf
    Bonjour,
    je travail sur un Pacman en WPF ( je débute), et je voudrais donc gérer les collisions du pacman avec, les murs. Je voudrais savoir quelles méthodes de codage vous utiliseriez pour programmer ça :

    Personnellement, j'aurai tendance à faire des tests comme en c de base sur la positions des objet dans un canevas :

    - Mais y a t-il des choses plus judicieuse à faire avec wpf ?
    - Comment gérer tout ça si je veux faire du vectoriel ?
    - y aurait t-il moyen de définir simplement une carte (murs du pacman) en xaml et de gérer les collisions plus facilement ?

    En gros, je suis capable de réaliser ce Pacman, mais j'aurai peur de passer à coté de certaines facilités que pourrait m'offrir WPF...

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait pour ce genre de jeux on resonne pas en terme de visualisation mais en terme metier
    en general on fait un tableau a deux entree - par exemple de char - (ligne ,col) et dans chaque case on met un code
    - pour les murs
    - pour les fantomes
    - pour le pac man
    - pour les bonus
    - pour les bonbon
    - pour les bonbon bonus
    et apres on fait evoluer le tableau sans se soucier du reste
    c'est la partie metier
    donc on regle le probleme de colision dans le tableau (plus les autres possibilitées)

    apres ce qui peut etre interressant serait de faire un binding du tableau vers l'interface en wpf, mais ca depand avant tout de la facon dont on veut representer le plateau de jeux
    si on utilise un canvas on lira juste le tableau pour afficher les objets
    sinon ke vois pas comment le faire disons simplement
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Tu pourrais utiliser la classe Geometry : par exemple, si tu représentes chaque élément du jeu par une image pour laquelle tu définis la propriété Clip, tu peux tester les intersections des Clip :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public bool TestCollision(UIElement element1, UIElement element2)
    {
        Geometry intersect = Geometry.Combine(element1.Clip, element2.Clip, GeometryCombineMode.Intersect, null);
        return !intersect.IsEmpty();
    }

    Bon, c'est juste une piste, je n'ai pas testé la faisabilité de la chose...

  4. #4
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut
    merci pour toute ces pistes.

    Mais pour faire du vectoriel, ça marche comment ? ( par exemple, quand je met en plein écran, je voudrais que la taille de mon Pacman soit redimensionné en conséquence.

    Faut mettre le canevas dans une case de grid de taille auto??

  5. #5
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par dfiad77pro Voir le message
    par exemple, quand je met en plein écran, je voudrais que la taille de mon Pacman soit redimensionné en conséquence
    tu peux utiliser une ScaleTransform

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Vu que le labyrinthe est statique, la meilleur facon serait effectivement probablement de stocker sa structure dans une table à 2 dimensions (données "métiers"). En connaissance la position X/Y de ton glouton, tu pourras facilement obtenir "la case" sur laquelle il se situe et tester les collisions avec les murs, "à l'ancienne" (cf. tous les moteurs de tiling de l'époque 16/32 bits).

    Pour tester la collision avec les fantomes, un test d'intersection des boundings box serait plus adapté, et moins couteux, probablement, qu'un test fin d'intersection des géometry englobantes des différents sprites.

  7. #7
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Rolsct Voir le message
    Pour tester la collision avec les fantomes, un test d'intersection des boundings box serait plus adapté, et moins couteux, probablement, qu'un test fin d'intersection des géometry englobantes des différents sprites.
    Pour les performances, c'est pas faux... mais c'est aussi moins précis : en faisant comme ça, tu pourrais détecter une collision alors que visuellement il n'y en a pas...
    Enfin, de toutes façons, dans un jeu comme ça je ne pense pas que les performances soient un problème, donc l'utilisation des Geometry, bien qu'un peu plus couteuse, est sans doute acceptable.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    j'approuve la remarque de Rolsct (c'est ce que j'avais dit )
    d'autant que a priori wpf est fait pour séparer l'aspect métier de l'aspect visuel
    donc il serait preferable de pouboir tester le jeux sous forme "textuelle" par exemple
    et faire un binding d'une structure sur une observable collection par exemple pour avoir une representation qui bouge sans code, enfin sans code lié au graphisme, juste celui qui fait evoluer la table, la collection
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  9. #9
    Membre régulier
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par ikeas Voir le message
    en fait pour ce genre de jeux on resonne pas en terme de visualisation mais en terme metier
    en general on fait un tableau a deux entree - par exemple de char - (ligne ,col) et dans chaque case on met un code
    - pour les murs
    - pour les fantomes
    - pour le pac man
    - pour les bonus
    - pour les bonbon
    - pour les bonbon bonus
    et apres on fait evoluer le tableau sans se soucier du reste
    c'est la partie metier
    donc on regle le probleme de colision dans le tableau (plus les autres possibilitées)

    apres ce qui peut etre interressant serait de faire un binding du tableau vers l'interface en wpf, mais ca depand avant tout de la facon dont on veut representer le plateau de jeux
    si on utilise un canvas on lira juste le tableau pour afficher les objets
    sinon ke vois pas comment le faire disons simplement
    Totalement d'accord avec toi Ikeas !

    J'éviterais de gérer les colisions "graphiquement". C'est possible mais tu vas vite te compliquer la tête et niveau évolution de ton jeu, tu risques de trouver rapidement tes limites

    Essaye toujours de séparé au mieux l'aspect graphique et la couche métier

    Bon courage!

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    merci Krustig
    allez pour info le design pattern qui pourrait lire la structure metier et s'occuper de l'affichage s'appel un visiteur
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  11. #11
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ikeas Voir le message
    d'autant que a priori wpf est fait pour séparer l'aspect métier de l'aspect visuel
    D'accord avec toi sur ce point... mais la classe Geometry n'est pas liée spécifiquement à la représentation visuelle (dans le sens où tu peux très bien l'utiliser hors de tout contexte visuel). Ca permet d'avoir une granularité plus fine qu'avec une simple grille où chaque objet occupe exactement 1 "carré" de la grille. Mais c'est vrai que dans le cas d'un Pacman, la grille est sans doute suffisante...

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Citation Envoyé par tomlev Voir le message
    D'accord avec toi sur ce point... mais la classe Geometry n'est pas liée spécifiquement à la représentation visuelle (dans le sens où tu peux très bien l'utiliser hors de tout contexte visuel). ...
    oui a l'époque ou je faisait des jeux on faisait un truc simple pour la granularité, on travaillait sur les pixels et l'on faisait un AND entre les pixels d'un élément avec un autre (en fonction de la position) si le résultat était <> 0 c'est qu'il y a avait collision, ceci etant compte tenu de la vitesse et de la direction une grille c'est rai que c'est plus simple (même en 3d d'ailleurs)

    dans tous les cas dfiad77pro ca serait sympa des que tu l'a fini ton pacman que tu nous le montre
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  13. #13
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut
    Hello, des nouvelles du projet, ça avance, malgré, les fêtes, je prend surtout du temps pour soigner la prog, cependant je n'arrive pas à appliquer une dynamicRessource en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            <Ellipse Name="ellipse1"  Fill="{DynamicResource Pacman_menu}" />
    en gros j'aimerais faire ce code en c# pour faire des méthodes de changement de style.


    Voici quelques screenshots du pacman ( tout est vectoriel et ne pixelise pas) :






  14. #14
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Tu peux utiliser FindResource :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    ellipse1.Fill = (Brush)( this.FindResource( "Pacman_menu" ) );

  15. #15
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut
    merci beaucoup, ça marche

  16. #16
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Plutôt que de passer par FindResource, qui ne fait qu'une liaisonà l'instant T, je te conseille SetResourceReference (http://msdn.microsoft.com/en-us/libr...reference.aspx)

    De cette façon, si la ressource est modifiée, alors la valeur est répercutée sur ton contrôle

  17. #17
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut
    Merci pour cette précision.

    J'ai un autre petit soucis !

    Mon Pacman ne bouge pas très vite quand j'incrémente les coordonnées de +1 a l'appui d'une touche, y' a-t-il possibilité d'augmenter le rafraichissement des touches (nombre d'appuis détectés lorsque reste appuyé sur une touche) pour éviter que j'ai à incrémenter de +5 ?( perte de précision et fluidité)

  18. #18
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut problème méthode collision
    J'ai fait une méthode de collision selon le modèle proposé sur la page précédente de ce topic, le soucis c'est que tout se compile, mais la collision n'est pas détectée...


    Code de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       public bool TestCollision(Pacman_c element1, Mur element2)
            {
                Geometry intersect=Geometry.Combine(element1.Clip, element2.Clip, GeometryCombineMode.Intersect, null);
                          return !intersect.IsEmpty(); 
     
            }

    appel de la méthode dans l'objet pacman

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(TestCollision(this,Mur_collision)){...

  19. #19
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    comment tu as défini les géométries des 2 objets ?

  20. #20
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 541
    Points : 1 729
    Points
    1 729
    Par défaut
    Les deux objets sont instanciés dans le même caneva, j'ai défini les géométries comme ceci (pour tester la méthode) :

    Pour le pacman :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <UserControl x:Class="Pacman.Pacman_c"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300" Loaded="UserControl_Loaded"  Background="{DynamicResource Pacman_menu}">
        <UserControl.Clip>
            <EllipseGeometry
          RadiusX="300"
          RadiusY="300"
          Center="150,150"/>
        </UserControl.Clip>
     
    </UserControl>
    Pour le mur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <UserControl x:Class="Pacman.Mur"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="10" Background="Aqua">
        <UserControl.Clip>
            <RectangleGeometry Rect="0,0,10,200"  
          />
        </UserControl.Clip>
    </UserControl>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Problème de "collision" avec un "EDIT"
    Par Darkenshin dans le forum Windows
    Réponses: 2
    Dernier message: 31/05/2007, 13h21
  2. Collision avec ODE
    Par chasse dans le forum ODE
    Réponses: 10
    Dernier message: 06/04/2007, 19h54
  3. Réponses: 4
    Dernier message: 21/03/2006, 17h38
  4. Collision avec le sol...
    Par conrad dans le forum Physique
    Réponses: 15
    Dernier message: 09/08/2005, 02h18
  5. Collision avec 3ds ou ms3d
    Par goutbouyo dans le forum Physique
    Réponses: 3
    Dernier message: 29/03/2005, 12h34

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