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 :

Trajectoire


Sujet :

Physique

  1. #1
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut Trajectoire
    Bonjour,

    Je commence tout juste avec la Sdl et d'une façon générale sur la programmation relative aux jeux donc débutant

    Le jeu developpé est un pong. A vrai dire il est quasi-fini reste un probléme de trajectoire.

    Je voulais donc savoir s'il existe une technique particuliére a adopter pour gérer la direction que prend la balle.

    Pour le moment a vrai dire voila comment je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <...>
     
    int direction = static_cast<int>(std::sin(rand()%posXballe) * cos(rand()%posXballe));
     
    SDL_Rect r;
    r.x=jeu->posballe.x + direction + VITESSE_BALLE;
    r.y=jeu->posballe.y +direction + VITESSE_BALLE;
     
    SDL_BlitSurface(jeu->balle,NULL,jeu->screen,&jeu->posballe);
    <...>
    Helas avec ce code il suffit tout simplement de frapper la balle dans le coin haut gauche et d'attendre avec le pong complétement a droite et ne plus bouger pour jouer à l'infini...donc forcément c'est pas le but recherché.

    Merci pour vos conseils
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ca arrive toujours, ce genre de petit problème
    Par exemple, tu peux mettre un peu d'aléatoire dans la manière dont la balle rebondit sur la raquette.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    C'est bien sur la direction en x qu'il faut jouer ? Parce que en y finalement ca ne modifierai pas vraiment la trajectoire non ?

    C'est la façon de faire de calculer avec cos et sin tan ?

    Websense oblige peut pas consulter une faq
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #4
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    tu peux faire jouer les 2, après tout depend de l'effet aleatoire que tu veux donner à ta balle.

    j'ai pas très bien compris ce que tu demandais sinon, pourrais tu me reformuler ça s'il te plais (ou si quelqu'un a mieux compris que moi qu'il m'explique :p).

    tu souhaites changer la trajectoire de ta balle au rebond (ou c'est déjà fais) ?
    tu souhaites que le rebond soit plus aleatoire afin d'eviter les "ruses" qui permettraient les parties infinies ?
    ...

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    tu souhaites que le rebond soit plus aleatoire afin d'eviter les "ruses" qui permettraient les parties infinies ?
    Oui c'est exactement cela.

    Pour l'instant je me débrouille pas trop mal mais je cherchais quelque chose de plus "générique".

    merci de ton aide
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    quelque chose de plus "generique", je ne pense pas avoir vu ça déjà, du moins niveau SDL.
    Que ce soit n'importe quel langage c'est un peu près le même principe sinon, mais je ne pense qu'a ce niveau là tu ai besoin d'aide

    désolé de ne pas pouvoir plus t'aider.

  7. #7
    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
    Citation Envoyé par hegros
    tu souhaites que le rebond soit plus aleatoire afin d'eviter les "ruses" qui permettraient les parties infinies ?
    Oui c'est exactement cela.

    Pour l'instant je me débrouille pas trop mal mais je cherchais quelque chose de plus "générique".

    merci de ton aide
    Le pong, à mon avis, est par définition assez répétitif...

    Par contre, j'ai regardé ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int direction = static_cast<int>(std::sin(rand()%posXballe) * cos(rand()%posXballe));
    Je ne comprend pas trop cette façon de calculer la direction, tu fais cela à chaque mise à jour ou juste au rebond?

    Sinon une solution est de calculer la nouvelle direction sans random et ensuite faire une rotation du vecteur avec un random dans l'angle de rotation. En bornant bien sûr un peu le résultat pour qu'il parte dans la bonne direction...

    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
     
    //Sans ton transtypage, je te laisserais le faire
     
    //Au rebond avec une raquette,
    //Sans "aléatoire" il suffit de changer la vitesse de l'axe X
    int directionx = -directionx;
     
    //Mais vu qu'on veut faire drôle, appliquons une rotation sur le vecteur (directionx, directiony)
    //On calcule l'angle qu'on va ajouter
    float rotation = myrand(); //Une fonction qui rend entre [0,2*PI]
     
    //On applique la rotation
    applique_rotation(rotation,directionX,directionY);
     
    //On regarde si la balle va dans le bon sens utilisant la position de la balle
    verif_direction(positionX,directionX,directionY);
    Tu pourras rendre l'angle maximal de rotation un paramètre du jeu et si tu mets par exemple 2*Pi, cela donnerait un effet de freestyle (le rebond est imprévisible).

    Sinon, si tu veux rendre le pong moins prévisible, ajoute des éléments qui compliqueront le jeu: une autre balle, des aliens, une troisième raqette...

    Jc

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Je ne comprend pas trop cette façon de calculer la direction, tu fais cela à chaque mise à jour ou juste au rebond?

    Le calcul en lui même ne signifie rien. C'est vraiment un calcul aléatoire avec des fonctions (cos,sin) pris arbitrairement sans penser a un instant à une trajectoire ( j'aurais pu remplace ce code par rand()%10)

    Oui je fais ce calcul a chaque mise à jour :

    Gestionnaire d'affichage ( frame rate)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    jeu->checktime  = SDL_GetTicks();
    if ( SDL_GetTicks() > ((jeu->checktime +1000)/fps) ) {
    <...>
    if(jeu->ballelance)jeu->PartiePong();
    <...>
     
    SDL_Flip(...);
    jeu->checktime=SDL_GetTicks();
    }
    C'est dans PartiePong que je fais le calcul. Pour le moment j'essai de calculer une trajectoire différente en fonction de la dernière collision connue ( bordure droit,gauche ou haute )sans appliquer de rotation.

    Ton code sur les rotations est intéressant je vais m'y pencher merci
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  9. #9
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    La mise à jour de la position me laisse perplexe. Ne vaudrait-il pas mieux quelquechose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    r.x=jeu->posballe.x + directionX * VITESSE_BALLE;
    r.y=jeu->posballe.y + directionY * VITESSE_BALLE;
    Et tant qu'à faire, autant faire les calculs en flotants (si ce n'est pas déjà le cas), c'est plus souple à gérer

    Reste juste à choisir au début directionX et directionY avec directionX²+directionY²=1 pour avoir une vitesse de base constante et unitaire (genre prendre un angle au hasard pour faire un cos et un sin, en évitant les trajectoires verticales pour que la balle ne se coince pas au centre). Je ne suis pas un expert mais je crois que Pong fonctionne comme ça et que donc un partie est totalement déterminée, du moins en terme de trajectoire, par la direction initiale.

    Pour varier, pourquoi ne pas reprendre un bout d'Arkanoid (et ses dérivés) en modifiant (ou même en remplaçant mais c'est moins drôle) la direction en fonction du point de la raquette où se fait le rebond ? Ainsi, plus la balle arrive vers le bord droit et plus elle repart à droite. Et si elle arrive pile au centre la trajectoire est inchangée, hormis le changement de sens.

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/03/2006, 11h30
  2. [IA] Calcul de trajectoire, heurstique et A*
    Par Olivier_ dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 03/01/2006, 17h47
  3. analyse de trajectoire
    Par victorracine dans le forum Algorithmes et structures de données
    Réponses: 23
    Dernier message: 23/10/2005, 10h53
  4. Prédiction de trajectoire
    Par Xfennec dans le forum Développement
    Réponses: 3
    Dernier message: 27/07/2004, 16h08
  5. trajectoire anime en AS2
    Par savoyard dans le forum Flash
    Réponses: 20
    Dernier message: 07/11/2003, 13h08

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