Hello, (et désolé d'avance pour le pavé).
Je ne comptais pas en parler avant qu'elle soit releasée, mais bon...
Pour info j'ai dans mes cartons une librairie (qu'on va appeler pour
le moment 'elixirPulp') qui se rapproche de Cauldron dans l'esprit: la
lib est une sorte de wrapper au dessus d'EVAS qui permet surtout
fournir une API simple, concise, immédiatement compréhensible,
mémorisable, et orientée objet. Comme Cauldron, elle devrait avoir de
l'intérêt surtout pour les irréductibles réfractaires au format
EDJE ... comme moi ;-)
Je pense qu'elixirPulp va déjà un peu plus loin que la lib Cauldron et
pourra pleinement la remplacer à terme. Donc si ton objectif est de ne
pas laisser mourrir le concept de Cauldron, je pense qu'elixirPulp
pourra éventuellement être une alternative viable.
Je suis d'ailleurs un peu comme toi, et même si personellement je vois
l'intérêt d'une telle lib pour moi-même, j'ai du mal à évaluer si ça
peut intéresser un peu/beaucoup de monde ou pas du tout.
Cédric a déjà eu entre les mains une pré-version à peu près
fonctionnelle il y a quelques semaines ; elle a évolué depuis et on
approche du but. Je la releaserai "when it's done" (comprendre
"bientôt", mais je ne veux/peux pas m'avancer sur une date précise).
Il me reste surtout à nettoyer un peu le code, ajouter quelques
commentaires, virer un ou deux bugs, et ... faire une vraie doc et/ou
quelques exemples qui servent de tutoriels.
Dans sa version actuelle (environ 2000 lignes de code), elle gère
entre autres:
- l'initialisation automatique d'elixir et de ses modules.
- la notion de 'stage', pour la gestion du canvas, de la 'game logic
loop' et plus globalement de tout ce qui peut être vu comme un
singleton dans une appli elixir (les input notamment).
- des classes JS reprenant les principaux objets EVAS, ici appelées
'sprites' (image (animée), rectangle, ligne, texte, ...). On retrouve
à peu près toutes les propriétés des objets (position, alpha,
couleur, ...) et quelques autres en plus (genre la notion de point
d'ancrage).
- la notion de 'scène', l'équivalent d'un sceneGraph où les objets
graphiques sont hiérarchisés. Les noeuds du graphe étant des sprites
spéciaux, les 'groupes'. Ceux-ci permettent d'appliquer des
transformations à l'ensemble de ses 'enfants' (position, alpha, ...) ;
les feuilles du graphe étant les sprites décrits ci-dessus (image,
rectangle, ...).
- la notion d'animation avec la possibilité d'animer (de façon
linéaire ou non) à peu près l'ensemble des propriétés des objets
(position, alpha, couleur, images, ...).
- la notion de timeline qui est une sorte de super-animation: un
regroupement d'animations et d'événéments qui peuvent être bouclés,
avancés, reculés, stoppés, repris, ...
- une gestion des inputs avec la télécommande avec une approche
'statefull' (genre des fonctions isKeyPressed, isKeyReleased, ...)
ainsi que la possibiltié d'utilsier le pavé numérique pour entrer du
texte, à la façon dont on écrit un sms sur un téléphone portable.
Voilà dans l'esprit. Pour avoir plus d'idées sur la tête que peut
avoir l'API, il suffit de jeter un oeil à un autre projet (en Java
pour le coup): PulpCore dont l'API d'elixirPulp est fortement
inspirée, d'où le nom d'ailleurs (
http://www.interactivepulp.com/pulpcore/
).
Pour la licence, j'avoue que je n'y ai pour le moment que très
brièvement pensé et il y a pas mal de chances pour que j'opte pour une
des deux solutions suivantes:
1- soit un mix de deux licences: une licence gratuite en 'GPL' pour
les projets non-commerciaux (donc appli elle-même obligatoriement en
open source) + une licence 'commerciale' (payante-peu-chère) pour les
projets closed source. L'avantage serait d'encourager les projets open-
source tout en laissant la possibilité de l'utiliser pour du closed
source. Pour ceux qui connaissent, c'est exactement l'équivalent du
système de double licence de la librairie Qt à ses débuts.
2- soit mettre le tout en LGPL pour contenter tout le monde, mais cela
risque de ne pas encourager les projets open source.
Bref, je verrai le moment venu et je ferai mon choix ... en mon âme et
conscience :o)
Nouk²
PS: Pour donner une idée de la 'gueule du code' quand on utilise
elixirPulp, voici un exemple de code auto-suffisant pour afficher un
hello-world et un carré animé, changer de résolution et quitter.
elx.include("elixirPulp.js");
var stage = new Stage();
stage.createCanvas( (720 , 576, 50); // (width, height, fps)
// l'objet dérivé de Scene qui va contenir mon sceneGraph
var maScene = new Scene.extend({
constructor: function() {
this.base( 720, 576, "MaScene");
// on créé une image et on l'ajoute à la scène.
this.back = new ImageSprite( 0, 0, "background.jpg");
this.back.setAnchor(Anchor.SOUTH);
this.addSprite(this.back);
// idem mais en plus concis (on peut presque partout concaténer les
appels de fonctions sur une ligne).
this.text = this.addSprite( new TextSprite(360, 200, 720, 50,
"Hello, world !", [0,255,0], "Vera",
26).setAlpha(127).setAnchor(Anchor.CENTER) );
this.carre = this.addSprite(new RectangleSprite(300, 300, 100, 100,
[255, 0, 0]));
// une animation du carré rouge, basée sur une timeline qui boucle 3
fois puis s'arrête.
var anim = this.addTimeline(new Timeline().addAnimator(this.carre,
Action.POSXY, [300, 300], [500, 300], Easing.ELASTIC).setLoop(3));
}
// la fonction appelée à chaque 'frame' pour la scène courante.
update: function(elaspedTime) {
// pour quitter
if (stage.input.isKeyDown("Home"))
stage.shutdown();
// switch 4/3 <=> 16/9
else if (stage.input.isKeyReleased("x")) {
stage.resizeCanvas( (stage.width == 720 ? 1024 : 720), 576);
}
}
});
// on choisit la scène à afficher et on lance le bouzin.
stage.setScene(maScene);
stage.exec();