MSX Village forum

La Place des Développeurs MSXgl MSX Game Library

aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 29/01/2022 à 18h39

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.
Github    
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 29/01/2022 à 19h06
MSXgl support maintenant le MSX-AUDIO (comme la cartouche Music-Module de Philips). :tchin

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.
Github    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 29/01/2022 à 19h51
Ah mais ça serait topissime ça :p
Tu veux essayer avec ma planche de sprites ? :siffle Edité par Gfx Le 29/01/2022 à 20h01


Il faut cultiver notre jardin.
   
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 29/01/2022 à 20h52
Aller, zou :)


On est toujours ignorant avant de savoir.
Github    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 29/01/2022 à 22h18
Here we go :)
Edité par Gfx Le 29/01/2022 à 22h29


Il faut cultiver notre jardin.
   
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 246

Le 30/01/2022 à 01h56
Bravo Gfx, tu entres dans le monde de la msxdev ;)


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 30/01/2022 à 03h05
J'ai push une nouvelle version de MSXgl sur GitHub avec un gestionnaire de sprite. :tea

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.
Github    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 30/01/2022 à 09h49
C'est génial @aoineko ! je vais faire un test de ce pas :top
@ricco je tente un petit projet ;) Edité par Gfx Le 30/01/2022 à 10h05


Il faut cultiver notre jardin.
   
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 30/01/2022 à 12h14
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.


On est toujours ignorant avant de savoir.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 246

Le 30/01/2022 à 21h51
:top Bravo les zamis ;)


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 30/01/2022 à 23h51
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 :) ?


Il faut cultiver notre jardin.
   
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 31/01/2022 à 00h44
Premier conseil... renomme ton projet. :p
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.
Github    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 31/01/2022 à 11h50
@aoineko merci, je vais recommencer proprement, là je m'amusais juste à faire quelques explorations.
Ah oui ça me revient (c'était pour les collision dans le filet je crois...)
Génial comme idée, je vais faire ça.


Il faut cultiver notre jardin.
   
Sebbeug Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h33

Messages: 1416

Le 31/01/2022 à 13h00
Quel boulot cette librairie ! Dingue ! Bravo :love


Clé de sol

Site web    
Gfx Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 22/02/2021 à 22h22

Messages: 353

Le 31/01/2022 à 13h16
@aoineko quand je build depuis un template il n'a pas l'air de trouver le msxgl_config.h local et j'ai une erreur de compil.
J'ai mal fait quelque chose ?


Il faut cultiver notre jardin.
   
aoineko Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/01/2011 à 21h17

Messages: 2184

Le 31/01/2022 à 16h33
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.


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie