Demande de squelette [résolu]

Bon, il fut un temps fort fort lointain, Steph m’a dit qu’il ferait un merveilleux tuto pour faire ce que je voulais en HD
 De mon cĂŽtĂ©, il s’est passĂ© des choses et du sien aussi, mais voilĂ , le temps passe et le tuto n’est pas lĂ  pour le moment. Du coup, je reviens Ă  la charge avec une demande plus simple. Bon, je demande Ă  Steph car je sais qu’il a bossĂ© sur le sujet mais si quelqu’un se sent de rĂ©pondre, je ne suis pas regardant.
Je voudrais un squelette d’exemple pour pouvoir allumer ou Ă©teindre des sprites ayant des positions fixes sur l’écran en HD (bien sĂ»r, sinon ce ne serait pas drĂŽle, ces sprites ont une position donnĂ©e qui ne peut pas ĂȘtre modifiĂ©e pour ĂȘtre totalement d’un cĂŽtĂ© d’une ‘bande’ d’écran correspondant au buffer).

En fait ce que je demande c’est un squelette de retranscription d’un jeu Game & Watch sur la META en HD, sans les graphsimes, sans le moteur du jeu mais juste la possibilitĂ© d’afficher ou d’éteindre ces sprites contenus dans un tableau.

En plus ça va peut ĂȘtre reveiller un peu Stephane qui semble avoir gardĂ© le rythme des vacances. C’est la rentrĂ©e, on se rĂ©veille mĂȘme si tu rĂ©ponds depuis la plage avec ton cocktail Ă  cĂŽté  :smiley:

Bon, ça vaut ce que ça vaut parce que mon code est ignoble, mais j’ai ce genre de code dans project88.

