Parachute HD (META)

Pour cette histoire de sujet clos, effectivement je ne trouve pas qu’il soit trĂšs utile de fermer les sujets personnellement. Meme si ta demande ou ta question a trouvĂ© une rĂ©ponse ça peut etre bien de laisser la possibilitĂ© Ă  la discussion d’évoluer ;), d’autres peuvent se servir du sujet pour poser leur propre question, la rĂ©ponse peut Ă©voluer, etc


Bon courage pour la suite de ton dev en tout cas, ça a l’air chouette !

Oui aprĂšs rĂ©flexion, je suis d’accord, j’ai dĂ©verrouillĂ©. Ce n’est en effet pas utile.

1 Like

Encore une question. Peut-on changer le mode d’affichage en cours dynamiquement pour passer du mode Haute dĂ©finition Ă  Basse rĂ©solution quand on en a besoin (Par exemple pour afficher un Ă©cran de remerciements ou un tableau des scores sans trop consommer de mĂ©moire et en plus, autant je peux avoir un Ă©cran Ă  charger pour les remerciements mais je dois trouver un moyen de gagner de la mĂ©moire car j’occupe dĂ©jĂ  tout, autant je ne peux pas prĂ©voir de sprites pour le tableau des scores, alors je pense au plus simple qui serait d’utiliser les bons vieux print). A moins qu’il y ait d’autres solutions auxquelles je ne pense pas.

Non
 Tu dois, dĂšs le dĂ©part, dĂ©terminer quel sera le mode d’affichage avec lequel tu souhaites travailler.

  • Soit tu utilises l’API standard gb.display en haute dĂ©finition (160x128) (en dĂ©finissant la macro DISPLAY_MODE avec la valeur DISPLAY_MODE_INDEXED dans le fichier config-gamebuino.h). Et Ă  ce moment lĂ , tu peux bĂ©nĂ©ficier de toutes les fonctions prĂ©dĂ©finies par cette API comme gb.display.drawImage(), gb.display.print(), etc. Mais tu es limitĂ© Ă  16 couleurs au total.

  • Soit tu tournes le dos Ă  l’ensemble de cette boĂźte Ă  outils et tu te retrousses les manches pour effectuer tes tracĂ©s bit par bit sur des framebuffers partiels (les fameuses tranches horizontales qui sont calculĂ©es une Ă  une pour effectuer le rendu global de la surface de l’écran) avec l’API de bas niveau gb.tft. Mais dans ce cas, tu profites des 65 536 couleurs que t’offre l’espace colorimĂ©trique RGB565.

Dans ton cas, la premiĂšre solution est sans doute la plus simple, d’autant plus qu’avec 16 couleurs t’es dĂ©jĂ  laaaarge pour faire du Game & Watch ! Par contre, si tu rencontres des limitations mĂ©moire, il faudra optimiser tes ressources graphiques pour limiter au maximum l’occupation de la RAM au moment d’invoquer la fonction gb.display.drawImage(). Tu noteras au passage, que dans le code que je t’ai proposĂ©, je n’instancie les objets Image qu’à l’intĂ©rieur de la fonction qui effectue le rendu de l’élĂ©ment graphique concerné  De cette maniĂšre, l’objet Image n’occupe de la place en RAM que pendant la durĂ©e de l’exĂ©cution de la fonction ! En effet, tous tes Ă©lĂ©ments graphiques sont dĂ©clarĂ©s comme des tableaux d’entiers constants. Ils seront donc hĂ©bergĂ©s dans la mĂ©moire Flash. C’est seulement au moment oĂč tu crĂ©es une instance de Image que les donnĂ©es sont copiĂ©e en RAM. D’oĂč l’intĂ©rĂȘt de ne pas les faire subsister trop longtemps, sinon tu atteindras rapidement la limite de la mĂ©moire disponible


En jonglant correctement avec l’hĂ©bergement volatile de tes ressources graphiques en RAM, tu devrais pouvoir gĂ©rer tous les Ă©crans que tu souhaites sans problĂšme !

En aucun cas il ne faut déclarer tes instances de Image comme des variables globales !!!..

J’espùre que je suis assez clair dans mes explications :blush:

Si tu ne l’as pas dĂ©jĂ  fait, regarde attentivement le code que j’ai ajoutĂ© sur mon GitHub, dans le dossier with-gb-display. Si tu l’as dĂ©jĂ  fait, relis-le avec plus d’attention :wink:

OK, bon de toute façon, je continue un peu Ă  coder ce soir et je posterais mon code. Comme ça tu pourras jeter un Ɠil si tu as le temps et me dire si je peux amĂ©liorer des choses.
Pour le moment, du coup, je vais essayer de faire le jeu simplement et on verra aprĂšs si on peut amĂ©liorer avec tout ceux qui veulent regarder et qui voudront m’aider Ă  faire mieux. Dans un premier temps, il faut que je termine cette partie du code (le score) et ajouter la fin de partie et le regain de vie a certains scores pour finir le jeu avant de partager le code pour l’amĂ©liorer.

