:: PlayerAdvance.org ::

:: PlayerAdvance.org :: (http://www.playeradvance.org/forum/index.php)
-   Projets (http://www.playeradvance.org/forum/forumdisplay.php?f=133)
-   -   PatrickBoy: the return (fantasy console 16 bits by Brunni) (http://www.playeradvance.org/forum/showthread.php?t=40607)

Brunni 10/12/2018 11h20

PatrickBoy: the return (fantasy console 16 bits by Brunni)
 
Certains se souviennent peut être de la PatrickBoy RGB: http://playeradvance.org/forum/showthread.php?t=32838

Dernièrement la nostalgie m'étant revenue j'avais envie de faire des petits jeux style 16 bits, mais j'avais envie de pouvoir jouer avec plus de puissance qu'une Mega Drive. La GBA aurait été parfaite j'avais un peu envie de la faire "revivre" (enfin l'esprit) sur une plate-forme moderne. En effet, les outils modernes offrent un modèle de programmation pour la 2D qui a des avantages, mais est complètement différent. Si tu veux faire des effets linescroll, reprogrammer la palette, faire des rotations de couleur, animer des tiles, etc. c'est juste pas aussi simple et marrant.

J'ai donc eu l'idée de faire une console virtuelle mais qui n'aurait que la partie graphique émulée, qu'on programme en Javascript et qui donne un jeu web. L'émulation se ferait sur le GPU pour un max de performances (et le challenge). Les capacités sont assez similaires Ã* une GBA, regardez plutôt :

- 4 BGs, pouvant être scrollés, redimensionnés et rotationnés, masqués (window, sauf qu'un BG n'appartient qu'Ã* une window), supportant une combinaison d'alpha blending et addition entre eux. Possibilité de reprogrammer les 6 paramètres (équivalents Ã* PA, PB, PC, PD, HOFS, VOFS sur GBA) Ã* chaque ligne ou même colonne pour des effets comme Mario Kart, etc.
- 2048 tiles par BG, pouvant chacune utiliser une de 16 palettes.
- J'avais aussi prévu bit de priorité par tile mais je ne le mettrai peut-être pas car c'est super dur Ã* implémenter avec la transparence (d'ailleurs la GBA avait une circuiterie merveilleuse et complexe pour les effets d'alpha blending :wub:).
- 512 sprites (dont 32 pouvant utiliser la transparence), pouvant être étirés et/ou mirrorés individuellement.
- Mode 16 et 256 couleurs par sprite/BG. Total 256 palettes parmi 4096 couleurs (la master palette est en 16 bit RGBA4444).
- Résolution: 320x240 (4:3) ou 400x224 (16:9)

https://www.mirari.fr/Fxsu <= ce truc dégueu tourne avec l'état actuel du moteur

Les graphismes du jeu sont convertis avec un outil ressemblant Ã* GBA Graphics, qui produit une image qui est chargée sur le GPU. On l'utilise comme base pour la VRAM, et elle contient donc tout le jeu (dont tous les graphismes sont accessibles Ã* tout moment). Elle peut faire jusqu'Ã* 4 Mo (extensible Ã* 16 dans le futur), et est accessible en lecture et écriture par le programme.

L'outil de conversion prend un fichier comme ceci (les fichiers source genre mario.png n'auront pas Ã* être inclus avec le jeu, et le .tmx est une map pour Tiled):

Code:

palette Persos {
        sprite mario: 'mario.png'
        sprite luigi: 'mario-luigi-2.png' [rect(80, 20, 96, 36)]
}

palette Level1 {
        map mainbg: 'mainbg.tmx'
}

palette Level1-brighter {}

Ensuite le code du jeu a la forme suivante:

Code:

function *main(vdp) {
        while (true) {
                vdp.drawBG('mainbg');
                vdp.drawObj('mario', 0, 0);
                yield 0;        // Wait VBLANK
        }
}

Le vdp donne des fonctions permettant d'accéder Ã* la mémoire par blocs, et peut directement prendre des noms d'objets définis dans l'outil de conversion.

Code:

function *main(vdp) {
        // Modify palette
        const colors = vdp.readPalette('Level1');
        colors.forEach( (col, index) => {
                colors[index] = color16.multiply(col, 2.0);
        });
        vdp.writePalette('Level1-brighter', colors);

        // Copy tile 2 over tile 1 (simulates arbitrary DMA)
        const tile2 = vdp.readSprite(vdp.tileset('mainbg').tile(2));
        vdp.writeSprite(vdp.tileset('mainbg').tile(1), tile2);

        while (true) {
                // Normal intensity
                vdp.drawBG('mainbg');
                // x2 color intensity
                vdp.drawBG('mainbg', { palette: 'Level1-brighter', scrollX: 2 });
                // Use custom palette and grow our Mario up
                vdp.drawObj('mario', 0, 0, { palette: 'Luigi', width: 32, height: 24 });
                yield 0;
        }
}

Je suis en train d'implémenter pour l'instant, et la plupart des contraintes sont configurables (par exemple la palette peut aussi être définie en 32-bit RGBA, les limites de BG et sprites levées, etc.). L'idée c'est avant tout de s'amuser, découvrir comment qu'on codait Ã* l'époque, et pouvoir obtenir ces effets "arcade" quasi impossibles autrement. L'idée de la petitesse (en terme de mémoire) des jeux imposée par les contraintes est, si intérêt il y a, de les héberger quelque part voire d'avoir une communauté qui se forme autour :) c'est également pensé pour tourner sur toutes les plate-formes mobile/desktop de ces dernières années, donc dans l'absolu on pourrait même en faire une vraie console (si on changeait le javascript par un langage custom & volontairement limité en instructions/seconde) ou un interpréteur tournant sur console.

Alors, qui que ça intéresse ? :)

PypeBros 10/12/2018 21h25

intriguant ...

Brunni 11/12/2018 10h07

Merci =) Enfin un peu plus d'infos ? :D


Fuseau horaire GMT +2. Il est actuellement 22h58.

Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone