May 03 2010
Openframeworks Shmup (wip) part 1
Je me suis replongé dans openframeworks ! youpi !
Pour essayer de bien comprendre comment fonctionne la POO en C++, j’ai développé un mini shmup. Je ne pensais pas aller si loin dans la POO mais je suis bien content de l’avoir fait car j’ai désormais toutes les clés nécessaires au dev de base.
- Syntaxe
- Objets primaires
- Vecteurs
- Héritage
- références vs pointeurs
Le projet :
Un écran titre : chargement d’images, gestionnaire d’écran, etc…
Le jeu : déplacement d’un vaisseau, tir, tests de collision des missiles, hitbox, ennemis, tir des ennemis…
En fait je voulais faire un test sur un projet à PLEIN de sprites et plein de tests de collisions. Un maniac shooter !. Je ne pense pas avoir développé le shmup de la meilleure façon mais ça m’a permis d’appréhender quelques problématiques simples de programmation.
gestionnaire d’écrans
Le principe de base d’of (et de proce55ing) c’est deux méthodes appelées successivement soixante fois par seconde et dans l’ordre :
- update
- draw
dans la première on calcule les déplacement, ce qui se passe de nouveau etc… et dans la deuxième on fait le rendu (affichage).
Ca marche très bien pour du prototypage (but premier des deux logiciel) mais si on veut aller plus loin, je trouve qu’on est vite limité. Et puis par soucis de POO on a envie de séparer l’affichage d’un truc dans sa propre fonction draw.
J’ai pas encore attaqué l’événementiel avec OF alors pour l’instant j’ai trouvé cette combine qui me va bien.
Le principe est simple :
on a un entier _currentEcran et un tableau d’Ecran à deux entrées.
Les deux écrans (EcrantTitre et EcranGame) étendent Ecran et hérite de la méthode update et draw. Il faudra bien sûr les surcharger pour que les méthodes fassent leur propre tambouille. Je crée ensuite mes deux pointeurs d’ écrans et je les balance dans le tableau.
update et draw de testApp appellent respectivement :
ecran[_currentEcran]->update();
ecran[_currentEcran]->draw();
Pour changer d’écran il ne reste plus qu’a changer _currentEcran.
ecrans[0] = new EcranTitle();
ecrans[1] = new EcranGame();
}
//————————————————————–
void testApp::update(){
ecrans[_currentEcran]->update();
}//————————————————————–
void testApp::draw(){
ecrans[_currentEcran]->draw();
}


