|
1er chapitre – 4eme Partie : Pareil avec des objets qui bougent tout seul
Par pur hasard :), nous allons choisir comme objet qui bouge tout seul d'utiliser une balle. Nous dessinons donc un rond de 8x8 pixels que nous sauvegardons sous le nom de ball.bmp. Nous l'incluons à notre romdisk et nous rajoutons, de la même manière que précédemment un objet de type surface qui va accueillir notre image
puis dans Init()
Dans la mesure où notre objet va bouger tout seul, il va avoir une position à un moment m et une direction. Cette direction est représentée par un vecteur. Sans vous offenser, on va résumer le vecteur à : « quand je bouge de NB_X pixels sur la droite, je bouge de NB_Y pixels vers le bas. Les valeurs NB_X et NB_Y peuvent être négatives et dans ce cas, la direction ira vers la gauche ou le haut. Pour matérialiser le vecteur, on crée une structure :
et on crée aussi une structure représentant un objet qui bouge (on va l'appeler Move_Object) ayant une direction (vecteur) et une position qui lui est propre :
On va créer un objet global de ce type que l'on va appeler Ball1:
Pour lequel on va initialiser les propriétés dans Init()
Et voilà, on a un objet de type 'bougeant' à la position (0,0) qui va se déplacer, à chaque rafraîchissement de 5 pixels vers la droite et de 5 vers le bas. Il ne reste plus qu'à dessiner cet objet. Pour ça, il serait malin d'utiliser notre fonction dessiner image mais cette fonction, en plus de dessiner l'image à une position donnée, efface l'écran et zappe le buffer. Pour utiliser plusieurs fois notre fonction Dessiner_Image dans la même boucle, on doit sortir de cette fonction ces 2 actions (sinon, on ne verrait rien car à chaque appel, la fonction nous nettoierait ce qu'on à déjà dessiné). Ces deux actions seront donc déplacées dans la boucle du main(). Et la fonction Dessiner_Image sera appelé pour dessiner la balle.
Et voilà, la balle est dessinée mais, au bout de quelques secondes, elle sort de l'écran. Pas cool pour bien l'observer !! On va donc décider qu'elle rebondit sur les bords de l'écran (facile, on à déjà fait !!). Le seul truc est que la balle doit changer de direction quand elle rebondit. On teste donc la collision et si la balle touche un bord, on inverse la direction de son vecteur (ex: si elle va à droite et qu'elle touche le bord droit, elle change sa direction et va vers la gauche).
Comme précédemment, on s'adapte à la taille de l'écran et à la taille de l'image pour détecter les collisions. Bon, une balle c'est chouette mais 5 ou 6, c'est mieux. La 1ere chose qu'on va faire c'est rajouter un état à notre structure Move_Objects car quand on a un seul objet, on veut généralement l'afficher. Quand on en a plusieurs, c'est moins sûr. On ajoute donc : uint8 etat; On va maintenant créer un tableau qui va accueillir toutes nos balles. On va définir sa taille au travers d'une constante de compilation :
On supprime toutes les déclarations de Ball1 et on remplace l'initialisation de ses valeurs par une initialisation de toutes les balles :
On les met toutes en état 1 car on part du principe que l'état 0 est caché et 1 affiché (on peut imaginer d'autres états plus tard). Enfin, on doit maintenant créer une boucle d'affichage qui nous affiche toutes les balles les unes après les autres :
Je passe assez vite sur cette partie car rien n'est vraiment nouveau et le traitement se résume à : – On passe toutes les balles avec une boucle for – On reprend le traitement précédent en changeant Ball1 par la position dans le tableau en cours de traitement par la boucle for : Tab_Balls[int_compt] – On ajoute enfin une condition qui ne traite la balle que si son état est différent de 0
On compile et on se rend compte qu'on voit 5 balles qui rebondissent dans tous les sens. Toutefois, on voit que l'image de la balle est carrée avec des coins noirs disgracieux. On va essayer d'arranger ça avec une fonction toute faite de Sdl : SDL_SetColorKey On va y définir, pour une image (surface) quelle est la couleur qui sert de transparence. Dans notre cas, c'est le noir (soit (0,0,0) en RGB). Donc la fonction donnera
On définie pour la surface Ball la couleur (0,0,0) comme transparente. Du coup, notre programme donne ça :
|