Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » LZY, un mini-framework gint et SDL2
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

LZY, un mini-framework gint et SDL2

Posté le 28/02/2022 22:34

Bonsoir tout le monde ! Je suis heureux de vous présenter ma librairie LZY (prononcez lazy), un framework permettant de programmer des jeux pour ordinateur (avec SDL2) et calculatrice Casio 90+E (avec gint) !

La librairie est constituée d'un unique header C, et est très facile à utiliser.

Le jeu suivant compile et fonctionne de manière exactement identique sur ordinateur et calculatrice. Il consiste en un carré qui se déplace à l'écran avec les flèches ou REPLAY.
#define LZY_IMPLEMENTATION
#include "lzy.h"
#include <stdint.h>

static void draw_player(int x, int y);

int main(void) {
    int x = 0;
    int y = 0;

    if (LZY_Init("lzy example", 30)) {
        LZY_Log(LZY_GetError());
        LZY_Quit();
        return 1;
    }
    LZY_Log("init was great success!");

    do {
        /* update */
        LZY_CycleEvents();
        if (LZY_KeyDown(LZYK_LEFT))
            x--;
        if (LZY_KeyDown(LZYK_RIGHT))
            x++;
        if (LZY_KeyDown(LZYK_UP))
            y--;
        if (LZY_KeyDown(LZYK_DOWN))
            y++;

        /* draw */
        LZY_DrawBegin();
        {
            LZY_DrawSetColor(0x20, 0x20, 0x00);
            LZY_DrawClear();
            draw_player(x, y);
        }
        LZY_DrawEnd();
    } while (!LZY_ShouldQuit());

    LZY_Log("cya");
    LZY_Quit();
    return 0;
}

static void draw_player(int x, int y) {
    LZY_DrawSetColor(0x00, 0xff, 0xff);
    LZY_DrawFillRect(x, y, 8, 8);
    LZY_DrawSetColor(0xff, 0x00, 0x00);
    LZY_DrawRect(x + 1, y + 1, 6, 6);
}


La librairie est déjà parfaitement fonctionnelle et utilisable, mais est encore en développement dans le but d'ajouter des fonctionnalités et une pseudo-documentation.

Vous pouvez trouver lzy.h sur son dépôt avec l'exemple précédent, et jouer avec LZY vous même :
https://gitea.planet-casio.com/KikooDX/lzy/src/branch/main/inc/lzy.h

Si vous êtes intéressés par le projet et souhaitez m'aider, faire un petit prototype avec LZY et partager votre expérience me serait très utile ! Lisez le début de lzy.h, vous y trouverez les protoypes des fonctions.

@RDP Toutouille <3

Module d'extension LZY
https://git.sr.ht/~kikoodx/lzy-input

Jeux créés avec LZY
Tiny Mutant Axolotl
Planète Casio Brawl Prototype
WEHFOU
Teh Moon Show
Frozen Frenzy 2


Lephenixnoir Hors ligne Administrateur Points: 24232 Défis: 170 Message

Citer : Posté le 28/02/2022 23:04 | #


Intéressant. Je vois que la demande de faire du cross-platform est bien là... xD

T'as un problème de double définition si on inclut deux fois "lzy.h" dans le fichier d'implem.

LZY_TILE_SIZE ça a un but précis ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 28/02/2022 23:10 | #


T'as un problème de double définition si on inclut deux fois "lzy.h" dans le fichier d'implem.

Ah bien vrai, je vais l'undef de ce pas. Merci

LZY_TILE_SIZE ça a un but précis ?

Yep, ça viendra plus tard quand j'ajouterai le support d'un atlas de textures (demain ?). C'est inspiré par PICO-8, et permettra d'appeler LZY_DrawTile(x, y, id) pour dessiner à l'écran par exemple. Cela permettra à la librairie de rester complètement transparente, et accessoirement c'est très pratique pour les game jams
ouais ouais
Slyvtt Hors ligne Maître du Puzzle Points: 2309 Défis: 17 Message

Citer : Posté le 28/02/2022 23:18 | #


Je plussoie :-)

Très bonne idée que cette librairie multicible.
Perso je préfère la SDL 1.2, même si la 2.0 a de nombreux ajouts (principalement la prise en charge des GPU).

L’écriture de la triangle interne va sûrement te prendre un peu de temps, mais c’est pour en gagner pas mal après.
Je pense que SDL_Image et SDL_Gfx seront tes amies aussi :-)

Bon courage
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 01/03/2022 02:37 | #


Merci Slyvtt ! J'étais déçu de ne pas pouvoir partager mes jeux gint avec des personnes ne possédant pas de calculatrice, j'espère que ça le rendra possible.

