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

Physique Discussion :

[2D] Collision avec coordonnées du sprite dans un tableau


Sujet :

Physique

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Points : 33
    Points
    33
    Par défaut [2D] Collision avec coordonnées du sprite dans un tableau
    Amis programmeurs, bonjour.

    Je m'intéresse depuis peu (3 jours) au C, et notamment à sa librairie graphique Allegro pour la réalisation d'un jeu type SNAKE de base, et sans prétention.
    La programmation se termine. Mon problème, cependant, se situe au niveau de la détection de collision du serpent sur lui-même (s'il se bouffe la queue).

    Pour vous donnez la possibilité de comprendre mon problème, il faut que je vous explique comment j'ai procédé.
    - Un bitmap appelé 'tete' représentant la tete du serpent sera toujours affiché. Les coordonnées de ce bitmap sont : table_x[0] et table_y[0]
    - Un bitmap appelé 'rond' représente le corps du serpent et sera dupliqué suivant le nombre de miams qu'il a mangé (c'est le principe du jeu). Les coordonnées sont calculées comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=10;i<=longueur_serpent);i=i+10))
    draw_sprite(buffer,rond,table_x[i],table_y[i]);
    Jusque là, pas de soucis, tout fonctionne.

    Pour envisager la possibilité d'une collision, la seule idée que j'ai eu est la suivante :
    Je boucle un for pour parcourir toute la table des coordonnées. Dans cette boucle je mets en place un test entre table_x[0] et table_x[i] (où i est mon compteur), de même pour table_y, et si les deux coordonnées de x et les deux coordonnées de y sont égales alors c'est qu'il y a collision...
    J'ai essayé de coder ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=1;i<=909;i++){                        
    if(table_x[0]==table_x[i] && table_y[0]==table_y[i])
    collision=1;
    }
    Ce qui m'inquiète c'est que la détection de la collision intervient en fonction de la valeur de départ que je donne au compteur. Si par exemple je met 100, elle interviendra après un petit moment de jeu. Par contre à 1, 'collision' devient tout de suite égale à 1.
    Je ne comprends pas où ça coince, et depuis le temps que je suis dessus, j'ai perdu tout recul.
    J'ai fait plusieurs autres test avec notamment les fonction 'getpixel()' et 'is_inside_bitmap()' qui sont des fonctions d'Allegro, mais sans parvenir à de meilleurs résultats. Et puis je comprends pas pourquoi mon idée ne marche pas.

    Merci d'avance à tout ceux qui se pencheront sur mon problème

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: Collision avec coordonnées du sprite dans un tableau
    Citation Envoyé par Daka
    Pour envisager la possibilité d'une collision, la seule idée que j'ai eu est la suivante :
    Je boucle un for pour parcourir toute la table des coordonnées. Dans cette boucle je mets en place un test entre table_x[0] et table_x[i] (où i est mon compteur), de même pour table_y, et si les deux coordonnées de x et les deux coordonnées de y sont égales alors c'est qu'il y a collision...
    Donc je suppose que tu as subdivisé ta fenêtre en cases et les sprites ne peuvent pas être entre les cases. Il y a donc un phénomène de "sauts" lorsque le serpent bouge.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=1;i<=909;i++){                        
    if(table_x[0]==table_x[i] && table_y[0]==table_y[i])
    collision=1;
    }
    Pourquoi 909? C'est la taille maximale de ton serpent? Il faudrait mieux intégrer la taille maximale courante (ta variable longueur_serpent) du serpent pour ne pas ralentir inutilement la recherche de collision.

    Ce qui m'inquiète c'est que la détection de la collision intervient en fonction de la valeur de départ que je donne au compteur. Si par exemple je met 100, elle interviendra après un petit moment de jeu. Par contre à 1, 'collision' devient tout de suite égale à 1.
    Quel compteur? i?

    Montre toute la fonction qui fait le calcul de collision et la fonction qui mets à jour tes tables table_x et table_y.

    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Points : 33
    Points
    33
    Par défaut Re: Collision avec coordonnées du sprite dans un tableau
    Citation Envoyé par fearyourself
    Donc je suppose que tu as subdivisé ta fenêtre en cases et les sprites ne peuvent pas être entre les cases. Il y a donc un phénomène de "sauts" lorsque le serpent bouge.
    Non, je n'ai pas divisé en case. Les sprites peuvent être n'importe où. L'incrément des coordonnées pour créer le mouvement est de 1 pixel.

    Pourquoi 909? C'est la taille maximale de ton serpent? Il faudrait mieux intégrer la taille maximale courante (ta variable longueur_serpent) du serpent pour ne pas ralentir inutilement la recherche de collision.
    Ah oui, bien sûr ! Je suis pas très malin sur ce coup.

    Quel compteur? i?

    Montre toute la fonction qui fait le calcul de collision et la fonction qui mets à jour tes tables table_x et table_y.
    Oui, le compteur de la boucle for : 'i'
    Ce que j'utilises pour mettre à jour ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table_x[0] = table_x[0] + mouv_x;
    table_y[0] = table_y[0] + mouv_y;
    mouv_x et mouv_y dépendent des touches qui sont pressées :
    - haut : mouv_x=0 et mouv_y=-1
    - bas : mouv_x=0 et mouv_y=1
    - gauche : mouv_x=-1 et mouv_y=0
    - droite : mouv_x=1 et mouv_y=0

    Une fois que j'ai mis à jour les coordonnées de la premier cellule du tableau, je décale les coordonnées pour que le corps puisse suivre la tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=908;i>=0;i--)
    {
    table_x[i+1]=table_x[i];
    table_y[i+1]=table_y[i];
    }
    et enfin, je teste la collision avec la boucle for que j'ai écrite dans mon premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=1;i<=909;i++){                       
    if(table_x[0]==table_x[i] && table_y[0]==table_y[i])
    collision=1;
    }

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Vu le message que tu viens d'écrire, j'ai bien l'impression que tu mets d'abord à jour la position de la tête et ensuite le corps. Or, il faudrait faire l'inverse, d'abord mettre à jour la position du corps (pour ne pas perdre l'ancienne position de la tête) et ensuite mettre à jour la position de la tête...

    Donc comme ceci:
    Code : 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
     
    //Mis à jour de la position du corps
    for (i=longueur_serpent-1;i>0;i--)
    {
    table_x[i+1]=table_x[i];
    table_y[i+1]=table_y[i];
    }
     
    //Mis à jour de la position de la tête
    table_x[0] = table_x[0] + mouv_x;
    table_y[0] = table_y[0] + mouv_y;
     
    //Vérification de collision
    for (i=1;i<longueur_serpent;i++){                       
    if(table_x[0]==table_x[i] && table_y[0]==table_y[i])
         collision=1;
    }
    Ensuite, on peut se dire "Pourquoi pas vérifier pour une collision tout de suite?"
    En version algo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Calcul dans nouvx, nouvy la nouvelle position de la tête
     
    Pour chaque élément du corps, mettre à jour et vérifier si la tête n'est pas à la même position.
     
    Mettre à jour la position de la tête avec (nouvx,nouvy)
    En fait, cela revient à fusionner tes deux boucles et donc traverser ton tableau une seule fois...

    Jc

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    En fait je mettais d'abord à jour la première coordonnée pour que lorsque je décale les tables, celle-ci soit prise en compte.

    Ensuite, je suis d'accord avec ton algorithme. Ca n'empêche que je ne comprends pas pourquoi ma recherche de collision ne marche pas.
    Enfin, je vais tâcher de me repencher sur le problème et de transcrire ton algo en C.
    Merci pour tes explications et de m'avoir accordé de ton temps.

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. [Image] Un sprite dans canvas avec javascript?
    Par themoye dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/09/2010, 18h44
  3. Réponses: 5
    Dernier message: 09/06/2009, 10h55
  4. Réponses: 4
    Dernier message: 19/02/2008, 13h46
  5. Réponses: 6
    Dernier message: 28/11/2006, 19h12

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