Saturday, April 29, 2017

Adding the MapAnim

 Allons-y donc pour l'ajout d'un nouveau type d'animations dans mon moteur de jeu: la modification du contenu de la map elle-même dans le temps. Jusqu'ici, c'était limité à "faire disparaître le bloc en (x,y)" ou "retire-lui ses propriétés, mais laisse-le visible" (pour les bonus cachés). ça peut marcher pour certaines choses, mais ça suppose que les éventuels effets liés à la disparition soient entièrement pris en charge par un sprite supplémentaire. Idéal si l'image doit quitter son emplacement (un morceau de pont qui tombe, un décompte des points qui monte, etc), celà dit.

Let's have one more way of animating things in my game engine. One that would be suited to special blocks, and that update the map content at a specific location over time. The only thing I could do so far would be to shoot a sprite-manipulating game object and make the block disappear. That's mostly appealing if you want a picture to move away, like broken bricks, falling logs and the like. 
The "BlockAnim", used to animate the ink, is not interactive and apply simultaneously to all the instances on screen. It can make SMW coins spin, but it cannot leave a trail of sprinkling sparkles behind.

Now, let's resume the coding, I'll keep you updated on the outcome. I already love the animation I designed last night for the bouncing erasers ^_^.

Il y avait aussi les "blockanims", qui permettraient par exemple de faire tourner les pièces de Super Mario World sur elles-même. On procède alors par une mise à jour de la mémoire "tiles" et toutes les instances de l'objet sont mises à jour simultanément sur l'image à l'écran.

Le nouveau "MapAnim", lui, correspond plutôt aux besoins pour faire bouger un buisson devant lequel on passe, mettre des petites étoiles là où il y avait un bonus, etc. Comme vous pouvez le constater sur les diagrames, le mécanisme qui permet de mettre à jour le niveau (les données gérées par la classe InfiniMap) n'est pas particulièrement simple. Il met en jeu une description de chaque type de bloc spécial (les BlockInfos) et un objet temporaire capturant "tel bloc à tel endroit" (le BlockArea) qui permet d'interagir avec le personnage (GameObject) qui vient de passer par là. C'est finalement InfiniMap lui-même qui procède à l'effacement sur base du résultat du test de collision. La seule bonne nouvelle, c'est que c'est assez souple pour permettre des (petites) portes, des bonus, des bumpers et même les guides invisibles qui font faire demi-tour aux encriers.


Koopa 3D

Houlalaa... je retombe sur une vieille image de synthèse que j'avais réalisée dans moray/povray et présentée à la Inscene '99 ...

Quand je vous dis que la 3D, ce n'est pas pour moi, c'est pas une blague, hein.

Coming straight from my attempt to conquer the demoscene in 1999. I tried to use basic primitives (mostly spheres) to model a ray-traced koopa. This is likely the most complex model I've ever made, then had to study NURBS equation at school.

Can we agree that I'd better stick to 2D ?

Friday, April 28, 2017

[section pour ch1]

Le nouveau moteur

Le premier a bien servi. Après Apple Assault, il a pu être étendu pour réaliser School Rush, plus coloré. Mais il est temps de retourner à la table à design: il reste certaines fonctions plus avancées qui n'ont toujours pas pu voir le jour. Encore plus de couleur, plus de pentes, une gestion plus réfléchie des blocs spéciaux... C'est le moment de mettre en place ce que l'étude des autres jeux nous a appris.

Thursday, April 27, 2017

pauvre Game Feel

Je n'ai pas de définition de "Game Feel" à proposer. C'est juste un mot pour parler de ce qui fait que le jeu semble attrayant, divertissant. Les petits nuages de fumée de Rayman, les bananes qui s'envolent vers le compteur de DKC, la pièce d'or qui bondit hors des blocs-question dès Super Mario Bros sur NES...

Toutes des choses dont mon School Rush est actuellement dépourvu, comme le faisait remarquer Romain Claude:

