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 :

Gestion de la Balle du jeux pong en C (avec SDL)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut Gestion de la Balle du jeux pong en C (avec SDL)
    Bonjour, je suis nouveau sur ce forum, et un débutant en programmation, soyez indulgent des petites erreurs svp ^^.
    Je suis en 1 ère année d'IUT R&T, et en cette fin d'année on nous demande de faire un projet en C en utilisant la SDL. J'ai décidé de refaire le jeux "pong". Et j'ai pas mal de soucis avec :s. En particulier la gestion de la balle.

    Voici ma fonction:
    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
    SCREEN_H 440
    SCREEN_L 800
    SDL_Rect mvtBalle(  SDL_Rect PosBalle, int vitesse_x, int vitesse_y)
    {
            if (PosBalle.y<=0 || PosBalle.y>=SCREEN_H) 
            {
                   vitesse_y=-vitesse_y;
            }
     
             if (PosBalle.x<=0 || PosBalle.x>=SCREEN_L)
            {
                    vitesse_x=-vitesse_x;
            }
            PosBalle.x=PosBalle.x+vitesse_x;
            PosBalle.y=PosBalle.y+vitesse_y;
                    return PosBalle;
    }
    Avant de me préoccuper des rebonds sur les joueurs j'essai déjà de la faire rebondir sur les bords. (ce que je pense plus simple dans un premier temps ?)
    -PosBalle est la position de la balle en x et y.
    -vitesse et un facteur, que j'ai mis égal a 2 pour x et y, pour faire bouger la balle, que l'on inverse en fonction du bord touché.
    -SCREEN est la taille du plateau de jeu.

    J'ai pensé à pas mal de chose j'ai fait pas mal de test, mais ce n'est vraiment pas concluant du tout du tout. J'ai regardé aussi pas mal de forum mais j'ai pas réussi à reproduire ce que je voulais. Si quelqu'un arrive a me comprendre et a m'aider je suis la pour toute question, ce serais vraiment gentil. Merci =)

    (mon autre problème est l'utilisation des threads pour pouvoir gérer les deux joueurs en même temps que la balle, mais je verrais ça après ^^')

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Tu dois penser "trajectoire" et non vitesse à mon avis !
    Le rebond doit garder la vitesse (dans un pong du moins...), mais tu dois "juste" changer la trajectoire.
    Mais ma notion de "vitesse" serait plutôt associé à "vélocité", tandis que toi, tu sembles faire "vecteur vitesse" (donc vélocité + trajectoire) en un seul nombre plutôt que plusieurs valeurs.

    Quel est le type de vitesse_x ? int je suppose ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut
    Merci de ta réponse rapide. Oui effectivement j'ai mélangé vitesse et trajectoire. Oui vitesse_x et vitesse_y sont un int.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    Par défaut
    Bonjour et bienvenue sur nos forums.

    Une idée simple que je mettais en place et d'avoir des vitesses.
    Une vitesse pour les X et une vitesse pour les Y.

    A chaque fois que vous voulez déplacer la balle, vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    balle.x = balle.x + vitesse.x
    balle.y = balle.y + vitesse.y
    Lorsque vous détectez une collision, disons pour commencer, pour l'axe des X, vous n'avez juste qu'à mettre à jour la vitesse comme ceci :
    Ce qui provoque une inversion de la vitesse et donc, que la balle par dans l'autre sens.

    Pareil pour l'axe des Y et sa vitesse associée

    Toutefois, ceci n'est pas parfait. En effet, pour une vitesse de 5 et un obstacle à 3 pixels, vous allez inverser la vitesse trop tot. le rebond devant se faire dans trois pixel, la balle doit être à 2 pixels du mur après rebond, alors que l'inversion de la vitesse fera que la balle sera à 8 pixels.

    Pour éviter un tel problème, un système de vecteurs peut être mis en place. En effet, la simple multiplication entre un vecteur vitesse et la normale du mur permettra d'avoir la nouvelle position correcte de la balle. Mais bon, cela sera la prochaine étape, déjà si vous arrivé à faire le rebond simple, cela sera cool.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Par défaut
    D'après ce que j'ai compris je devrais donc mettre quelque chose comme ça dans ma fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (PosBalle.y<=0 || PosBalle.y>=SCREEN_H )
            {
                   trajectoire_y *= -1;
            }
     
             if (PosBalle.x<=0 || PosBalle.x>=SCREEN_L)
            {
                    trajectoire_x *= -1;
            }
            PosBalle.x=PosBalle.x-trajectoire_x;
            PosBalle.y=PosBalle.y-trajectoire_y;
     
            return PosBalle;
    Edit: J'ai d'abord essayer cette fonction dans mon programme principal, et la balle ne rebondissais pas comme il faut. J'ai alors recréé un projet pour tester uniquement cette fonction et, miracle elle fonctionne ^^', les rebond ce font sur tout les bords correctement. Donc le problème doit venir de mon main. C'est même sûr étant donné que je ne sais pas utiliser les threads je ne sais pas ou la placer.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
      SDL_Surface *player1 = NULL, *player2 = NULL,  *balle=NULL; 
                        SDL_Rect PosPlayer1,PosPlayer2,PosBalle; //initialisation des variable pour la position des joueurs
     
     int  trajectoire_y=5,trajectoire_x=5;
     
                //positionnement des joueurs et de la balle
                            PosPlayer1.x = 35;
                            PosPlayer1.y = 180;
                            PosPlayer2.x = 760;
                            PosPlayer2.y = 180;
                            PosBalle.x=390;
                            PosBalle.y=220;
     
                            player1 = SDL_LoadBMP("player1.bmp"); //importation des images des joueurs et de la balle
                            player2 = SDL_LoadBMP("player2.bmp");
                            balle = SDL_LoadBMP("Balle.bmp");
     
                            SDL_BlitSurface(player1, NULL, ecran, &PosPlayer1); //incorporation des joueurs et de la balle sur le plateau de jeux
                            SDL_BlitSurface(player2, NULL, ecran, &PosPlayer2);
                            SDL_BlitSurface(balle, NULL, ecran, &PosBalle);
                            SDL_Flip(ecran);
     
                            while (continuer)
                                {
                                        SDL_WaitEvent(&event);
                                       case SDL_QUIT:
                                        {
     
                                            continuer = 0;//permet de quitter le programme
                                        }
     
                                        case SDL_KEYDOWN:
                                            {
                                                PosPlayer1 = mvtPlayer1(PosPlayer1,event); //Mouvement du joueur 1 (marche parfaitement)
                                                PosPlayer2 = mvtPlayer2(PosPlayer2,event); //Mouvement du joueur 2 (marche parfaitement)
     
                                            }
     
     
                                                PosBalle=mvtBalle(PosBalle,PosPlayer1,PosPlayer2,trajectoire_y,trajectoire_x);//Mouvement de la balle
     
                                            SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
                                            SDL_BlitSurface(player1, NULL, ecran, &PosPlayer1);
                                            SDL_BlitSurface(player2, NULL, ecran, &PosPlayer2);
                                            SDL_BlitSurface(balle, NULL, ecran, &PosBalle);
                                            SDL_Flip(ecran);
                                }
                                SDL_FreeSurface(imageDeFond); 
                                SDL_FreeSurface(player1);
                                SDL_FreeSurface(player2);
                                SDL_FreeSurface(balle);
    Voici ce qu'il y a dans mon main. La fonction qui gère le mouvement de la balle est placé hasardeusement car je ne sais pas où la mettre.
    Voila, j'espère que je suis pas trop brouillon dans toutes mes explications, et que vous arriverez à me comprendre, et comprendre mes problèmes. Merci de votre aide qui me sera très très utile !

  6. #6
    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,

    Les "case ... :" sont à mettre dans un switch.

    WaitEvent est bloquant, il faut utiliser PollEvent et voir dans les tutoriels et FAQ SDL l'utilisation de ces 2 fonctions : en testant la variable (int) de retour.

Discussions similaires

  1. gestion d'une salle de jeux
    Par Belooh dans le forum ALM
    Réponses: 3
    Dernier message: 03/11/2014, 10h17
  2. Gestion de la Balle
    Par mickl1722 dans le forum Débuter
    Réponses: 7
    Dernier message: 04/05/2011, 20h21
  3. Gestion d'évènements dans un jeux
    Par Invité1 dans le forum Débuter
    Réponses: 2
    Dernier message: 05/03/2010, 18h30
  4. Gestion des évenements avec sdl
    Par sharu_a99 dans le forum C++
    Réponses: 1
    Dernier message: 27/11/2007, 07h46
  5. gestion des collisions avec sdl
    Par kirtap1969 dans le forum SDL
    Réponses: 3
    Dernier message: 18/10/2007, 21h16

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