LZY -- 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://kdx.re/cgit/lzy/tree/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://kdx.re/cgit/lzy-input
Jeux créés avec LZY
Tiny Mutant Axolotl
Planète Casio Brawl Prototype
WEHFOU
Teh Moon Show
Frozen Frenzy 2
ZyperZetron 2000
A-steroids
hyperultra
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 ?
Citer : Posté le 28/02/2022 23:10 | #
Ah bien vrai, je vais l'undef de ce pas. Merci
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
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
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_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
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
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_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 !
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
Citer : Posté le 02/03/2022 10:44 | #
Et la question à 1 million : c'est quoi la différence entre Sound Et Music ? :3
Citer : Posté le 02/03/2022 11:44 | # | Fichier joint
Merci Slyvtt !
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
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.
Citer : Posté le 02/03/2022 11:49 | #
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_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 !
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
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
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
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
Citer : Posté le 24/10/2024 17:19 | #
j'ai changé le titre, c'était pas in character
le framework a graduellement évolué depuis deux ans, il est (beaucoup) mieux qu'avant et certaines fonctionnalités sont plutôt stylées. il est relativement limité par nature, mais comme vous pouvez voir à la liste des jeux du post principal (maintenant à jour) ça reste très puissant, je recommande particulièrement pour les game jams WINK WINK CPC WINK WINK
@RDP #TituyaAdmin #CommeEn22
Citer : Posté le 24/10/2024 19:43 | #
Diantre, je ne connaissais pas A-Steroïd !!!
Ce jeu est juste vicieux à souhait !!!
Comment se fait la conversion vers la version browser ? Tu passes en webassembly ?
Bravo en tout cas pour le framework, on peut faire de jolies choses.