Après le feeling avec le jeu c'est une tonne de choses à soigner : les réglages des paramètres physiques, les animations, tous les petits détails de feedback à droite à gauche qui rendent le tout "rewardant" et jouissif. Pour le moment le jeu est assez dépourvu de tout ça. Les gommes rebondissantes par exemple, si elles étaient animées cela rendrait le rebond plus satisfaisant et plus clair sur le fait que cet objet réagit.
Et qui est repris également sur le forum "e-magination", même rien qu'en regardant les images d'accroche:
Ce serait chouette que les bonus affichent un petit effet quand on les récupère, selon moi, ce serait moins "tristoune"
 J'y ajouterais bien un peu de secousse de caméra quand on donne un coup de poing au sol, si jeu peux.

It seems like people have dedicated the words "game feel" for all those little details that make a videogame feel more alive and reacting to player's actions. Dust clouds, sparkles, bananas flying towards their counter and things alike. It is becoming a recurring comment on current School Rush that I lack such little animations that should provide important feedback and make the player smile. 

Unfortunately, I have considered them as unimportant for most of the development and I'm now near the limits of the current game engine, especially when it comes to new graphics for the sprites. Both eraser-bumpers and disappearing bonuses will thus have to be implemented that patching the tilemap according to some animation commands ... something for which I haven't got code for. So far, the closest I had was pushing new graphics into the sprite/tilesets, which animates all the instances simultaneously.

Pour les bonus et les gommes animées, par contre, ça demande d'ajouter au map elle-même (et pas le remplacement des images du tileset comme c'est le cas pour les animations non-interactives : l'encre, les pommes qui se balancent dans la Green Zone, etc). J'avais pensé un temps m'en sortir avec un sprite temporaire, mais ma planche de sprite est trop remplie pour que ça puisse passer.
Je vais donc devoir rajouter au moteur de jeu un composant que j'ai retardé depuis probablement trop longtemps: l'animation d'un objet par manipulation du contenu de la map elle-même.

Tuesday, April 25, 2017

Rushed difficulty selector ?

It took me about one year to realise that my difficulty selection interface on the main menu of School Rush had a flaw. It perfectly moves the cursor up and down with the DPAD, but it will only register the difficulty selection and apply it in-game if you used the stylus to perform your selection. Pretty annoying. Now I understand better why people considered the game a bit too hard ^^"

Aargh! Quelle horreur. Je me retrouve avec une interface incohérente pour le choix de la difficulté de School Rush! et depuis près d'un an sans m'en être rendu compte jusque là !? Tout fonctionne si on choisit son niveau de difficulté au stylet (chose plutôt rare, convenez-en) mais si on utilise les direction "haut" ou "bas" du DPAD, on reste en fait bloqué en mode "normal" ...

Vive les revues de code >_<

Monday, April 24, 2017

Round 2 (P.Y. vs. PypeBros)

Allez, je prends une petite demie-heure pour répertorier les questions et les posts qui me viennent en tête quand j'écoute la deuxième partie de l'interview avec P-Y.

01% - faire le jeu auquel on rêve de jouer ? 00:20 - another world - prince of persia - titus - rayman
15% - priorité au plaisir de créer ? 03:13
        - rpg essentialiste
30% - l'évolution dans le rpg ? 06:20 - (mario rpg) (modding/remake de keen)
40% - juste un niveau ? construct 2 ? 08:20 - (badman2/3) - quel je choisir ?
50% - les jeux homebrew (portage/demo/jeu simple-mais-complet) 10:45 - un seul niveau (bilou basic) - l'anniversaire - façon pacman : apple assault
80% - le curseur de difficulté 16:43 - rien que normal - easy-normal-hard dans keen

Somethen, I met a phd student who's interested in understanding why people make video games on their spare time. This is part 2 of 3 of an interview, in French, addressing mostly "are you making for making or making for players" and "how about people that are fine with one-level demos ?".

Wednesday, April 19, 2017

Augmentons la Gravité ?

