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

C Discussion :

[SDL] FlipperColisions conseils


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut [SDL] FlipperColisions conseils
    Bonjour à tous, je fais un flipper en SDL actuellement avec un nombre d'obstacles de formes très variée.

    Pour la gestions des collisions,j'utilise une Map_collision, ou j'ai mis des points noirs RGB(0,0,0) et sur ma bille j'ai repéré 8 points.
    gauche,droite,haut,bas, +et- pi/4, +et- (pi+pi/4)

    A chaque mouvement de balle je contrôles la positions de ces 8 pixels par rapport à la Map_collision, si il y'a contact j'inverse les vecteur suivant le point en contact.
    pour les positions pi/4 j'inverse vectx et vecty et pour le haut,bas j'inverse vecty et pour le gauche droite j'inverse vectx.

    Cependant j'ai de gros problèmes avec ma méthode:

    ->Lorsque la balle a un vecteur vitesse telle que vx=19 et vy=10, il arrive que ma balle rentre dans le décors totalement(bordures et obstacles).
    (Il me faudrait donc une fonction qui contrôle si la bille est rentré dans un obstacle avant de la blitter et si c'est le cas la blitter au bord)
    Par exemple ceci serais simple a faire pour un vecteur x=y=10 j'incrémente progressivement la position de la balle de pos.x++ pos.y++ et je contrôle si il y a des collisions.Si je vois qu'il y'a contact,je m'arrête je blitte et je modifie le sens des vecteurs.
    Mais pour les vecteur tel que vx=1 vy=20 il y'a problème je ne sais pas comment faire ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Bonjour,

    Je suppose que, en fonction de ton vecteur vitesse, tu modifies la position de la bille avant chaque blit.
    C'est à ce moment là qu'il faut faire un test : si la nouvelle la position dépasse la limite tu ne modifies pas la position de l'incrément prévu mais uniquement du delta entre la position actuelle et la limite (et tu changes aussi ton vecteur vitesse).

    Il me faudrait donc une fonction qui contrôle si la bille est rentré dans un obstacle avant de la blitter et si c'est le cas la blitter au bord
    Oui, exactement !

    Mais pour les vecteur tel que vx=1 vy=20 il y'a problème je ne sais pas comment faire ?
    Est-ce que tu ne confonds pas vitesse et incrément de position ?
    As tu une variable qui représente le temps et que tu incrémentes régulièrement ?

    Cela dépend du frame-rate que tu as choisi et tu n'es pas obligé d'incrémenter la position pixel par pixel (l'incrément est calculé en fonction de la vitesse), par contre il faudra peut être faire certains calculs avec des float.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut
    Bonjour Merci beaucoup de ta réponse,

    Je suppose que, en fonction de ton vecteur vitesse, tu modifies la position de la bille avant chaque blit.
    C'est à ce moment là qu'il faut faire un test : si la nouvelle la position dépasse la limite tu ne modifies pas la position de l'incrément prévu mais uniquement du delta entre la position actuelle et la limite (et tu changes aussi ton vecteur vitesse).
    C'est fait !

    Est-ce que tu ne confonds pas vitesse et incrément de position ?

    par contre il faudra peut être faire certains calculs avec des float.
    float k;
    Alors je fais le rapport k=vx/vy et suivant le resultat,
    --->if(k<1){ vx+=k ;vy+=1;}
    --->if(k>1){ vx+=1 ; vy+=(1/k);}

    Cela fonctionne a la première collisions mais ensuite il y'a des soucis, en effet lorsque le coefficient k<1, la position s'incremente mais la bille reste au même endroit car k est très petit et la position de la bille reste parfois au même endroit et les collisions se multiplie. La bille oscille et ne sort jamais de l'endroit ou est intervenu la collision.

    As tu une variable qui représente le temps et que tu incrémentes régulièrement ?
    Non, je n'en ai pas.A quoi cela peut-il servir?

    Cela dépend du frame-rate que tu as choisi et tu n'es pas obligé d'incrémenter la position pixel par pixel (l'incrément est calculé en fonction de la vitesse), par contre il faudra peut être faire certains calculs avec des float.
    Le problème auquel je suis confronté, est que je n'ai pas choisi de fame-rate du coup mon programme utilise beaucoup de processeur et lorsque j'utilise un SDL delay pour appliquer une pause très faible cela gène le jeux et plus particulièrement les flippers(palettes qui renvoient la bille) qui ne réagissent pas instantanément.

    Merci d'avance de ton aide.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Bonjour,

    float k;
    Alors je fais le rapport k=vx/vy et suivant le resultat,
    --->if(k<1){ vx+=k ;vy+=1;}
    --->if(k>1){ vx+=1 ; vy+=(1/k);}
    Je ne comprends pas bien ta méthode.
    Si vx et vy sont les coordonnées de ton vecteur vitesse : lors d'une collision il faut changer l'angle du vecteur.
    C'est ce que tu veux faire je pense en faisant le rapport vx/vy et en testant le signe, mais les affectations ensuite me paraissent bizarres.

    Si tu veux bien gérer l'angle de rebond, c'est de toute façon plus facile à dire qu'à faire
    Mais je vais creuser car j'avais justement en projet également un flipper !

    Concernant la variable temps : c'est justement en relation avec le frame-rate et cela peut servir à synchroniser des animations : par exemple je contrôle certaines animations par des callbacks de timer avec en paramètre l'instant de début et de fin.

    lorsque j'utilise un SDL delay pour appliquer une pause très faible cela gène le jeux
    Le problème, si tu ne gères pas de frame-rate, c'est que le délai que tu rajoutes est constant ( et présent même quand il ne le faut pas).
    Le principe du frame rate est de rajouter un délai contrôlé pour avoir une durée de boucle principale constante.

    Je te recommande vivement de prendre ce principe.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut
    Bonjour, Encore merci de repondre

    Je ne comprends pas bien ta méthode.
    Si vx et vy sont les coordonnées de ton vecteur vitesse : lors d'une collision il faut changer l'angle du vecteur.
    C'est ce que tu veux faire je pense en faisant le rapport vx/vy et en testant le signe, mais les affectations ensuite me paraissent bizarres.
    Dans ma methode vx,vy sont des vecteur qui s'incrementent en parralele en faite pour verifier a chaque pixel si il y a colision ou non.
    vectX vectY disons sont mes vecteurs de balle.
    Dans ma fonction j'ai créer vx ,vy que je vais incrementer selon les conditions si la bille est proche du rebord et qu il y a collisions j'arrête l'incrementation et je change le sens de ces vecteurs, sinon je continue tant que vx!=vectX et vy!=vectY

    Si tu veux bien gérer l'angle de rebond, c'est de toute façon plus facile à dire qu'à faire
    Voila j'ai un gros problème comme mes formes sont diverses et pas régulière j'ai placé 8 points sur ma balle mais les rebond se font toujours de la même manière je n'arrive pas a trouver une bonne maniere pour gerer un angle de rebond

    Le problème, si tu ne gères pas de frame-rate, c'est que le délai que tu rajoutes est constant ( et présent même quand il ne le faut pas).
    Le principe du frame rate est de rajouter un délai contrôlé pour avoir une durée de boucle principale constante.
    Je vais regarder ça sur le net, j'ai jamais fait mais le principe me parfait très bon

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par nanosoft Voir le message
    Le principe du frame rate est de rajouter un délai contrôlé pour avoir une durée de boucle principale constante.
    Je ne connais qu'un tout petit peu la SDL, mais l'idéal ne serait-il pas d'avoir un callback sur le retour du transfert vers la mémoire vidéo? Sur les 8 bits d'il y a trente ans, (l'Atari 800, au hasard) l'OS pétait une interruption au blanking vertical, on pouvait y accrocher une callback pour retravailler l'image pendant que la vidéo ne se dessine pas.

    A+

    Pfeuh

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Bonsoir,

    Je ne sais pas si la SDL date de trente ans !

    Sur le frame-rate, il y a un tuto sur le site :
    http://loka.developpez.com/tutoriel/sdl/frame_rate/

    Mais on n'est pas obligé d'utiliser un timer, on peut prendre des instants avec SDL_GetTicks() et rajouter un SDL_Delay en fonction.

    Pour la mémoire vidéo cela dépend de l'init de l'écran en SDL_SWSURFACE ou SDL_HWSURFACE.

    pour retravailler l'image pendant que la vidéo ne se dessine pas
    C'est le principe avec SDL_Flip.

    (PS : il y a un forum dédié sur la SDL)

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

Discussions similaires

  1. Besoin de conseils sur la gestion d'images avec SDL
    Par mazertys17 dans le forum SDL
    Réponses: 12
    Dernier message: 01/11/2014, 18h40
  2. conseils pour mon projet SDL
    Par Code Rom dans le forum SDL
    Réponses: 3
    Dernier message: 21/06/2009, 02h04
  3. Réponses: 2
    Dernier message: 15/01/2007, 23h02
  4. [Conseil] Glut vs SDL, lequel choisir
    Par Mathieu.J dans le forum GLUT
    Réponses: 15
    Dernier message: 08/06/2004, 08h47
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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