OK, version source MAJ sur Github - je fais une MAJ de la crĂ©ation avant d’aller dormir.
La version inclue la gestion de la Pause par A ou B, l’affichage du score et du Game Over.
Bon, il y a un petit bug sur la procĂ©dure d’affichage de Pause et GameOver mais pas trĂšs gĂȘnant et comme il est tard je rechercherais la prochaine fois sauf si quelqu’un trouve entre temps.

Voilà, si vous regardez le code et voyez des améliorations à faire, je prends
 :wink:

Hello @jicehel ! Et désolé de te répondre si tard


Bon, globalement c’est pas mal du tout ! Le rendu est plutît satisfaisant :wink:

Pour pinailler un peu 
 je trouve que tu te compliques un peu la vie au niveau du code et qu’on peut le simplifier
 mais c’est dĂ©jĂ  trĂšs bien que tu aies rĂ©ussi Ă  surmonter les difficultĂ©s (surtout d’ordre mathĂ©matiques et logiques) liĂ©es au calcul de rendu sur les framebuffers partiels !

Je ne vais pas reprendre tout ton code, mais je voudrais nĂ©anmoins t’apporter un Ă©clairage sur le bug d’affichage des messages “PAUSE” et “GAME OVER”.

Il a fallu que je fasse un peu de reverse-engineering sur tes spritesheets (car les assets de ton dĂ©pĂŽt ne correspondent pas tout Ă  fait aux tableaux d’entiers 16-bits que tu utilises dans ton code). J’me suis fait un p’tit script rapidos pour reconstruire l’image originale que tu as transcodĂ©e pour obtenir ton tableau SPRITESHEET_A, que voici (agrandie 2x) :

Pour l’affichage des textes, la mĂ©thode de calcul du rendu diffĂšre lĂ©gĂšrement de celle utilisĂ©e pour isoler les autres sprites. En effet, les sprites sont dĂ©jĂ  positionnĂ©s sur la spritesheet Ă  l’endroit oĂč ils sont censĂ©s apparaĂźtre Ă  l’écran. Mais ça n’est pas le cas pour les textes
 d’oĂč la nĂ©cessitĂ© d’appliquer une autre mĂ©thode de calcul. Pour cela, j’ai Ă©crit une nouvelle fonction drawText() en modifiant lĂ©gĂšrement ce que j’avais fait pour la fonction drawSprite(). Cette nouvelle fonction drawText() vient remplacer ta fonction drawSpriteXY() (que tu peux fouttre Ă  la poubelle du coup :joy:).

En premier lieu, j’ai relevĂ© une petite erreur de positionnement (en y) de ton texte Sprite_pause. Tu peux corriger la ligne 124 ainsi :

Sprite Sprite_pause = { SC_A, 1, 9, 28, 7 }; // y = 9 et pas 8...

Ensuite, modifie la ligne 445 ainsi :

// remplace :
drawSpriteXY(Sprite_gameOver, sliceY, buffer, 53, 60);
// par :
drawText(Sprite_gameOver, sliceY, buffer, 53, 60);

MĂȘme chose Ă  la ligne 456 :

// remplace :
drawSpriteXY(Sprite_pause, sliceY, buffer, 66, 60);
// par :
drawText(Sprite_pause, sliceY, buffer, 66, 60);

Puis remplace ta fonction drawSpriteXY() Ă  la ligne 577 par la nouvelle fonction drawText() :

void drawText(Sprite sprite, uint8_t sliceY, uint16_t* buffer, uint8_t x, uint8_t y) {
  if (sliceY < y + sprite.h && y < sliceY + SLICE_HEIGHT) {
    uint8_t xmin = x;
    uint8_t xmax = x + sprite.w - 1;
    uint8_t ymin = y < sliceY ? sliceY : y;
    uint8_t ymax = y + sprite.h >= sliceY + SLICE_HEIGHT ? sliceY + SLICE_HEIGHT - 1 : y + sprite.h - 1;

    uint8_t  px, py, sx, sy;
    uint16_t color;

    for (py = ymin; py <= ymax; py++) {
      sy = py - y + sprite.y;
      for (px = xmin; px <= xmax; px++) {
        sx = px - xmin + sprite.x;
        color = SPRITESHEET_A[sx + sy * SCREEN_WIDTH];
        if (color != TRANS_COLOR) {
          buffer[px + (py - sliceY) * SCREEN_WIDTH] = color;
        }
      }
    }
  }
}

Tu vois que le calcul est légÚrement différent pour aller chercher les bons pixels sur la spritesheet.

Tu peux recompiler et exĂ©cuter ton code sur ta META, tu verras que cette fois, les textes “PAUSE” et “GAME OVER” sont correctement reproduits :wink:

D’une maniĂšre plus gĂ©nĂ©rale sur le rendu global du jeu, plutĂŽt que de multiplier les â€œĂ©crans” et les personnalisations ostensibles, j’aurais personnellement prĂ©fĂ©rĂ© que tu essaies de reproduire le plus fidĂšlement possible la planche LCD originale :

Fais du Game & Watch jusqu’au bout :wink:

Mais globalement, c’est un bon rĂ©sultat pour une premiĂšre virĂ©e dans la dark side of gb.tft