J'ai eu l'honneur (et un peu la chance, il faut l'avouer) d'avoir un retour de Romain Claude -- dévelopeur principal de Splashers sur mon School Rush. Un feedback assez technique et qui ne sera pas facile à prendre en compte, parce qu'on s'attaque ici au coeur du gameplay.

Mon principal retour pour le moment concerne la prise en main, que je trouve assez raide. De plus, le fait que le jeu soit assez mou rend le tout assez hardcore, même en facile ... Côté contrôles vous devriez avoir un air control progressif (de moins souple à beaucoup plus souple), et ceci marié à une gravité plus forte rendra la prise en main plus réactive et agréable. Par contre pour retrouver la même hauteur de saut il faudra augmenter la valeur de l'impulsion.

I'm honoured and proud that Romain, main designer of the platformer "Splasher" took the time to try and give detailed and technical comment on my own "School Rush". In the upcoming weeks, I'll likely be busy understanding the implications of his proposals and doing attempts to adjust the gameplay of SchoolRush accordingly.

The first suggestion is to increase the gravity to get more a reactive experience -- which echoes a comment from Kirby Kid in a previous iteration. That's not something to be taken lightly, though. Many things in the game depends on the gravity. Changing it by a ration g'/g means that you have to modify the jump impulse v1 so that the maximum height of the jump -- v1²/2g -- remains constant. But even so, the amount of time you stay in the air is reduced due to the increased gravity, meaning that the distance you can clear with a jump is shortened.

Mais changer la gravité, c'est changer beaucoup de chose. En plus d'ajuster la puissance de l'impulsion, je dois aussi ajuster la vitesse de déplacement de Bilou puisque le temps qu'il passe en l'air, lui a été réduit. Sans celà, il faudrait revoir tous les obstacles du jeu.

En fait, une fois tous les paramètres dépendants de la gravité réajustés, on a le même jeu mais avec le temps accéléré. Ce n'est pas déplaisant, mais ça va demander aux joueurs d'être plus alerte, parce que du coup, je vais devoir aussi augmenter la vitesse de l'encre sans ça elle est complètement à la traine. Peut-être devrai-je aussi accélérer les pendats...

By increasing the walking and the jumping speed of Bilou with the appropriate factor, I can keep the levels unchanged and enjoy a more engaging gameplay. I'll have to speed up the rise of the ink: at the moment, the game has turned too easy and I might also have to speed up pendats, so that Bilou don't outrun them too easily, which will shrink the response time allowed to the player (to 86% of the current value for g'/g=4/3) ... but it still leaves 500ms+ to react, so that should work.

http://critical-gaming.squarespace.com/blog/2011/1/5/super-meat-boy-pt1.html
J'essaierai celà dit d'éviter "l'effet Meat Boy" si je le peux, à savoir d'avoir le contrôle en l'air tellement élevé que l'on finit par "glisser" dans l'air et se déplacer plus vite horizontalement que verticalement. Mais en ajustant la vitesse horizontale maximale, il devrait y avoir moyen d'éviter ça.

Directly linked to the change of gravity, Romain suggests progressive air control. The current code controlling Bilou has some momentum while mid-air with an acceleration that is 1/2 of the one you have on the ground.

In his interview about Splasher, Romain says:
Air control is a touchy subject: you need sufficient control so that player can compensate for an imperfect impulse (imperfect timing or speed) while still having an interesting skill floor, but not give too strong air control, else the player will [go wild at uncontrolled speed] at the slightest move of the joystick.
To balance things in Splashers, Romain used delays, so that the air control just after the impulse is not as strong as it is some frames later.
This happens in Super Meat Boy too, with a character that initially struggles to work against its original impulse, but that gets increasing amplitude as you maintain the joystick pushed into one direction. To be honest, Super Meat Boy isn't one of my reference in terms of gameplay. I would even consider it as a counter-example of convincing physics

Dans le "School Rush" actuel, j'ai un système qui encourage le joueur à prendre le temps de courir avant de sauter: une fois en l'air, on peut ralentir et faire demi-tour (Bilou reste tout de même un explorateur de l'espace, ça offre quelques mouvements inaccessibles aux simples humains), mais on ne pourra jamais atteindre à nouveau la vitesse maximale avant d'avoir touché le sol pour courir à nouveau.

Ma première tentative pour m'approcher du "contrôle de plus en plus souple" (que je traduis par "augmentation linéaire de l'accélération horizontale avec le temps passé en l'air") consistait simplement à autoriser une vitesse horizontale plus grande en phase descendante par rapport à la phase ascendante. Mais ça, ça n'a pas été un succès.