Je ne connais pas SDL 1.2, mais ça me semble parfaitement respectable. Je pense que modifier cette librairie pour SDL 1.2 ne serait pas très dur, l'utilisateur peut s'en occuper si besoin.

J'utilise déjà SDL_image, SDL_gfx ne sera pas nécessaire pour la portée de ce projet je pense

----------

Le support du tileset est là ! Très simple à utiliser comme le reste, il y a juste besoin de déclarer une macro avant l'implémentation pour indiquer le nom du bopti_image_t et de préciser le chemin vers l'image dans LZY_Init pour l'implémentation SDL.

J'ai fait beaucoup de changements mineurs, notamment l'ajout des boutons et deux macros optionnelles pour préciser des inclusions différentes des headers SDL.

Le code d'exemple du dépôt a été mis à jour pour refléter les changements. En bonus, ci-dessous un programme minimal dessinant une animation en boucle. Je l'ai créé pour montrer à Masséna que c'est pas plus dur qu'avec dsubimage.

#define LZY_IMPLEMENTATION
#define LZY_GINT_TILESET bimg_tset
#include "lzy.h"

int main(void) {
    float frame = 0.0f;

    if (LZY_Init("lzy animation", "res/tset.png", 30)) {
        LZY_Log(LZY_GetError());
        LZY_Quit();
        return 1;
    }

    do {
        LZY_CycleEvents();

        frame += 0.1f;
        if (frame >= 4.0f)
            frame = 0.0f;

        LZY_DrawBegin();
        {
            LZY_DrawSetColor(0, 0, 0);
            LZY_DrawClear();
            LZY_DrawTile(frame, 194, 108);
        }
        LZY_DrawEnd();
    } while (!LZY_ShouldQuit());

    LZY_Quit();
    return 0;
}

Je considère que LZY est donc utilisable pour un projet de taille moyenne (déjà !), et je m'amuserai sûrement avec pour la prochaine jam.

Il manque principalement l'affichage de texte. L'implémentation utilisera sûrement une image et forcera le monospace pour rester simple.

@Tituya, de rien mec
ouais ouais
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 01/03/2022 15:36 | # | Fichier joint


Bonchour ! Le support du texte est là !

Les fonctions LZY_DrawChar et LZY_DrawFont font ce que vous pensez, et le programme d'exemple a été mis à jour pour montrer comment utiliser et configurer une police.

Ci-dessous, une photo de mon ordinateur sale et ma calculatrice faisant tourner la démo.



@RDP ofc
ouais ouais
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 02/03/2022 00:28 | # | Fichier joint


C'est encore moi ! LZY gère désormais l'audio, avec pour le moment chargement, destruction et lecture de fichiers audios. L'API est très simple (je radote à ce niveau là). Bien sûr, il n'y aura pas de son sur calto, mais cet ajout rend la production de jeu complet plus fluide ce qui est l'objectif de LZY après tout

LZY_Sound *sound = LZY_SoundLoad("res/sound.wav"); // effet sonore
LZY_Music *music = LZY_MusicLoad("res/music.ogg"); // bombtrack
LZY_SoundPlay(sound); // et paf le son
LZY_MusicPlay(music); // et paf la musique
LZY_SoundDestroy(sound); // et ça fait
LZY_MusicDestroy(music); // bim bam boum

Le code gère proprement les pointeurs NULL, pas besoin de paniquer sur une erreur. Un jeu sans son fonctionne de la même manière en général. Les erreurs sont tout de même renvoyées par LZY, pensez à les logger pour rendre le débogage plus facile !
ouais ouais
Slyvtt Hors ligne Maître du Puzzle Points: 2309 Défis: 17 Message

Citer : Posté le 02/03/2022 08:10 | #


Ca me plait vraiment bien ton API KikooDX

Hate d'en voir plus.
J'ai regardé ton code et je me disais que peut etre il te faudrait mettre quelques fonctions en "inline", pour booster les performances quand ca va etre utilisé "industriellement" sur un "vrai" jeu.

En tout cas bon boulot
There are only 10 types of people in the world: Those who understand binary, and those who don't ...
Lephenixnoir Hors ligne Administrateur Points: 24232 Défis: 170 Message

Citer : Posté le 02/03/2022 10:44 | #


Et la question à 1 million : c'est quoi la différence entre Sound Et Music ? :3
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 02/03/2022 11:44 | # | Fichier joint


Merci Slyvtt !

Slyvtt a écrit :
J'ai regardé ton code et je me disais que peut etre il te faudrait mettre quelques fonctions en "inline", pour booster les performances quand ca va etre utilisé "industriellement" sur un "vrai" jeu.

Il me semble bien qu'en C moderne inline soit contre productif, le compileur s'occupe de le faire lui-même quand jugé nécessaire. Lephé peut peut-être confirmer ?