Cool. Pour la planche unique c était compliqué car les rectangles qui entouraient les sprites se recouvraient alors j aurais pu les réduire mais je voulais garder les sprites le plus gros possible

Merci pour la correction de la fonction. J aurais dĂ» y passer du temps je pense et pour le moment je ne m y suis pas encore remis.

Je fais la man et j ai pensé à une solution: recréer la fonction print en intégrant les caractÚres et quelques ponctuations. Ca permettrait de générer facilement l ecran de menu et de remerciements. Une fois le jeu fini dans sa premiÚre version, j essayerais.
Merci pour ton aide et n hĂ©sites surtout pas pour les conseils comme de toute façon je passerais plus de temps sur ce premier g&w les prochains allant rĂ©utiliser bcp des mĂȘmes fonctions

Je t’avais dĂ©jĂ  apportĂ© une rĂ©ponse concernant la possibilitĂ© d’utiliser une spritesheet unique


Pour les sprites dont l’enveloppe rectangulaire a une intersection non vide avec celles de ses voisins, il suffisait simplement d’utiliser une autre couleur pour les distinguer. Dans tous les cas, au moment du rendu, le code couleur Ă  utiliser pour Ă©crire dans le framebuffer sera le noir 0x0000, donc tu peux te permettre d’ajouter une propriĂ©tĂ© Ă  la structure Sprite qui correspond Ă  la couleur qui le caractĂ©rise sur la spritesheet de maniĂšre Ă  pouvoir l’identifier facilement au moment de sa copie lors du calcul de rendu.

Quant à la fonction de rendu d’une chaüne de caractùres, c’est un bon exercice auquel se frotter :wink:

Oui, j’avais lu ta solution mais aprĂšs avoir fait les 2 planches, comme les sprites Ă©taient fait et que c’est un peu long, je ne l’ai pas refait mais c’est notĂ© pour les prochains jeux, c’est une mĂ©thode que j’essayerais.

Aaa. Now it’s my turn to test a new game. We will see how it works :slight_smile:

1 Like

Great! Nearly like the original game. Any option planned to save highscores or have more of this (like octopus or DK Junior?)

Hello, atm has Steph had made a part of the job and that he will continue it in a tuto, he will make Donkeykong Jr. Me i planned to adapt Fire as the game already exist in normal res, i’ll take a part of it to manage the gameplay but i’ll change some things first to use the same structure that the one Steph made because i like it and because i have my own vision of the game
 :wink: Else i manage to port Judge and Ball 2 old G&W games.
I planned no other game atm as if i planned too many, it’s will take time and as Steph will make a tuto, some will probably take some of these old cool games to port them (octopus is a good example, but there are alot).
For the game, i have to make some clean on the program and wait for steph tuto to see if i have some things to change / add and since i wait, i’ll try to add a function to be able to print on screen, for a highscore screen. Else in the options, i will add ability to turn the sound off from the start screen by pressing b. I’ll add a music on titlescreen (that button b will turn off too), but i don’t know yet wich music.
Else i saw on Arduboy forum the idea to make the game states class and but in the function. The idea is fine and if the tuto isn’t done before, it’s probable that i’ll try to do it.
When this game will be completed, then i’ll pass to fire, ball and judge but i think it’s will be quick then as the structure of the program will be clean and easy to adapt.

2 Likes

Looking forward to see more of those classics :slight_smile:

1 Like

thanks for your answer - looking forward then for whatever will follow!

Ok. Tested. Nice game. Is speed increase during game progress? Because I didn’t notice it during gameplay. Very good Implementation. :slight_smile:

1 Like

J’suis un peu perdu dans tes dĂ©pĂŽts :joy:
Quelle est la version qu’on doit tester ?

  1. https://github.com/Jicehel/Parachute_Meta
  2. https://github.com/Jicehel/Parachute_Meta_V2

Je préfÚrerais directement tester celle qui est la plus à jour et la mieux optimisée


En fait, c’est la META_V2 mais elle est en cours. Comme je bidouille dessus, je ne communique pas dessus, mais bon, je n’ai rien fais depuis une semaine
 Je retravaillerais le source encore avant d’en parler, c’est pour ça que je n’ai pas du tout communiquĂ© sur la V2

Parachute_Meta et actuellement la version officielle, celle qui est sĂ»r de fonctionner alors que sur la V2, rien ne garanti qu’il n’y ait pas de problĂšmes par moment.
Je mettrais à jour la création dÚs que je serais satisfait du code de la V2 (et je vais sans doute aussi prendre des idées dans ton code pour le modifier et le compléter)

Hello Jicehel,

Je viens aux news concernant la finalisation de ton Parachute v2

T’as pu avancer un peu ? Ton dernier commit remonte à prùs de 3 semaines :confused:
Ne laisse pas refroidir ton projet
 sinon tu risques de ne jamais le terminer


Hum, un peu compliquĂ© en ce moment, je n’avais pas trop la tĂȘte Ă  programmer mais je vais m’y remettre un peu aujourd’hui, demain et mercredi. Ne t’inquiĂštes pas mais si je ne donnes pas de nouvelle c’est que je ne me mets pas dessus.