La fonction drawFrame (https://github.com/alban-rochel/gamebuino-project88/blob/master/project88/project88.ino#L1109) dessine l’image ligne par ligne, alternant les buffers envoyĂ©s par DMA
En pseudo-code, cette fonction fait :

  • Pour toute ligne : for(unsigned int y = 0; y < SCREEN_HEIGHT; ++y, ++yStrip)
    • Si on dessine le ciel
      • (routine spĂ©cifique)
    • Sinon
      • On dessine la ligne de route correspondant Ă  la profondeur de la ligne
      • On dessine tous les bouts de sprites (Drawable) sur cette ligne
    • Si on a finit notre bande : if(yStrip == STRIP_HEIGHT)
      • On envoie la bande Ă  l’écran : strip = gm.CommitStrip(taskSet); (taskSet Ă©tait un truc que vous pouvez ignorer)

Pour dessiner les sprites sur une ligne y : fonction drawSprites https://github.com/alban-rochel/gamebuino-project88/blob/master/project88/project88.ino#L1049

  • Pour tout Drawable
    • Si ses coordonnĂ©es y extrĂȘmes comprennent le y en entrĂ©e if(y >= current->yStart && y <= current->yEnd)
      • if(current->zoomPattern == 8) <- pas de zoom Ă  gĂ©rer, c’est le cas standard
        • On rĂ©cupĂšre l’adresse dans le buffer du dĂ©but de ligne du sprite (spriteBufferWithOffset)
        • On regarde de combien on se dĂ©cale dans ce buffer: 0 en gĂ©nĂ©ral, mais on peut commencer par exemple Ă  5 si le sprite est sur le bord gauche de l’écran (x <0), c’est le sens de coordInSprite
        • On copie depuis spriteBufferWithOffset+coordInSprite vers le buffer image, en prenant garde Ă  ne pas dĂ©border de la ligne (for(; coordInSpritesprite->width && xIndex < SCREEN_WIDTH; ++coordInSprite, ++xIndex))

Et c’est tout.

Mais on peut faire plus propre et plus simple je pense :wink:

Merci Alban. En tout cas c est déjà un moyen de le faire. J attends un peu de voir s il y a d autres propositions. Bon il faudrait que je lance un sujet pour connaitre un peu les envies de tout le monde et les projets en cours.

Je t’ai entendu mon petit :joy: 


Je suis dĂ©solĂ© pour le dĂ©lai
 l’eau a coulĂ© sous les ponts, et j’ai laissĂ© en plan les diffĂ©rents chantiers que j’avais amorcĂ©s autour de la META
 Le manque d’activitĂ© participative de la communautĂ© y est pour beaucoup, je ne te le cache pas !

NĂ©anmoins, je vais tĂącher de te coder un truc rapidos (dĂšs ce soir) pour que tu puisses commencer Ă  dĂ©velopper ton jeu :innocent: 
 je n’aurai pas le temps de te faire un tuto dĂ©taillĂ© dans l’immĂ©diat, mais je vais commenter mon code pour que tu puisses comprendre la dĂ©marche plus facilement. Et tu verras, c’est pas sorcier :wink:

Je te tiens au jus rapidement 
 promis !

Super, merci Steph. Le squelette avec quelques commentaires me suffit tout Ă  fait et c’est la rentrĂ©e. On a dĂ©jĂ  eu le tuto de Chris, un super jeu tout neuf, on remet la machine en route pour qu’elle soit prĂȘte en Septembre. :slight_smile:

:thinking: 
 y’a quoi en septembre ???

C’est la rentrĂ©, les affaires reprennent avec l’activitĂ©. On sort de la torpeur de l’étĂ© et on se remet Ă  faire des super jeux, non ?
PS (encore un hors-sujet): Ca marche bien ton site avec tes tutos. Vous devriez fusionner avec ceux de Chris, non ?

Comme promis, voici un embryon de projet qui devrait te permettre de mettre le pied Ă  l’étrier pour le dĂ©veloppement de jeux dans la lignĂ©e des Game & Watch de Nintendo. J’ai volontairement mis de cĂŽtĂ© la programmation orientĂ©e objet pour ne pas ajouter de difficultĂ© Ă  la bonne comprĂ©hension de la mĂ©thodologie gĂ©nĂ©rale pour la gestion de ce type de jeu. Le proto utilise la haute dĂ©finition de la META (160x128). Tu as toutes les clefs nĂ©cessaires pour ĂȘtre dĂ©sormais en mesure de coder des jeux avec cette rĂ©solution. Tu verras que ça n’est pas si compliquĂ© :wink:

J’ai rĂ©cupĂ©rĂ© les Ă©lĂ©ments graphiques sur http://www.mariouniverse.com/ et les ai adaptĂ©s aux contraintes de la META. J’ai simplifiĂ© la spritesheet pour les besoins de la dĂ©monstration. On peut largement l’optimiser, mais j’ai prĂ©fĂ©rĂ© l’organiser de telle sorte que les sprites soient d’ores et dĂ©jĂ  en place pour simplifier les calculs du rendu. J’ai numĂ©rotĂ© les postures du singe pour te faciliter la comprĂ©hension du code et des tables de transitions comportementales du joueur.

Il ne s’agit en aucun cas d’un jeu complet ! Ce projet constitue plutĂŽt un point de dĂ©part qui esquisse une mĂ©thodologie de rĂ©alisation pour ce type de jeu. J’ai tĂąchĂ© de commenter le code pour qu’il soit aisĂ©ment comprĂ©hensible. N’hĂ©site pas Ă  revenir vers moi si tu rencontres des difficultĂ©s de comprĂ©hension sur certains Ă©lĂ©ments.

Le code et les éléments graphiques sont disponibles sur mon GitHub.

Voilà ce que ça donne en images :

demo-320x256

En espérant que cela corresponde à ce que tu attendais :wink:

Amicalement,
Steph

1 Like

Whoua super Steph. Tu as tenu ta promesse. Je regarde ça Ă  partir de ce weekend et aprĂšs ce sera Ă  moi de jouer. Je vais essayer d’enchaĂźner les g&w. Je te fais un retour plus complet sans doute durant la semaine prochaine aprĂšs avoir regardĂ© de plus prĂȘt. :wink:

J’ai regardĂ© le code de plus prĂȘt et c’est vraiment chouette :wink:
Ce n’est pas du tout comme j’avais fait “Parachute” mais entre autre par ce que je n’avais pas su gĂ©rer la planche de sprite. Pourtant quand on regarde comment tu l’as codĂ©, ça parait si simple
 Bon du coup je pense que je m’attellerais aussi Ă  coder Donkey Kong Junior. Il parait si joli sur la plateforme. :slight_smile: A moi de bosser maintenant.

1 Like

Content que cela puisse vraiment t’aider :slight_smile:
Maintenant on attend tes petits jeux G&W !!!

Bon Steph j’ai commencĂ© Ă  prĂ©parer l’intĂ©gration des sprites
J’ai testĂ© le remplacement dans ton code mais pour rester sur le mĂȘme principe j’ai divisĂ© les sprites en 2 planches pour Ă©viter le recouvrement (j’ai divisĂ© en une spritesheet_A et une spritesheet_B)
Je mets ci dessous les graphiques

background spritesheet_A spritesheet_B

Les numéros des sprites sont définis ici
spritesheet_num%C3%A9rot%C3%A9e

Ce qui donne sur les spritesheet
spritesheet_A_box spritesheet_B_box

La planche avec tous les sprites n’est pas utilisĂ©e mais je la mets quand mĂȘme au cas oĂč :wink:
spritesheet

Et une vesion png du tite comme les BMP ne peuvent pas ĂȘtre mis dans les messages:TITLESCREEN

Ton squelette et super bien fait, du coup, pour les sprites, je rajoute juste l’info pour savoir si le sprite se trouve sur la planche A ou B et je fais un test dans la procĂ©dure drawsprite pour prendre la couleur dans la bonne feuille.

Je vais implĂ©menter ça rapidement maintenant. Encore un peu de temps Ă  prendre sur une soirĂ©e et ça devrait ĂȘtre testable dans une premiĂšre version :wink:

Ha ha je vois que tu avances bien :wink:

Tu aurais aussi pu utiliser la mĂȘme spritesheet en laissant tous les sprites en place, mais en utilisant des couleurs diffĂ©rentes pour distinguer les sprites dont les enveloppes se chevauchent
 et modifier la fonction drawSprite() pour pĂ©cho les pixels de la bonne couleur en fonction du sprite Ă  dessiner :wink:

Allez, on attend ta démo !

Ca ne tardera pas
Pas bossĂ© dessus hier mais actuellement il y a le fond, le Sprite statique de l’hĂ©lico et en dernier j avais ajoutĂ© la barque dĂ©placable.
J avais voulu vérifier que je n avais rien raté mais c est vrai qu avec ta structure de programme c est trÚs simple
Il ne me reste plus qu à remettre la logique du jeu mais je vais sans doute la modifier. Je vous tiens au courant bientÎt en créant une création. Ce sujet est clos, le squelette marche bien :wink:

Ajout de @Steph:
En fait, je souhaitais revenir sur un point crucial que j’ai complĂštement oubliĂ© d’évoquer dans ma proposition initiale. L’usage de l’API gb.tft avec la technique d’Andy n’est nĂ©cessaire que si l’on souhaite exploiter pleinement l’espace colorimĂ©trique RGB565 avec une rĂ©solution de 160x128 , du fait de la limitation mĂ©moire de la META.

En effet, il est tout Ă  fait possible de s’en tenir Ă  l’usage standard de l’API gb.display dans la mesure oĂč on se restreint Ă  un espace colorimĂ©trique de 16 couleurs. Il suffit pour cela d’utiliser le mode d’affichage spĂ©cifique DISPLAY_MODE_INDEX de la META, qui correspond Ă  une rĂ©solution de 160x128 en 16 couleurs indexĂ©es. Ce paramĂ©trage doit ĂȘtre fixĂ© dans le fichier config-gamebuino.h accompagnant le croquis de l’application avec la ligne suivante :

#define DISPLAY_MODE DISPLAY_MODE_INDEX

J’ai mis Ă  jour mon dĂ©pĂŽt GitHub de dĂ©mo qui intĂšgre dĂ©sormais les deux approches :wink:

1 Like