Créer son moteur 2D : Par où commencer ?

Human-BehindHuman-Behind Membre
06:15 modifié dans API UIKit #1
Bonjour à  vous,

Alors voila j'ai récemment installer le framework cocos2D pour pouvoir programmer un petit jeu, cependant il ne convient pas du tout à  mes besoins, du coin je me suis dit que j'allais faire mon propre petit moteur 2D, sachant que je ne souhaite pas un truc ultra sophistiqué, juste qui me permette d'afficher des images. Donc je pense me lancer dans ce petit projet grâce à  OpenGl ES, j'ai d'ailleur lu quelque tuto (notamment sur ipup.fr) . Mais j'ai deux petites question qui me bloquent dans mon avancé.

Déjà  voici ce que je pense avoir compris (dites moi si je me trompe :p) , pour afficher une image, on créer des vertices (ou vertex) qui forment une surface, en général en 2D on creera des formes carrés. Puis sur ces forme on appliquera notre image.

Ensuite j'ai quelque question :

- Est ce que pour chaque image que je veut afficher il faut créer une nouvelle surface (vertex) à  chaque fois ? (si je veut afficher 10 images, il faut que je créé 10 surface carré ?)

- Comment faire pour que la surface de mon carré soit équivalent à  la taille de mon image ? (car si j'ai une image qui fait 5*5 pxl et que ma surface fait 30*30 pxl, mon image sera stretché (zoomée), or je souhaite que mon image fasse 5*5 pxl puisque ce sont sa largeur et longueur initiale)

Voila ce sont principalement ces deux questions qui me posent réellement soucis. Sachez que je n'ai pas encore commencé à  coder le moteur 2D donc je suis prêt à  entendre toute suggestion / critique.

Merci d'avance et bonne soirée.

Réponses

  • DrakenDraken Membre
    06:15 modifié #2
    Qu'est-ce qui ne convient pas a tes besoins dans Cocos2D ? Il parait assez complet.

    Sinon, je te conseille de regarder le code de la classe Texture2D de Cocos2D. Tu y verras comment charger une image à  partir du disque, et la dessiner sur l'écran.

    Et il faut effectivement définir un nouveau tableau de vertex à  chaque affichage d'une image. Voici le code source de la méthode Texture2D:drawInRect utilisée par Cocos2D pour dessiner une image sur l'écran :

    - (void) drawInRect:(CGRect)rect<br />{<br />	GLfloat	 coordinates&#91;] = {&nbsp; 0.0f,	_maxT,<br />								_maxS,	_maxT,<br />								0.0f,	0.0f,<br />								_maxS,	0.0f&nbsp; };<br />	GLfloat	vertices&#91;] = {	rect.origin.x,							rect.origin.y,							/*0.0f,*/<br />							rect.origin.x + rect.size.width,		rect.origin.y,							/*0.0f,*/<br />							rect.origin.x,							rect.origin.y + rect.size.height,		/*0.0f,*/<br />							rect.origin.x + rect.size.width,		rect.origin.y + rect.size.height,		/*0.0f*/ };<br />	<br />	glBindTexture(GL_TEXTURE_2D, _name);<br />	glVertexPointer(2, GL_FLOAT, 0, vertices);<br />	glTexCoordPointer(2, GL_FLOAT, 0, coordinates);<br />	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);<br />}<br />
    




  • CéroceCéroce Membre, Modérateur
    06:15 modifié #3
    dans 1248020249:

    - Est ce que pour chaque image que je veut afficher il faut créer une nouvelle surface (vertex) à  chaque fois ? (si je veut afficher 10 images, il faut que je créé 10 surface carré ?)


    Oui, il faut.
    Pour des raisons de performances, si tu ne modifies pas une figure, il faut la placer dans une "liste d'affichage". Elle est alors mise en cache par le processeur graphique.

    dans 1248020249:

    - Comment faire pour que la surface de mon carré soit équivalent à  la taille de mon image ? (car si j'ai une image qui fait 5*5 pxl et que ma surface fait 30*30 pxl, mon image sera stretché (zoomée), or je souhaite que mon image fasse 5*5 pxl puisque ce sont sa largeur et longueur initiale)


    Déjà , sache qu'avec OpenGL, les dimensions des textures (c'est ainsi qu'ils appellent les bitmaps) doivent être des multiples de puissances de deux. Tu peux préciser quelles coordonnées de la bitmap correspondent à  quelles coordonnées du polygone, dans la déclaration de la texture, il me semble.

    dans 1248020249:

    Voila ce sont principalement ces deux questions qui me posent réellement soucis. Sachez que je n'ai pas encore commencé à  coder le moteur 2D donc je suis prêt à  entendre toute suggestion / critique.


    Cocos2D fait probablement déjà  ce que tu veux.
  • AliGatorAliGator Membre, Modérateur
    06:15 modifié #4
    Oui en plus créer un moteur graphique, surtout quand on ne connais pas spécialement le domaine et encore plus OpenGL ES, c'est mal barré.
    Y'a un sacré paquet de trucs d'optimisation (vertex buffers n'étant qu'un exemple des plus flagrants) que si tu ne maà®trises pas, ça n'a aucun intérêt de faire ton propre moteur graphique alors qu'il y en a déjà  des existants qui seront 100x plus optimisés
  • DrakenDraken Membre
    juillet 2009 modifié #5
    Oui, enfin il s'agit ici de créer un petit moteur 2D OpenGL, rien à  voir avec la complexité d'un moteur 3D.

    A tout casser, une scène 2D est composée de 200 à  1.000 vertex. Combien dans une scène 3D ? 50.000, 100.000 vertex ? Et il n'y a pas de transformations de coordonnées à  faire en fonction des mouvements de la caméra, pas de matrices à  calculer, pas de rotations, pas de mise à  l'échelle, etc.

    Bref, pas besoin d'optimiser à  mort pour de la 2D simple.

    EDIT

    De la même manière on n'as pas besoin d'utiliser une méthode de filtrage  de pixels évoluée pour afficher une texture à  plat, surtout si l'image de destination à  la même taille que la texture. ça fait gagner du temps au niveau des traitements graphiques effectués par le moteur de rendu.

  • DrakenDraken Membre
    06:15 modifié #6
    Human, pour commencer, regarde le template GLSprite du forum Apple.

  • Human-BehindHuman-Behind Membre
    06:15 modifié #7
    Merci a tous pour vos réponses.

    Pour répondre à  Aligator et à  Céroce, en fait je n'aime pas trop cocos2D, je sais pas trop pourquoi mais je n'aime pas la façon dont a été pensé le moteur (ou certainement que je ne suis pas assez habitué :p ). Cependant je vous accorde le fait que cocos2D est certainement mieux optimisé que mon (futur) moteur 2D.

    @Draken : Merci pour ces pistes, je vais y jetter un coup d'oeil dés que je serai sous mac OS :p .
Connectez-vous ou Inscrivez-vous pour répondre.