Showing posts with label perspective. Show all posts
Showing posts with label perspective. Show all posts

Friday, January 13, 2023

Megaman & Bass, ground man : pixel art and perspective.

I had some "megaman animation" video in my watch list and it appeared to have a sands-and-ruins themed level. So I should have been googling for Megaman 8 Swordman on PSX, but for some reason, I ended up googling for Megaman & Bass (ground man) on SNES instead.

Note how both have visible ground (as opposed to the plain-flat-side view of most megaman games), too. So that will make another reference for perspective study, too.

I'll mostly focus the perspective part on the SNES game, where it is closer to the one I want, with 8 pixels of ground for 16 pixels-high blocks. Note how they introduced two 'slanted edge' for the ground, providing a depth effect (and visual hint for platform edge) that pleases the eye.

They have sandfalls too, which I still have to draw, but they mostly went for noise with cycling palette and dither pattern to fake translucency. That may have worked on good old CRTs, but there's nothing to study here, after all.

Les megaman sur Super NES ont des graphismes plutôt sympa, et je suis toujours à la recherche de pixelart de référence pour le sable de ma propre pyramide, donc creusons. D'autant que ce 'Megaman & Bass' sorti en fin de vie de la console a tous les éléments qui m'intéressent: chute de sable, sable au sol, un peu ou beaucoup, avec une perspective compatible avec ce que j'ai en tête ...

They do have sands-on-the-ground too, another element for which I need pixel references, and some more sands-pit-in-depth-of-the-ruins, as well.

The snake-dragon depicted on the walls and the geometrical patterns do not feel Egyptian at all, but there's nothing forcing those ruins to be Egyptian, after all. In the case of Megaman 8, they were even quite obviously South-American rather than North-African.

On est plus ou moins forcé d'essayer de faire un parallèle entre le stage de Ground Man dans MM&B et celui de Sword Man dans MM8 sur PSX. MM8 avait clairement joué la carte du temple Maya, MM&B est un peu plus pyramidesque, mais il reste quelques détails qui nous rappellent sa filliation. Comme ces espèces de dragons. (qui ornent la salle remplie de sable ;)

Bon, malheureusement, les chutes de sables sont surtout un pattern "bruité" animé par rotation de palette qui joue sur le flou-crt pour adoucir les angles... pas grand-chose à étudier pour Bilou de ce côté là, à part les pixels qui se rajoutent près de la tête de Megaman quand il est dans le sable.

