La Place des Développeurs MSXgl MSX Game Library
aoineko
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Tiens, ça me fait penser que ça fait un bout de temps que je souhaite ajouter un module pour gérer les animations.En fait j'ai fait un truc assez avancé pour Final Smash, il faudrait juste que je le sorte du projet pour le mettre dans la librairie.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
MSXgl support maintenant le MSX-AUDIO (comme la cartouche Music-Module de Philips).
J'ai mis à jour mon player VGM et le sample s_vgm .
La ROM est dispo là : https://github.com/aoineko-fr/MSXgl/raw/main/projects/samples/emul/rom/s_vgm.rom
Je vous mets pas de lien WebMSX cette fois vu que l'émulateur ne semble pas supporter le MSX-AUDIO.
Pour tester la ROM sur OpenMSX, il faut ajouter les extensions scc , fmpac et audio .
Vous pouvez soit :
- lancer OpenMSX en ligne de commande avec les paramètres " -ext slotexpander -ext scc -ext fmpac -ext audio ",
- ouvrir la console de OpenMSX avec F10 et entrer la commande " ext slotexpander; ext scc; ext fmpac; ext audio " puis Reset la machine.
J'ai mis à jour mon player VGM et le sample s_vgm .
La ROM est dispo là : https://github.com/aoineko-fr/MSXgl/raw/main/projects/samples/emul/rom/s_vgm.rom
Je vous mets pas de lien WebMSX cette fois vu que l'émulateur ne semble pas supporter le MSX-AUDIO.
Pour tester la ROM sur OpenMSX, il faut ajouter les extensions scc , fmpac et audio .
Vous pouvez soit :
- lancer OpenMSX en ligne de commande avec les paramètres " -ext slotexpander -ext scc -ext fmpac -ext audio ",
- ouvrir la console de OpenMSX avec F10 et entrer la commande " ext slotexpander; ext scc; ext fmpac; ext audio " puis Reset la machine.
On est toujours ignorant avant de savoir.
Bravo Gfx, tu entres dans le monde de la msxdev
aoineko
Membre non connecté
Conseiller Municipal
J'ai push une nouvelle version de MSXgl sur GitHub avec un gestionnaire de sprite.
Le module s'appel game_pawn et je l'ai ajouté au programme d'exemple ( s_game ) pour montrer comment l'utiliser.
En gros, tu dois d'abord définir :
- Les layers de sprite qui composent ton personnage (voir : Game_Sprite )
- Les différentes animations (voir : Game_Frame )
- Les différentes actions (en gros, une action est une animation avec quelques infos en plus comme savoir si elle boucle et si elle peut être interrompue ; voir : Game_Action )
- Un personnage (qui contient sa position, la liste des actions et des sprites ; voir : Game_Pawn )
Ensuite, tu as juste à faire GamePawn_SetAction() pour déclencher une action (et l'anim qui va avec).
Dans ta boucle principale tu dois aussi exécuter à chaque frame :
- La mise à jour de l'anim courante (via GamePawn_Update() )
- La mise à jour de l'affichage des sprites (via GamePawn_Draw() )
Le tout nécessitera une passe d'optimisation, mais c'est fonctionnel et utilisable.
Dans le programme d'exemple ( s_game ), je définie un personnage avec 3 layers de sprites, ainsi que les animations pour 4 actions : idle, move, jump et fall.
En fonction des inputs du joueur (et de la physique), je mets à jour la position du personnage ainsi que l'action dans laquelle il se trouve et les animations s'adaptent au gameplay.
Voici la configuration :
Le module s'appel game_pawn et je l'ai ajouté au programme d'exemple ( s_game ) pour montrer comment l'utiliser.
En gros, tu dois d'abord définir :
- Les layers de sprite qui composent ton personnage (voir : Game_Sprite )
- Les différentes animations (voir : Game_Frame )
- Les différentes actions (en gros, une action est une animation avec quelques infos en plus comme savoir si elle boucle et si elle peut être interrompue ; voir : Game_Action )
- Un personnage (qui contient sa position, la liste des actions et des sprites ; voir : Game_Pawn )
Ensuite, tu as juste à faire GamePawn_SetAction() pour déclencher une action (et l'anim qui va avec).
Dans ta boucle principale tu dois aussi exécuter à chaque frame :
- La mise à jour de l'anim courante (via GamePawn_Update() )
- La mise à jour de l'affichage des sprites (via GamePawn_Draw() )
Le tout nécessitera une passe d'optimisation, mais c'est fonctionnel et utilisable.
Dans le programme d'exemple ( s_game ), je définie un personnage avec 3 layers de sprites, ainsi que les animations pour 4 actions : idle, move, jump et fall.
En fonction des inputs du joueur (et de la physique), je mets à jour la position du personnage ainsi que l'action dans laquelle il se trouve et les animations s'adaptent au gameplay.
Voici la configuration :
Code C :
// Pawn sprite layers const Game_Sprite g_SpriteLayers[] = { { 0, 0, 0, 16, 0, COLOR_BLACK }, { 1, 0, 0, 16, 4, COLOR_WHITE }, { 2, 0, 0, 16, 8, COLOR_LIGHT_RED }, }; // Idle animation frames const Game_Frame g_FramesIdle[] = { { 6, 48, null }, { 7, 24, null }, }; // Move animation frames const Game_Frame g_FramesMove[] = { { 0, 4, null }, { 1, 4, null }, { 2, 4, null }, { 3, 4, null }, { 4, 4, null }, { 5, 4, null }, }; // Jump animation frames const Game_Frame g_FramesJump[] = { { 3, 4, null }, { 8, 4, null }, }; // Fall animation frames const Game_Frame g_FramesFall[] = { { 9, 4, null }, }; // Actions id enum ANIM_ACTION_ID { ACTION_IDLE = 0, ACTION_MOVE, ACTION_JUMP, ACTION_FALL, }; // List of all player actions const Game_Action g_AnimActions[] = { // Frames Number Loop? Interrupt? { g_FramesIdle, numberof(g_FramesIdle), true, true }, { g_FramesMove, numberof(g_FramesMove), true, true }, { g_FramesJump, numberof(g_FramesJump), true, true }, { g_FramesFall, numberof(g_FramesFall), true, true }, };
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
J'ai fait 2 modifications :
- J'ai ajouté un flag pour les layers de sprite pour gérer les alternances de sprite sur les frames pair et impair (pour générer l'effet d'"ombrage"). Tu peux mettre 0 si tu en as pas besoin.
- J'ai déplacé l'initialisation du "pawn" dans la librairie. Plus besoin d'initialiser les valeurs lors de la déclaration du Game_Pawn .
Le sample est à jour.
- J'ai ajouté un flag pour les layers de sprite pour gérer les alternances de sprite sur les frames pair et impair (pour générer l'effet d'"ombrage"). Tu peux mettre 0 si tu en as pas besoin.
- J'ai déplacé l'initialisation du "pawn" dans la librairie. Plus besoin d'initialiser les valeurs lors de la déclaration du Game_Pawn .
Le sample est à jour.
On est toujours ignorant avant de savoir.
Bravo les zamis
C'est top ce gestionnaire de pawn
J'ai joué un peu avec et je me rends compte des limitations graphiques, je vais devoir bien optimiser les sprites...
s_anim.rom
Maintenant je vais essayer de charger un décor et de gérer quelques collisions, @aoineko @Ricco59 vous avez des conseils ?
J'ai joué un peu avec et je me rends compte des limitations graphiques, je vais devoir bien optimiser les sprites...
s_anim.rom
Maintenant je vais essayer de charger un décor et de gérer quelques collisions, @aoineko @Ricco59 vous avez des conseils ?
Il faut cultiver notre jardin.
aoineko
Membre non connecté
Conseiller Municipal
Premier conseil... renomme ton projet.
Tu peux dupliquer le répertoire /template/ , le renommer, puis renommer le .c et y copier tout ton code.
Pour ce qui est des collisions, si tu restes sur un écran qui fonctionne avec des tiles (comme le Screen mode 2), le plus simple c'est de gérer les collisions par tile.
Comme je l'avais expliqué sur un autre fil de discussion, je préconise d'utiliser les numéros de tile (0-255) pour coder des informations gameplay en plus de leur apparence.
Pour les collisions, par ex., il suffit de dire que tous les tiles bloquants ont le bit #7 égale à 1... ce qui revient juste à ranger tes tiles bloquants dans les emplacements 128 à 255.
Ensuite, si tu ne collisionnes qu'avec le tile entier (pas de collision à l'intérieur d'un tile), tu n'as besoin de t'en occuper que quand :
- PositionX % 8 == 0 pour les déplacement latéraux
- PositionY % 8 == 0 pour les déplacement verticaux
Voici un algorithme en pseudo code :
Tu peux dupliquer le répertoire /template/ , le renommer, puis renommer le .c et y copier tout ton code.
Pour ce qui est des collisions, si tu restes sur un écran qui fonctionne avec des tiles (comme le Screen mode 2), le plus simple c'est de gérer les collisions par tile.
Comme je l'avais expliqué sur un autre fil de discussion, je préconise d'utiliser les numéros de tile (0-255) pour coder des informations gameplay en plus de leur apparence.
Pour les collisions, par ex., il suffit de dire que tous les tiles bloquants ont le bit #7 égale à 1... ce qui revient juste à ranger tes tiles bloquants dans les emplacements 128 à 255.
Ensuite, si tu ne collisionnes qu'avec le tile entier (pas de collision à l'intérieur d'un tile), tu n'as besoin de t'en occuper que quand :
- PositionX % 8 == 0 pour les déplacement latéraux
- PositionY % 8 == 0 pour les déplacement verticaux
Voici un algorithme en pseudo code :
Code C :
// Position du personnage dans la matrice de tiles tileX = x / 8 tileY = y / 8 // Les déplacements sont libres par défaut CanMoveRight = true CanMoveLeft = true CanMoveUp = true CanMoveDown = true // Déplacement latéral if((x % 8) == 0) if(GetPattern(tileX + 2, tileY) & 0x80) CanMoveRight = false else if(GetPattern(tileX + 2, tileY + 1) & 0x80) CanMoveRight = false // Si (y % 8) != 0 le personnage est à cheval verticalement sur 3 tiles else if(((y % 8) != 0) && (GetPattern(tileX + 2, tileY + 2) & 0x80)) CanMoveRight = false if(GetPattern(tileX - 1, tileY) & 0x80) CanMoveLeft = false else if(GetPattern(tileX - 1, tileY + 1) & 0x80) CanMoveLeft = false // Si (y % 8) != 0 le personnage est à cheval verticalement sur 3 tiles else if(((y % 8) != 0) && (GetPattern(tileX - 1, tileY + 2) & 0x80)) CanMoveLeft = false // Déplacement vertical if((y % 8) == 0) if(GetPattern(tileX, tileY + 2) & 0x80) CanMoveDown = false else if(GetPattern(tileX + 1, tileY + 2) & 0x80) CanMoveDown = false // Si (x % 8) != 0 le personnage est à cheval latéralement sur 3 tiles else if(((x % 8) != 0) && (GetPattern(tileX + 2 , tileY + 2) & 0x80)) CanMoveDown = false if(GetPattern(tileX, tileY - 1) & 0x80) CanMoveUp = false else if(GetPattern(tileX + 1, tileY - 1) & 0x80) CanMoveUp = false // Si (x % 8) != 0 le personnage est à cheval latéralement sur 3 tiles else if(((x % 8) != 0) && (GetPattern(tileX + 2 , tileY - 1) & 0x80)) CanMoveUp = false
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Tout à l'air de fonctionner avec le template de base pourtant.
Je te conseille :
- Récupère une version "vanilla" (version d'origine sans aucune modif) du répertoire /template/ .
- Lance /template/build.bat pour vérifier que ça compile et que ça génère bien la ROM dans /template/emul/rom/template.rom .
- Duplique le répertoire et donne lui un nom (dans mon ex. : gfxgame).
- Lance /gfxgame/build.bat et vérifie que tout fonctionne toujours bien (y a pas de raison, mais c'est bien de faire étape par étape quand on sait pas d'où vient le problème)
- Renomme /gfxgame/template.c en ce que tu veux ( /gfxgame/gfxgame.c par ex.) et modifie /gfxgame/build.bat pour mettre SET ProjName=gfxgame
- Relance le build et vérifie que tu as bien /gfxgame/emul/rom/gfxgame.rom
- Ensuite, ouvre /gfxgame/gfxgame.c et copie-colle tout le contenu de ton programme
- Assure-toi bien que toutes les données ( .h ) sont à l'endroit on vont les chercher les #include
- Relance le build
Si jamais ça ne fonctionnait toujours pas, copie-colle ici le résultat du build (tu peux faire un " build.bat > log.txt ") pour que toutes les infos affichées par le Build tool se retrouve dans un fichier text.
Je te conseille :
- Récupère une version "vanilla" (version d'origine sans aucune modif) du répertoire /template/ .
- Lance /template/build.bat pour vérifier que ça compile et que ça génère bien la ROM dans /template/emul/rom/template.rom .
- Duplique le répertoire et donne lui un nom (dans mon ex. : gfxgame).
- Lance /gfxgame/build.bat et vérifie que tout fonctionne toujours bien (y a pas de raison, mais c'est bien de faire étape par étape quand on sait pas d'où vient le problème)
- Renomme /gfxgame/template.c en ce que tu veux ( /gfxgame/gfxgame.c par ex.) et modifie /gfxgame/build.bat pour mettre SET ProjName=gfxgame
- Relance le build et vérifie que tu as bien /gfxgame/emul/rom/gfxgame.rom
- Ensuite, ouvre /gfxgame/gfxgame.c et copie-colle tout le contenu de ton programme
- Assure-toi bien que toutes les données ( .h ) sont à l'endroit on vont les chercher les #include
- Relance le build
Si jamais ça ne fonctionnait toujours pas, copie-colle ici le résultat du build (tu peux faire un " build.bat > log.txt ") pour que toutes les infos affichées par le Build tool se retrouve dans un fichier text.
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie