320 likes | 436 Views
Contenu de la présentation. Présentation de SDL. Bomberman . Limites. Présentation de SDL. Une approche par « surface » L’écran ainsi que les images chargées sont considérées comme des surfaces. ‘ SDL_Surface ’: type contenant toutes les informations sur une surface. Présentation de SDL.
E N D
Contenu de la présentation • Présentation de SDL. • Bomberman. • Limites.
Présentation de SDL Une approche par « surface » L’écran ainsi que les images chargées sont considérées comme des surfaces. ‘SDL_Surface’: type contenant toutes les informations sur une surface
Présentation de SDL Une approche par « surface » Initialisation d’une surface: SDL_SetVideoMode(largeur,hauteur,BitsParPixel,type) BitsParPixelpermet de spécifier la précision des couleurs (16->65536 couleurs) Typepeut prendre les valeurs : SDL_HWSURFACE : Surface stockée dans la mémoire de la carte vidéo ->contraire : SDL_ SWSURFACE SDL_DOUBLEBUF : Active le double buffering (évite les scintillements) SDL_FULLSCREEN : Fenêtre en plein écran SDL_OPENGL : Permet de faire un lien avec OpenGL SDL_RESIZABLE : Un évènement SDL_VIDEORESIZEest envoyé si la taille change
Présentation de SDL Une approche par « surface » Initialisation d’une surface: SDL_CreateRGBSurface (type,largeur,hauteur,BitsParPixel,R,V,B,A) Typepeut ici prendre les valeurs : SDL_HWSURFACE : Surface stockée dans la mémoire de la carte vidéo ->contraire : SDL_ SWSURFACE SDL_SRCCOLORKEY : permet de rendre une couleur transparente SDL_SRCALPHA : permet d’utiliser le canal alpha (permet des effets de transparence) RVBAest le masque de couleur du fond (alpha étant la transparence : 0 opaque, FF invisible)
Présentation de SDL Une approche par « surface » Initialisation d’une surface à partir d’une image : SDL_LoadBMP(chemin) chemin est une chaîne de caractères indiquant le fichier à charger. Il est cependant plus simple d’utiliser une librairie annexe :SDL_Image Cette librairie permet de charger des fichiers BMP, PNM, XPM, LBM, PCX, GIF, JPEG, PNG et TGA grâce à la fonction : IMG_Load(chemin) chemin est une chaîne de caractères indiquant le fichier à charger. SDL_Image se charge de trouver le type du fichier
Présentation de SDL Manipulation des surfaces Copie entre deux surfaces : SDL_BlitSurface(Surf1,rect1,Surf2,rect2) Surf1 est la surface d’origine. Rect1 est le rectangle de sélection, de type SDL_Rect&: • x et y représentent les coordonnées en haut à gauche du rectangle • h et w représentent la hauteur et la largeur du rectangle à sélectionner Surf2 est la surface de destination. Rect2 est le rectangle de destination. Seul x et y sont pris en compte : la largeur sera celle spécifié avec Rect1. Si Rect1 est à NULL, toute l’image est copiée Si Rect2 est à NULL, l’image copiée se place en haut à gauche
Présentation de SDL Gestion des entrées sorties Récupérer les évènements claviers SDL_PollEvent(&evenement) Evenement est de type SDL_Event. SDL_Event est une structure rassemblant les évènements : • Clavier : SDL_GetKeyStatepermet de récupérer un tableau de 256 cases booléenne C’est une photo du clavier : si une touche est pressée, la case correspondante est à vrai constantes : SDLK_ESCAPE, SDLK_F1, SDLK_w … Il est par ailleurs possible d’utiliser UNICODE grâce à :SDL_EnableUNICODE(intenable);
Présentation de SDL Gestion des entrées sorties Récupérer les évènements claviers SDL_PollEvent(&evenement) Evenement est de type SDL_Event. SDL_Event est une structure rassemblant les évènements : 1. Clavier. • Souris : SDL_GetMouseState(x,y)permet d’avoir la position de la souris SDL_BUTTON(x) permet de savoir si le bouton x est appuyé. • Joystick : SDL_JoystickOpen(0) permet d’initialiser le joystick 0. SDL_JoystickClose(0) libère le joystick 0.
Présentation de SDL Gestion du son SDL permet de gérer le son, mais de manière peu évolué. Après quelques recherches sur Internet, la librairie FMODm’est apparu comme très performante. Elle permet d’utiliser des effets DirectX, du son 3D, d’enregistrer en FULL-DUPLEX… De plus, elle permet de lire des fichiers de type : Midi, wav, mp3, ogg, raw, cd …
Présentation de FMOD Gestion du son : FMOD Initialisation de FMOD : FSOUND_Init(freq,nbcanaux,flags) Freqreprésente la fréquence d’échantillonnage (44100 par ex) Nbcanauxreprésente le nombres de canaux (ie le nombre de sons Max pouvant être joué simultanément) Flagsreprésente les différents paramètres d’initialisation…
Présentation de FMOD Gestion du son : FMOD Chargement d’une musique : FSOUND_Stream_Open(chemin,flags,début,longueur) chemin est une chaîne de caractères indiquant le fichier à charger. flags a en général pour valeur FSOUND_LOOP début est facultatif, indique l’offset de debut du fichier longueur est facultatif, indique la longueur du fichier
Présentation de FMOD Gestion du son : FMOD Chargement d’un son : FSOUND_Sample_Load(index,chemin,flags,début,longueur) Index défini le canal a utiliser (FSOUND_FREEpermet de laisser FMOD s’en charger). chemin est une chaîne de caractères indiquant le fichier à charger. flags a en général pour valeur FSOUND_NORMAL début est facultatif, indique l’offset de début du fichier longueur est facultatif, indique la longueur du fichier
Présentation de FMOD Gestion du son : FMOD Jouer un son : FSOUND_PlaySound(index,identifiant) Index défini le canal a utiliser (FSOUND_FREEpermet de laisser FMOD s’en charger). Identifiant est l’id du son précédemment chargé avec FSOUND_Sample_Load
Bomberman Initialisation de tous les composants. SDL : SDL_Init( SDL_INIT_VIDEO|SDL_INIT_TIMER ) Pour démarrer SDL. Le timer permettra de régler la vitesse d’affichage, comme nous verrons par la suite. atexit(SDL_Quit) Permet de dire à SDL de quitter proprement. SDL_EnableUNICODE(1) parle de lui même. SDL_ShowCursor(false) rend la souris invisible. SDL_SetVideoMode(800,600,32, SDL_HWSURFACE| SDL_DOUBLEBUF|SDL_FULLSCREEN) Crée une fenêtre plein écran de 800*600*32, en mémoire vidéo, double buffer.
Bomberman Initialisation de tous les composants. FMOD : FSOUND_Init(44100,4,0) Pour initialiser la fréquence d’échantillonnage à 44100 échantillons/sec, avec 4 canaux indépendants et sans gestion particulière (3D, directX…)
Bomberman Initialisation de tous les composants. Objets du jeu : Par exemple bombe (mais valable pour tous les autres objets : mur, joueurs, feu…) Pour des raisons d’optimisation, il est préférable de charger les textures (ou image) une fois pour toute. Donc, les textures sont des membres static des classes.
Bomberman Initialisation de tous les composants. BOMBE : Bombe::init() Charge les animations de la bombe : SDL_SetColorKey(bombe[0],SDL_SRCCOLORKEY|SDL_RLEACCEL,noir) Permet de spécifier une couleur transparente. SDL_RLEACCEL permet d’accélérer le rendu des image transparentes noirest obtenu grâce a la fonction SDL_MapRGB(attend[0]->format,0,0,0) qui renvoie la couleur associé aux trois derniers paramètres.
Bomberman Initialisation de tous les composants. Le plateau : Il est composé d’un tableau à 2 dimensions : Ce sont des pointeurs sur des objets : Vide Vide Vide 1,1 1,2 1,3 Feu Mur Vide 2,1 2,2 2,3
Bomberman Initialisation de tous les composants. Le plateau : Par ailleurs, un autre tableau recense toutes les modifications du plateau (une bombe de posée, un mur qui explose…) A départ, toutes les cases sont misent à 1 (modification), pour que tout le plateau soit affiché.
Bomberman Boucle d’affichage • On efface les joueurs. En effet, lorsqu’un joueur se déplace, il faut l’effacer en réaffichant le décor qui se trouve sous le joueur .Sinon, une traînée apparaît:
Bomberman Boucle d’affichage • On affiche les explosions : • On parcours le tableau des modifications, et si une cases est à 2 alors c’est qu’elle explose. • On interroge l’objet pour savoir où et comment les flammes partent. • Teste les collisions avec les objets du plateau et ainsi détermine quels objets sont détruits par l’explosion. • Affiche les flammes de l’explosion.
Bomberman Boucle d’affichage • On affiche les objets du plateau qui ont étés modifiés : • Parcours le tableau de modifs • L’objet n’a pas été modifié, on ne l’affiche pas. • L’objet explose, on affiche son explosion. • L’objet doit être réactualisé, on l’affiche. • Gestion de la pseudo-3D :
Bomberman Boucle d’affichage • On affiche les joueurs : • Le joueur est contrôlé pour un humain : • Calcul de la direction demandé • Collision : Modification de la direction en calculant le point de contact sur le carré de collision de l’objet et et en modifiant en conséquence le vecteur déplacement. • affichage du joueur : Calcul de l’image à afficher en fonction de la direction du vecteur déplacement ainsi que de son module (et de l’image précédente) :
Bomberman Boucle d’affichage • On affiche les joueurs : • Le joueur est contrôlé par l’ordinateur : • Calcul du but (par ordre de priorités) • Y a t’il un danger? • Y a t’il un joueur relativement proche? • Y a t’il un bonus relativement proche? • Calcul du chemin (par ordre de calcul) • Il y a un danger • Calcul du chemin le plus cour vers une case sure, sans se soucier de passer par des cases ‘dangereuses’ Ne fait pas les autres calculs! • Recherche le chemin le mois dangereux (sans passer a coté des bombes) • Recherche du plus cour chemin. • Puis même schéma que précédemment : • Calcul des collisions et gestion de la pseudo 3D
Bomberman Boucle d’affichage • Calcul de la vitesse d’exécution Si le temps passé a réactualiser la scène est supérieur à 30 ms, on attend le temps restant. Sinon, on redessine une nouvelle scène. Rendu possible grâce à SDL_INIT_TIMER et à la fonction SDL_GetTicks() qui renvoie le nombre de ms passées depuis le lancement de SDL.
Limites de SDL La principale limite : l’age. En effet, cette bibliothèque développé il y a fort longtemps est en réalité basé sur DirectX5 (pour Windows), ce qui implique quelques limitations. En effet, de nombreuse fonction (comme la transparence) sont gérées en software, sans tenir compte d’optimisations matérielles…
Limites de SDL La seconde limite : Pas de manipulation avancé. La bibliothèque n’inclus pas de primitives évolué, comme zoomer sur une partie d’image, ou faire faire une rotation à une image.
Limites de SDL La bibliothèque n’automatise pas l’utilisation de plusieurs surfaces sur une même surface. C’est à dire que c’est au programmeur d’enregistrer ce qui se trouve sous la surface pour pouvoir effacer l’objet par la suite : masque
Fin de la présentation De très bon tutoriaux se trouvent sur le site http://www.programmationworld.com/site/