Oh, and they have a nice 'particles shower' effect when character stands in a sands fall (likely they'd have something similar for waterfall). I remember I have commented on some cosmic boll video where such shower particles is a hint that you're experiencing some sort of "extra gravity" for being pushed by the falling fluids that I might want some similar mechanics in Bilou.

Tout comme la perspective a rajouté 1 tile de sol par-derrière la position de MegaMan (semi-transparent sur les bords de certaines plateformes), on a droit à un tile de sommet-de-sable par-dessus le "bloc-sol" sable ... derrière lequel Megaman s'enfonce avec un peu de glitches sur les bords... Dommage pour l'alignement des 'dunes' et leur aspect exclusivement triangulaire dans le "bloc-sable"

the ground-sand has some unexpected look, especially in the way further piles of sands stand out more than closer one. They are given one tile of part-translucent / background over the walked-on pattern.

They tried to make it behave as a sort of quick-sands by letting the character slowly dip into the sands, but the effect comes short as soon as you approach a wall, imho.


And I finally found some of those iconic carved blocks in Megaman & Bass, although they appear to be only around the level's Master Robot room ...

Bon, idéalement, j'aurais dû vous sortir les code couleurs utilisés, analyser les hauteurs de pixels et compagnie... mais au final, je ne suis pas fan de ce look, que je trouve un peu pâlichons et pas toujours convaincant. Comme en plus trouver des images propres avec les vraies couleurs et la vraie taille s'avère pénible pour ce niveau particulier et que j'ai trouvé bien mieux à analyser entre-temps ... on va en rester là ;-)

Monday, January 09, 2023

Kirby Superstar Perspective

 Autant j'avais été scotché par l'esthétique de Kirby's Dreamland (pourtant en 4 tons de gris), autant j'avais accepté celle de Kirby sur NES (découvert sur émulateur 4-5 ans plus tard), autant je dois admettre que Kirby Superstar sur SuperNES ne m'avait jamais convaincu, avec son mélange improbable de rendu 3D, de pixel art et de graphisme aux pastels.

Mais ils lui ont donné (ici aussi) une perspective légèrement relevée. 1 tiles de 'sol' pour 3 tiles de face. C'est le double de ce que j'envisage (ou pas loin), à supposer que les blocs soient cubiques.

Oh, et ne vous fiez pas trop aux '16' et '50' notés ici, hein: ce sont juste des mesures de pixels sur une image zoomée et lissée trouvée sur le net ...

Friday, January 01, 2021

Bilan sur DreamLand : première année

2020 s'ouvrait sur un constat: il y a quelque chose de bien vu dans la formule de Kirby's Dreamland, un équilibre entre sophistication et simplicité, qui pourrait être un bon intermédiaire entre les petits jeux comme SchoolRush et la grande aventure.

Avoir un objectif m'a motivé à me sortir des tests unitaires à répétition qui auront pourtant continué quasiment jusqu'en juin. La deuxième moitié de l'année aura permis de remettre à jour mes outils (et LEDS en particulier) pour utiliser les nouvelles fonctionnalités du moteur de jeu en terme de propriétés du terrain

Flashback to early MMXX: there’s some successful alchemy in Kirby’s Dreamland, a balance between feature-rich yet kept-simple gameplay, and it could be the intermediate step l need between small games I’ve made so far and the Grand Adventure we once ambitioned.

Having such a goal clearly boosted my motivation and helped me to pull me out of this unit test swamps where I was. Starting with June, tools got upgraded – esp. the level editor- to enable the ‘new map’ in the engine

Entretemps, J.L.N a parfaitement adhéré au projet. Ça ne le fait pas plus prendre les crayons mais il m'innonde littéralement les oreilles de ce que les boss pourraient faire et comme LEDS est réparé, il peut même commencer à dessiner des niveaux selon ses préférences. Ce n'est pas aussi directement exploitable que le niveau gribouillé de Rémi, mais ça lui fait passer le temps.

Il faut dire que s'il y a bien un truc sur lequel je coince, c'est le fait de dessiner des bouts de pyramide ou des bouts de parcours dans la montagne pour compléter la 2eme moitié des 4 mondes prévus pour DreamLand. Le confinement ne m'a pas autant aidé que je n'aurais voulu, de ce côté-là.

Meanwhile, J.L.N. joined the project. Not that he would pick up any pencil, but I’m litterally flooded with proposals about what bosses could do. And since LEDS is repaired, he can even draw some levels when he feels so. It might not be as ready-to-use as Remi’s level was, but at least, it keeps him busy and focussed.

Par contre, je prends ici-même une résolution: je prends le risque d'avoir un mélange entre perspective 5:6 et vue frontale dans le jeu (idéalement pas au sein du même niveau quand-même), et d'en subir les conséquences plutôt que de continuer à me griller les neurones à savoir quelle serait la meilleure approche. L'expérience nous dictera comment faire pour la suite. Sans ça, je vais de nouveau faire un 'analysis paralysis' là-dessus. Les graphismes déjà dessinés resteront dessinés tels quels et ceux qui devront venir compléter un niveau s'adapteront au style du niveau en question.

You deserve honesty, here: I struggle with level design for the pyramid world. And the mountains level isn’t any easier. Even being confined did not help in that regard. Yet I still want to have these zones featured in Dreamland. 

So let me at least take a new year decision: I accept the risk of mixing 5:6 perspective in some level and frontal view in other levels of the same game. There might be some consequences but I prefer facing them rather than boiling my brain to find a hypothetical perfect solution. The game will test that, and will teach us what to do in a future game. The alternative is more months of analysis Paralysis. But whatever has been drawn already will stay as they are.

Tuesday, November 17, 2020

Pixel study: Nerkin's pyramid

For once, I truly did some pixel study of that art piece I retweeted. It was an interior-and-exterior pyramid scene which I thought would let me improve my desert.spr much more than a random NSMBU screenshot of Honey Dunes...

Pour une fois, je me suis fait un vrai "pixel study", pas juste un p'tit retweet avec l'ambition noble (mais un peu hypocryte) de revenir dessus plus tard. C'est que je voudrais enrichir l'environnement de la pyramide, voyez-vous, et que les "Dunes de Miel" de NSMBU m'ont un peu laissé sur ma fin. Mais la scène de de Nerkin (ci-contre) a aussi bien une toile de fond qui évoque la grande structure (un truc que j'avais bien aimé dans Shantae et Eagle Island), un mur proche sombre et intéressant, et des pierres "de structures" aux contrastes bien pensés.

I also re-crafted a scene close to the one I already have with my own pyramid tileset so I could do a comparison. much more color depth on the background layer for Nerkin. He also let bricks protrude more, and favoured 'damaged areas' vs. my own "specks and scratches" that make the background unnecessarily noisy.

Interresting, too is the sand dropped here and there in the background. And he works with 2 or 3 pixels per "line" while I've been working with .7 or .5 pixels, leading to 'dotted' patterns whenever I want something to be irregular.

Il faudra que je m'essaye à ces briques de fond que le temps à progressivement décalé, soit vers le côté soit vers le bas, ce qui donne quelque-chose de plus convaincant que mon décor tout-en-carton. Et pour ça il faudra que je m'autorise 2 à 3 pixels par "ligne" (contre le demi-pixel utilisé ici qui a tendance à rajouter du bruit avec ses pointilliés.

If we look at the values alone (i.e. convert to plain greyscale), there's more depth in Nenkin's artwork. using about 30% of the range for the background and 45% for the 'I'm the ground' brick (centered around half-bright grey, btw). 'ignore-me' bricks use only 20% of the range (the second 20%, in fact) 

Seeing the two side-by-side makes me wonder: should I really push a 'slightly elevated perspective' in my next game ? There seems to be plenty of room for improvement even by keeping perpendicular-to-level-map camera ...

Je dois reconnaître qu'à les mettre côte à côte, j'en viens à me demander si le passage à une perspective 5:6 plutôt que "de face" est vraiment si intéressant que ça. Nerkin n'en a pas eu besoin, en tout cas.

Bon, par contre, avant de pouvoir creuser plus loin, il va falloir que je me refasse un jeu de dsgametools récents, parce que le "guru meditation error" quand je demande à SEDS de me lister les tiles qui ont une couleur donnée après avoir réencodé les palettes de Nerkin ... ça me gonfle un peu.

Wednesday, October 07, 2020

Other perspectives

I should possibly call them 'projections', because a perspective is something where distances shorten coherently when things are further away, and typically will never have parallel segments to depict things that are parallel in the 3D world. 

And I don't have to make the height of the front face shorter than the width of the same cube. If I do, it will be a stylistic choice of mine. 

cyangmou: Really depends on the type of projection you use. You can use foreshortening, but you don't have to, as long as it is consistent between the objects you are using. I mean it's more about the consistency of the general ruleset which is applied. e.g.:
I'll have to keep that in mind before setting the pixel sizes into stone tiles.

 (There's more about isometric pixel art tutorials in Cyangmou's "Pixel Art Knowledge" collection, of course) 

edit: more of Cyangmou's projection tutorials on ko-fi.


Thursday, July 16, 2020

Magical Quest en perspective

Magical Quest Starring Mickey Mouse passait à l'Ultime Décathlon pendant que je scribouillait des Rayman en perspective et j'ai été surpris de constater que je n'avais pas encore commencer à regarder comment la perspective avait été gérée dans ce jeu-là.

Autant vous prévenir toute de suite, si Capcom a été nettement plus propre que les réalisateurs de Ravin' Rabbids sur GBA, il y a tout de même quelques incohérences ici et là.

Prenez les portes de début/fin de niveau. Oui, celles en forme de Pat Hibulaire. Les deux pattes sont alignées sur le même pixel horizontal alors que tout semble indiquer qu'elles prennent une certaine "profondeur". Et le niveau-assenceur est complètement en vue 'à plat' mais continue à utiliser des blocs-mickey avec leur légère perspective. Enfin, ça ne jure quand-même pas trop et contrairement à Ravin' Rabbids, ce n'est pas ça qui va casser l'illusion.

Okay, I know pyramid and woods would look better if I opt for a slight perspective effect, and that it would be super-tricky to use anything but flat view in the School Zone. Is that an issue ? Would the player lose the connection with the fiction world if such a thing occur. I suddenly had an answer while watching the Ultimate Decathlon: it happens in Magical Quest and I never noticed.

Sure, there are other perspective oddities in the game, like the huge entrance/exit doors. And even the 'magical blocks' (those with mickey ears on them) are somehow disorienting and which (imho) hurts the immersion more than the 'elevator' level at the entrance of the fire grotto.

Bon. Passons aux choses sérieuses. On a deux objets pour déduire le rapport de perspective: les blocs mickey (en les supposant cubiques) et les plate-formes circulaires (en les supposant vraiment circulaires :-P)
2 pixels pour le "dessus", un pixel de highlight (plus ou moins partagé entre les deux faces) pour un bloc qui aurait fait mettons 15 pixels de haut 'à plat'. On est du côté de 1:5, beaucoup plus proche de ce que j'ai en tête pour Bilou. Très bien.

Le sommet de la plate-forme a lui un rapport de 31 pixels de large pour 5 de "profondeur". ça s'affine donc à du 1:6.
 
The first thing to do is to identify the 'perspective' used by the game, and the magical blocks are perfect for that. They're made of 2 "top face" pixels, 1 edge pixel and 13. That is around 1:5 ratio between the top face and the full block height, very close to what I'd like to introduce in Bilou's adventures. Another interesting object to consider is the floating face platform, assuming that its top is cylindrical. Its top face is 5 pixels deep while it is 31 pixels wide, which brings us around 1:6 ratio.

On note sur le screenshot que les graphistes ont joué sur deux largeur de sol. Soit il fait 4 pixels (la corniche en haut), soit il fait un "généreux" 8 pixels.

Le sol qui donne sur le décor de fond termine par un dégradé de 4 pixels. on aura donc un sol d'un total de 12 pixels si le sol 'large' donne sur le fond plutôt que sur un mur-à-corniche en arrière plan. C'est grand assez pour mettre 4 blocs côte-à-côte en travers du chemin. La corniche, elle, est à peine plus large qu'un bloc.

The second question I had in mind regarding non-flat perspective in 2D games was 'where should the walking line be'. It isn't really a surprise for a tiled game, in Magical Quest, this is at the tile boundary.  The 8-pixels-deep cornice on the top screenshot mixes a 4-pixels 'far' area and a 4-pixels'close' area. Additional platforms (solid ground rather than jump-through, this time) exist, that add an extra 8-pixels of depth, but in that case, Mickey stays completely at the edge between the 'close' ground tile and that extra tile. The art for the 'top-of-wall' is drawn in such a way that player doesn't get the feeling that Mickey completely sticks to the edge of the platform.
 
Je dis "8 pixels de profondeur" pour le sol principal, c'est entre la base du "mur" et la ligne sur laquelle les pieds de Mickey marchent. on a une zone au moins aussi large de "dégoulinures" dans la partie "mur" qui évite de donner l'impression que Mickey marche systématiquement au bord du mur alors qu'il a 4 fois sa largeur pour se positionner.

On a par contre utilisé la 'tricherie' habituelle en bord de bloc de toujours présenter un angle fixe et surprenement proche de 45°. ça ne saute pas autant aux yeux que dans Donkey Kong, et ça a l'avantage de ne pas changer la portée apparente du saut au fur et à mesure qu'on s'approche des obstacles. Merci, le gameplay.

Ravin' Rabbids en Perspective.

Bon, j'aimerais bien dire que je suis fan inconditionnel de Rayman, parce que c'est chouette, d'être fan inconditionnel. Mais quand j'ai vu "Ravin' Rabbids" sur GBA, j'ai bien du admettre que non. Je suis juste "fan de la première heure" de Rayman.


Je vais essayer de ne pas m'étendre sur ce qui fait que je n'ai même pas essayer de finir le 2eme monde de ce jeu, et si j'en ressors quelques screenshots aujourd'hui, c'est essentiellement pour étudier les choix de perspective dans ce jeu. Pour faire court, que ce soit le look du perso, la présence des lapins crétins ou la charte graphique des différents niveaux, j'ai l'impression qu'on a délégué la réalisation à une bande de sous-contractant sans vraiment chercher l'harmonie avec les jeux précédents ... et en particulier pas avec l'épisode 2D sur PSX/PC qui m'est si cher.

Si je prends un objet comme le livre sur lequel rayman court, il fait grosso-modo 2 blocs de haut. 50% de cette hauteur correspond à la tranche du livre et 50% servira pour la couverture sur laquelle Rayman marche. Un angle de vue très aplatit, mais qui se n'a pas l'air de coller avec l'angle proche de 45° que fait le "haut" du livre avec sa tranche.

Ignorons un instant la taille ridicule des crayons-pilliers par rapport aux livres, le rapport entre la largeur et la profondeur de leur sommet est de 2:1. Sous cette perspective-là, normalement, un cube aurait une face 'supérieure' aussi grande que sa face 'avant'. On est en pleine contradiction.

Pour les prochains niveaux de Bilou, je m'étais plutôt fixé un rapport de 6:1. Le rapport 50/50 pour la surface 'top' et la surface 'front' est confortable pour le sol de base. Le cahier dans lequel j'ai gribouillé ces notes fait 15mm d'épaisseur. Si je les ramenais à 16 pixels, une couverture de 16 pixels correspondrait à un cahier de 9cm de large. Il est plutôt aux alentours de 15cm, ce qui irait chercher dans les 26 pixels.

Essayons de 'perspectiver' la School Zone de Bilou. (bon, désolé, je repars d'une vieille capture .gif qui me donne des couleurs un peu pourries). J'ai gardé un ratio 50:50 pour le "banc" sur lequel se trouvent Bilou et l'encrier ... ce qui veut dire qu'il a en réalité une forme plus proche d'une grosse latte en bois (je prends 5mm d'épaisseur et 3cm de largeur pour nos lattes traditionnelles d'écoliers) ou de la rainure du tableau que la taille d'une planche d'étagère. Mais soit.

Les mini-livres qui servent ici de plate-forme perchées sont presque cubiques, mais on voit à peine leur couverture. Bref, c'est pas un exemple génial, mais çadonne l'idée générale.

Monday, August 12, 2019

Les couleurs du désert


Un peu des couleurs que j'ai jusqu'ici, un peu de couleurs venant de Ilkke ou de Commander Keen ... quelques mélanges ... et je commence à avoir des combinaisons qui me semble intéressantes (sur la droite). Qu'est-ce que vous en dites ?

In the center, the mock-up I had previously for Bilou's desert zone. On the left, I tried using Lost Vikings, Commander Keen or one of my reference from Ilkke. On the right (and esp. in the corners), mixing of reference-based colors and current colors that imho provide interesting shades and hues. What do you think ? (I put the focus on ground tiles and background, btw. 'green' block and power-up were either untouched or got crushed in the blending process).

[x] comparer avec les couleurs d'Aladdin SNES/Genesis -- bof. Par contre le palais de Jafar a des éléments de décor intéressants.
[ ] comparer avec les couleurs de Sandopolis (Sonic) -- en fait non. Elles sont trop criardes à mon goût.
[x] essayer la palette de verts du chateau d'Hyrule qui avait inspiré les téléporteurs de Bilou's Quest ... sauf qu'ils n'étaient pas verts. (voir ci-dessous)

PS: je me suis concentré sur les couleurs des briques. J'aimerais que le bloc vert reste dans les tons verts, mais genre "masque de jade", que je n'ai pas encore réussi à reproduire. J'ai pris le temps de re-copier-coller Bilou avec les bonnes couleurs (presque?) sur chaque écran mais j'avoue que le bonus n'a pas eu droit à autant de considération

Je fais une deuxième passe. Les verts de Bilou's quest (top-right) retravaillées (bottom-right) me plaisent bien. J'ai essayé d'importer les couleurs d'Agrabah (mid-left et bottom-center) par contre, mais ça ne donne pas aussi bien.

edit: J.L.N a bien voulu laisser la NDS à son papa une demie-heure avant de rejouer un peu au niveau-où-l'encre-descend de School Rush. J'ai pu me faire une petite map, et j'ai aussi un second jet plus convaincant des "boules de poussières" inspirées des techniques de pixel-art de Fury of the Furries ...

ça serait probablement aussi une bonne occasion pour tenir compte des recherches de ThePtoing sur les graphismes de Metal Slug: utiliser des palettes de 15 couleurs + alpha dans lesquelles ont retrouve deux raster de 7 couleurs qui ne se super-posent pas tout à fait, ce qui permet par la suite de "teinter" plus subtilement les tiles.

Saturday, April 06, 2019

Shantae en perspective...


Je me refaisais un longplay de shantae pour voir un peu quel genre de level design a été utilisé dans les phases "face-à-face avec les monstres". Et comme je viens de travailler sur la perspective de Bilou dans sa pyramide les blocs m'ont sauté aux yeux.

Dans certaines zones, on a bel et bien une perspective 3/4 sur certains blocs (comprenez, la face avant du bloc est trois fois plus grande que la portion d'écran réservé à sa face supérieure -- j'ai noté ça 3:1 sur l'image). Dans d'autres salles (la plupart du donjon, en fait), on est avec un à-plat parfait. Enfin, le monde extérieur, lui, est plutôt en perspective 2/3 (un cube aurait une face supérieure qui occupe moitié moins de pixels à l'écran que sa face avant), ce qui se traduit par un rapport 2:1 pour la face supérieure assez flagrant pour les objets cylindriques ... et qu'on retrouve notamment dans les grandes fleurs de certaines salles du donjon de la forêt.

Je note aussi que ça m'avais complètement échappé quand j'ai étudié les graphismes du jeu, donc il est probable que ça n'ait choqué qu'une infime proportion d'architectes pendant leur partie.

Tuesday, April 02, 2019

Tout-en-Karton ?

Après un troisième round, il était temps que j'exporte les petits pixels actuels de la pyramide avec Bilou dedans ... Il faudra aussi que je prépare un niveau de test, histoire de vérifier que Bilou bouge bien dans ce décor-là.

I'm far from being done, but I've got now invested some more time pushing pixels for the pyramid zone, the next environment planned for Bilou's games. So it was time to pull the SD card out of my linker and make a backup of all this. Enjoy.

edit: I've spent significant time trying to figure out how this new perspective will affect layers use. I note that in early level of The Lost Vikings, the background wall is locked with the foreground tiles, but that in subsequent level, there is a slight parallax effect between the two. A feature I was planning to do myself, and that appears to work pretty fine.

edit: je n'étais pas convaincu par ma colonne ... mais je note que je pourrais aller jeter un oeil à un ancien post qui avait un graphisme tout à fait sympa pour une taille proche de ce que j'utiliserais.

Friday, April 07, 2017

Un peu de perspective ?

J'avais trouvé hob (runic games) totalement épatant, mais en faisant des essais pour le ramener à une vue 2D totalement à plat (façon Mario World ou SMB* sur NES), il faut bien reconnaître qu'on perd beaucoup de l'effet étrange, même en essayant de jouer sur des effets de lumière pour reproduire la perspective.

A peu près au même moment, je tombe pour la première fois sur la réinterprétation de Zelda II par Itchabop ... Je suis convaincu. ça donne plus de profondeur aux scènes, une ambiance plus close et à mon avis tout à fait utile pour la zone du chateau ou de la pyramide (et sans doute très bien aussi pour le temple perdu si jamais j'arrive jusque là).

(C) Ichtabop aka pxlitch2017
Hob's environment design works great because of hob's perspective. Itchabop's mockup of Zelda II conveys impressive atmosphere partly because of its perspective that put next to each others things that you can walk on and parts that are out or reach and mysterious.

Can I improve my skills and tools to get something similar in the desert and castle zone of Bilou ?


Du coup, je sors mon bloc à gribouille et je cherche un peu ...

Quelle perspective ?

Il faut qu'on reste dans quelque-chose de propice à du jeu de plate-forme. Je connais le système 1/3 pour une face 2/3 pour l'autre face, régulièrement utilisé pour un jeu façon Zelda "2D", mais même en inversant les proportions habituelle et en mettant 1/3 pour le sol et 2/3 pour les murs, c'est encore trop (cf. le tuyau de mario en bas à gauche de l'image). J'opte donc pour 1/6eme de dessus contre 5/6eme de face en espérant ne pas déchirer le continuum espace-plan.

I think I need something more subtle that the typical RPG perspective, where a cube's top would take 2/3 of the tile's height and the cube's front would be 1/3. Testing with Super Mario pipe makes me think that I should have at most 1/6th for the top and 5/6th for the front part to have a platformer-friendly perspective.

With those values, a 16-wide cube would show 2.66 pixels of "top" area -- okay, let's say 2 pixels of "top" color plus one pixels of shared "highlight" area.


Avec ces valeurs-là, un cube de 16 pixels aura approximativement 2.66 pixels de "surface horizontale" affichée. Allez, disons deux pixels pour le plat et un pixel de highlight partagé, puis 13 pixels "de face".

Et la School Zone ?

Oui, parce que pour avoir des images intéressante dans School Rush (et dans la school zone en général), j'ai déjà cherché à éviter les objets placés complètement face caméra, notamment avec les livres qui sont décalés. Plus question avec une élévation de 15° de choisir arbitrairement la taille de la tranche et la taille de la reliure. Il faudra que ça corresponde à un angle de rotation et une dimension de page qui soit cohérente. Ensuite, il faudra beaucoup plus de graphismes parce que si j'ai bien calculé, une section de 48 pixels de large correspondra à un décalage de 5 pixels et autant de variante d'un tile (mettons la transition bas/côté du livre) qu'on ne souhaite de dimension de livre (16 pixels plus large, il sera 2 pixels plus bas, etc.)

That's all nice for cubes and affordable for pencils, but big books will be more complex to handle. Their ratio will need to be studied more in-depth. The slopes to have will depend on the angle they're doing with the X axis, and they will lead to *much* more tiles just to cope with the vertical offset introduced. That's completely unpractical for the current engine. Another approach of how level map is turned into contents for the video RAM is mandatory to get the effect propagated back into the School Zone, and that won't happen any time soon.

Une horreur pour le game engine actuel

Pas question, donc, de pousser ça dans School Rush. Par contre, avec un game engine qui utiliserait la mémoire vidéo comme un "cache" pour un tileset plus grand, et avec un level editor capable de créer au besoin des versions "déphasées" horizontalement ou verticalement de n'importe quel tile, ça deviendrait envisageable.

Monday, December 22, 2014

Keen's Inception

Coincé entre deux générations de "game engine" de la série commander keen, on trouve un jeu étrange, faisant presque figure de "lost levels": Keen Dreams. Une grande part du design global de l'excellente série "Goodbye Galaxy" est présent: décor en perspective cavalière, personnage de 40 pixels de haut, environnements variés et son SoundBlaster. En revanche, keen se promène en pijama et en pantoufle et ne dispose ni de son neurolaser, ni de son célèbre pogo. A la place, Keen peut lancer en cloche des mines transformant les ennemis en fleurs à leur contact. Le gameplay demande donc beaucoup plus de précision que dans les autres épisodes, d'autant plus que les ennemis ne resteront pas transformés éternellement. Ça n'est pas sans rappeler le lancer de taille-crayon dans Bilou, je l'avoue, mais si je vous en parle, c'est surtout à cause de ses sources, ajoutées sur github début septembre, et que je suis occupé à analyser. Les sources sont essentiellement en C avec quelques blocs d'assembleur en ligne, chose plutôt rare pour l'époque.

Bien sûr, j'aurais préféré que Javier et Chuck nous proposent le code de Goodbye Galaxy, notamment à cause de l'absence de pogo dans cet opus, mais c'est le premier Keen à proposer des pentes, ce qui n'est déjà pas si mal.

Keen Dreams' source code has been released last September. I wish it was the code for one of the Goodbye Galaxy episodes, of course, as it is one of the games I played the most, and the one with the richest features set -- pogo, gun, moving platforms and shooting ennemies -- which isn't crippled with clipping bugs. Anyway, Keen Dreams has slopes and shooting/pushing ennemies. The map design with its "info layer" suggests that most of the engine has been kept between Keen Dreams and Goodbye Galaxy. The character's moves (jump, run and pole-climbing) are direct translation of GG spritesheet. The pogo is missing, and I will have to define how the lone "canteloupe cart" can be ridden. 

Rather than stunning gun, Keen throws "flower power" seeds that are affected by gravity somehow like my dumbladors. Gameplay-wise, I cursed that decision quite often. Aiming for those fast-moving, aggressive vegetables with something that follows an arced curve, bounce on the ground and only stuns for a limited amount of time made imho this episode almost the hardest of the series. So far, I haven't found arced curve of bladors that hard to use, but on the other hand, monsters in Bilou's Schoolzone don't kill you instantly on contact.

N² with high N could turn Nightmare.
En plus de leur calques "graphiques", les niveaux possède une couche "info" qui indique quels monstres créer au chargement du niveau (scaninfoplane et HandleInfo). Les monstres de l'ensemble du niveau sont conservés dans une liste liée, mais seuls sont "actifs" ceux qui sont assez proche dans l'écran. Leurs collisions sont gérées par un parcours imbriqué de la liste (N²) -- rien d'équivalent à mon système de "castes", donc --  mais vu le nombre réduit de monstres par écran dans le level design, celà ne pose pas de réelle difficulté, sauf peut-être dans le niveau des vignes.

Compared to my own engine, code for managing collisions looks quite simple. There is no Hero/Ennemy casts, nor collision masks. The engine checks every pair of "objects" for intersection of axis-aligned bounding-boxes. That could easily turn into programmatic nightmare in a game with heavy number of monsters like Apple Assault (up to 10,000 checks per frame), but here, the test is skipped as soon as one of the monsters is off-screen (active is false), and there quite little places where the screen shows more than a handful of ennemies at once. 

Funny enough, although everything may have its own contact() function and both are invoked when two objects come in contact, there is no passive/active role... yet, monsters typically don't use their contact() function at all, and whether Keen should die or be granted more points is all encoded in Keen's own contact() function, and contact() function for the flower-power seeds has knowledge of which monster can be stunned and which object shouldn't be affected.

Casts make it linear and scalable
On a une fonction "contact()" pour chaque monstre qui régit les changements en cas de collision. Pas non plus de notion de "actif/passif" mais une organisation où "PowerContact" (pour l'arme de Keen) transforme tous les objets en fleurs et KeenContact() mêne à la mort de Keen presque systématiquement. Ces fonctions contact ont la possibilité de faire n'importe quels tests (on est dans du code C), y compris aller tester l'étape d'animation de l'objet avec lequel on est entré en contact ... ce qui permet de concentrer toute la logique de collision dans quelques objets. Pour les monstres, il n'y aura en fait aucun code pour les contacts.

Ça vaut aussi la peine de regarder de plus près le système des "ticks" qui règle le comportement des personnages. Ce type de code est le plus souvent absent sur console. La vitesse du CPU est connue et la mise à jour de l'image à l'écran assez rapide vu la structure choisie pour le processeur graphique. Mais on est ici sur (vieux) PC, avec une vitesse quelque part entre 6 et 40MHz pour le processeur principal et un système de rafraîchissement de l'écran passablement complexe. Le jeu ne tournera certainement pas à 60 images par secondes, ni même à 30 ou à 12. On aura plus que probablement un temps de rendu (entre l'instant où la logique du jeu a fini sa mise à jour et le moment où la nouvelle image est effectivement visible à l'écran) variable.

The game logic is built around the notion of time ticks, which are a virtual equivalent to video frames on a game console like the Nintendo DS. However, unlike a console, the PC (ranging from 6 to 40MHz by that time) cannot guarantee we'll have a new frame rendered every 1/60th of second -- maybe not even every 1/12th of second. It's much more likely that the framerate will be irregular, depending on bus availability for memory transfers and complexity of the current scene. ID software developers thus measure how much time elapsed since the last rendered image and deduce how much game logic _ticks_ corresponds to this time. The StateMachine() function then compensates by stepping the characters by (xspeed,yspeed) the appropriate number of time, invoking the think() function when needed. Rather than experiencing slow downs, we'd experience a drop in the frame rate, but no kid on earth would complain about that from a shareware

The code logic deciding whether think() should be called or not is quite complex, allowing some part of monster behaviour code to indicate "do not think for N ticks, and slide me at constant speed" or "only invoke think() when time is ready for the next animation frame", etc. The benefit is that most of the code that accommodates for "process N ticks at once" is in that generic logic, and the monster-specific code remains as simple as updating speeds, not moving coordinates. Another function will then react() to the new position of the character on the level (does it still has ground under its feet ?)

L'idée (toujours présente dans les Quake modernes, pour ce que j'en sais) consiste à mesurer le temps qui s'est écoulé depuis la dernière demande d'affichage et à exécuter k "pas" (les ticks) de la logique de jeu, où k * durée_d'un_pas = temps_écoulé. Ainsi, la fluidité varie mais le timing du jeu reste constant et on ne perçoit pas de réel "ralentissement". Ce qui témoigne de la qualité du design, c'est le fait que le code du comportement des personnages peut être écrit sans devoir se soucier de ce mécanisme: les fonctions DoActor et StateMachine prennent intégralement ce comportement en compte et sont capables de gérer une transition d'état au milieu du laps de temps à simuler sans pour autant faire N appels aux fonctions think() des personnages. Autre élément qui se retrouve aussi dans les FPS d'ID software: la fonction "think" n'est pas forcément appelée à chaque moment. Selon les besoin, elle peut être invoquée sur les étapes d'animations, à intervalle régulier ou aléatoire.

Dernier traît intéressant dans les grandes lignes de l'organisation du code: la fonction think() d'un personnage ne se préoccupe généralement pas des collisions avec les murs. Elle se contente de lire l'état du jeu et de décider de la direction/vitesse/animation à suivre. Une deuxième fonction, react(), associée elle aussi aux états du personnage, sera appelée après que le déplacement ait eu lieu et s'occupe d'aligner un personnage qui aurait rencontré un mur. J'y reviendrai dans le volet prochain.

Wednesday, June 18, 2014

Flat = Fun, Depth = Drama

Maybe you remember this mockup scene that showed up when I started working on the school zone. I couldn't get it working. People kept saying that they felt "attracted" to the Z dimension while the game is supposed to play along X and Y. Another interesting thought that made me dismiss it came from Facet's readings: Flat = Fun, Deep=Drama. A scene with exarcerbated perspective conveys a feeling of dramatic importance to what's happening, while something flat fits comics better.
Still not convinced ? Rayman to the Rescue!

fun level : flat background boss drama : exagerated perspective

Quelqu'un se souvient de ce montage réalisé pour la school zone présentant une sorte de de "cathédrale de livre" à l'arrière plan ? Elle n'a pas eu beaucoup de chances de survie. En fait, avec sa perspective plongeante, non seulement elle se met à contrepied du mouvement des personnages, mais elle est aussi en décalage avec l'ambiance. Le côté "comique" est mieux rendu par une scène "à plat" alors qu'une perspective forte transmet une tension, un côté dramatique... Ne vous étonnez donc pas si je la garde dans les cartons jusqu'à ce que les boss soient prêts.

Don't be surprised if the "Knowledge Kathedral" look is resurrected for SquareRoot's encounter.

Btw, how about some old-fashioned items in the Deep Ink Pit ?