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

VB.NET Discussion :

détection de collision avec getpixel ?


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut détection de collision avec getpixel ?
    VB2005 express

    Bonjour,
    Je suis débutant et je programme mon premier jeu d'action!

    le jeu est sur le même principe que "Tron" (course de 2 motos qui laissent une trainée que personne ne doit frapper )

    Je cherche comment utiliser getpixel pour détecter les collisions ?

    J'utilise une picturebox comme surface de jeu.

    Il n’y a pas d'image bitmap en arrière-plan!

    Or la fonction getpixel fait référence à bitmap et paint!

    Comment faire un "call getpixel" à l'intérieur d'une boucle "timer Tick"

    La détection de couleur d'un pixel me permettrait de savoir en tout temps ce qui a été touché ...une ligne, un obstacle ...etc!

    Merci de me mettre sur la piste!

    A+

  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 : 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 faire un "call getpixel"
    houla, toi tu as dû faire du Basic il y a très, très longtemps

    Pour répondre à ta question, je ne pense pas que GetPixel soit la bonne solution... ce n'est pas du tout destiné à cet usage, et c'est probablement pas terrible en terme de performance. En plus je suppose que tes "motos" ont une taille de plus d'un pixel, donc quel pixel exactement vas-tu regarder ?

    Tu devrais plutôt maintenir en mémoire une grille (i.e. un tableau à 2 dimensions) qui représente la surface de jeu. Tu fais par exemple 1 case pour x pixels (si tes motos font x pixels), et tu mets différentes valeurs dans la grille pour indiquer ce qu'il y a. Par exemple :
    0 : case vide
    1 : moto 1
    2 : moto 2
    3 : trainée de la moto 1
    4 : trainée de la moto 2
    Ensuite tu as juste besoin de regarder dans la grille pour savoir si une moto a heurté quelque chose...
    Tu peux (dois ?) aussi utiliser cette grille pour l'affichage : tu dessines la surface de jeu en fonction du contenu de la grille.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut un tableau 2D
    Je n'ai jamais pensé à faire avec un tableau, parce qu’en ce moment ce ne sont que des lignes qui se déplacent et je pense pas ajouter les motos!

    Donc, ça serais simple avec getpixel, je n'aurais qu'à vérifier dans quelle direction la ligne ce déplace et de regarder 1 pixel en avant !

    Voilà comment je pense réaliser la détection!

    Si c'est trop lent, j'essayerai la méthode du tableau (que je trouve complexe)!

    Mais entre-temps, je tiens à faire un essai avec getpixel... si possible ?

    Alors si vous avez une petite idée ?

    Merci pour votre réponse rapide!
    A+

  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 : 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
    Je viens de vérifier, GetPixel n'existe que dans la classe Bitmap... or dans ton cas, il n'y a pas de Bitmap, donc tu ne peux pas utiliser cette fonction !
    Sinon, ma méthode te parait peut-être complexe, mais tu verras que c'est en fait assez simple.

    Exemple :

    Ta surface de jeu fait 200x300 pixels, ta moto (ou sa trainée) fait 5 pixels de large. Il te faut donc une grille de (200/5)x(300/5) = 40x60 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim grille As Integer(,) = New Integer(40,60)
    La case (0,0) correspond à un carré de 5x5 pixels tout en haut à gauche de la surface de jeu. La case (39, 59) correspond au carré tout en bas à droite.

    Je sais pas si c'est plus clair... mais en tout cas je suis sûr que tu ne peux pas utiliser GetPixel !

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    tu peux tenter avec getpixel quand meme, qui niveau perf sera pas le mieux mais devrait suffire (getpixel sur tous les pixels d'une photo en 5Mpix est plus que déconseillé par contre )

    vu qu'en effet GetPixel est sur la classe bitmap, tu peux déssiner tes "motos" et leur trajectoire sur une image en plus de les dessiner sur ton picturebox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim img as new system.drawing.bitmap(TonPicturebox.Width, TonPicturebox.Height) 
    dim g as system.drawing.graphics = system.drawing.graphics.fromimage (img)
    g.drawline va donc dessiner une ligne sur g mais aussi sur img
    et donc il faut que tu dessines en meme temps sur le picturebox et sur g
    et img.getpixel() te donnera le pixel qui sera le meme qu'à l'écran

    et tu pourras meme enregistrer l'image avec img.save() ^_^

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je rejoints l'avis de tomlev, GetPixel est une solution absolument immonde pour tester les collisions... Comment tu fais le jour où tu auras une image de fond ?
    La méthode du tableau est beaucoup plus intelligente.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    pour enregistrer les pixels dans un tableau, il y a aussi une autre solution encore plus simple à comprendre

    avec un system.collections.generic.list(of system.drawing.point)
    à chaque fois que tu ajoutes un point sur ton image, il faut que tu l'ajoutes aussi dans la list

    liste.add(point)

    et pour vérifier, tu fais juste il list.contains(point) => alors collision



    l'objet list est un peu comme un tableau
    genre pour dim nombres() as integer tu peux faire dim nombres as list(of integer)
    l'avantage c'est qu'il y a .add, .remove, .contains etc... ce qui évite de taper du code (boucles et autres)

  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 : 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
    Sauf que c'est beaucoup plus rapide d'accéder à un élément d'un tableau par ses coordonnées (complexité o(1)) que de parcourir une liste de coordonnées jusqu'à trouver la bonne (complexité o(n)).

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Points : 17
    Points
    17
    Par défaut collision dans un picturebox
    WOW !!!

    Grand merci à vous tous pour vos idées et de partager votre expérience avec un Pti-gars de Québec!

    Je vais plancher là-dessus, c'est un grand défi pour moi, mais je pense y arriver grâce à vous tous !

    Des heures de plaisir m'attendent, je travaille là-dessus et je vous en redonne des nouvelles un peut plus tard!

    A+

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par megaben Voir le message
    WOW !!!

    Grand merci à vous tous pour vos idées et de partager votre expérience avec un Pti-gars de Québec!

    Je vais plancher là-dessus, c'est un grand défi pour moi, mais je pense y arriver grâce à vous tous !

    Des heures de plaisir m'attendent, je travaille là-dessus et je vous en redonne des nouvelles un peut plus tard!

    A+
    De rien Mais pense au tag si tu as trouvé tes réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec la détection de collision
    Par ShadowOfEden dans le forum Physique
    Réponses: 4
    Dernier message: 26/02/2008, 16h24
  2. détection JVM installé avec script php/javascript
    Par <DYDY> dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2006, 14h42
  3. Collision avec le sol...
    Par conrad dans le forum Physique
    Réponses: 15
    Dernier message: 09/08/2005, 02h18
  4. Collision avec 3ds ou ms3d
    Par goutbouyo dans le forum Physique
    Réponses: 3
    Dernier message: 29/03/2005, 12h34
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

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