Et je compte bien utiliser LZY "industriellement", à l'échelle de la communauté Casio en tout cas

Lephénixnoir a écrit :
Et la question à 1 million : c'est quoi la différence entre Sound Et Music ? :3

ZLY_Sound est un sample audio brut chargé en mémoire, qui a les meilleures performances mais pèse relativement lourd sur le disque (.wav) et prend de la place en mémoire (logiquement). À utiliser pour les divers effets sonores qui sont joués régulièrement.

ZLY_Music quand à lui stream l'audio depuis le fichier, ce qui est plus couteux sur le CPU mais prend bien moins d'espace disque (.ogg, .mp3, etc.) et de mémoire. ZLY_Music devrait être utilisé... pour la musique.
ouais ouais
Lephenixnoir Hors ligne Administrateur Points: 24232 Défis: 170 Message

Citer : Posté le 02/03/2022 11:49 | #


Kikoodx a écrit :
Il me semble bien qu'en C moderne inline soit contre productif, le compileur s'occupe de le faire lui-même quand jugé nécessaire. Lephé peut peut-être confirmer ?

Ce n'est pas particulièrement contre-productif à ma connaissance, mais c'est plus ou moins ignoré par le compilateur qui en effet décide lui-même selon le niveau d'optimisation demandé. Ce n'est vraiment utile que pour définir des fonctions static inline dans les headers pour servir de macros (sinon doubles définitions). GCC à __attribute__((always_inline)), mais c'est pareil, souvent il sait inliner tout seul. En général on ne le met pas.

ZLY_Sound est un sample audio brut chargé en mémoire, qui a les meilleures performances mais pèse relativement lourd sur le disque (.wav) et prend de la place en mémoire (logiquement). À utiliser pour les divers effets sonores qui sont joués régulièrement.

ZLY_Music quand à lui stream l'audio depuis le fichier, ce qui est plus couteux sur le CPU mais prend bien moins d'espace disque (.ogg, .mp3, etc.) et de mémoire. ZLY_Music devrait être utilisé... pour la musique.

Ok, merci !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 06/03/2022 14:09 | #


Merci pour la confirmation Lephé

Je n'ai pas fait de changelogs quotidiens, j'utilise maintenant LZY en prod et ajoute ce qui manque au fur et à mesure :

LZY_DrawPoint dessine un point à l'écran (no shit Sherlock)
LZY_DrawLine trace une ligne avec l'algorithme de Bresenham
LZY_PollEvent, et les structures de données associées, permettent de gérer les événements manuellement si la structure de votre jeu s'y porte mieux

J'ai aussi corrigé des bugs cringes.

@RDP, on y croit
ouais ouais
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 11/03/2022 22:10 | # | Fichier joint


Le premier projet complet utilisant LZY est sorti ! Disponible pour calculatrices Casio 90+E et ordinateurs Windows (Linux aussi techniquement, voir footnote).

Créé par moi et Masséna (#owoteam), nous vous présentons Tiny Mutant Axolotl: Crypt of the Pancaker (ce titre est canonique).

Le jeu a été développé en une semaine. LZY fonctionne sans accroc. Les sources sont disponibles sur itch.io, et je travaille à rendre le dépôt git public dans les prochains jours. Jetez-y un oeil si vous cherchez un exemple de projet LZY.

Note sur l'absence de build Linux : il est simple plus de compiler pour Windows et demander Wine que de faire un programme cross distros proprement. Je recommande tout de même aux utilisateurs confirmés de chopper les sources et compiler eux même.

@RDP
ouais ouais
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 16/03/2022 18:51 | # | Fichier joint


LZY a vu un nombre de changements plus ou moins mineurs en dix jours, voici un changelog rapide :

LZY_SoundSetVolume permet de changer le volume d'un effet sonore
LZY_PollEvent a été retravaillé
Les programmes sont centrés sur calculatrice (automatique)
Le chargement de ressources utilise désormais un chemin relatif (automatique)
La touche F11 passe le jeu en plein écran sur la cible SDL2 (automatique)
Remplacé le système de build de l'exemple par make
Le projet a désormais un README exposant les options de l'implémentation

#TituyaAdmin

@RDP
ouais ouais
Slyvtt Hors ligne Maître du Puzzle Points: 2309 Défis: 17 Message

Citer : Posté le 17/03/2022 16:23 | #


Ca avance bien on dirait Kikoo.
Faut que je lève un peu le nez de Outrun et regarde un peu ce que font les copains

Mais clairement ça me plait beaucoup le dev trans-plateforme
There are only 10 types of people in the world: Those who understand binary, and those who don't ...

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 68 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd