Discussion: [Projet] Wingraph
Afficher un message
Vieux 21/07/2009, 09h15   #1
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
Par défaut [Projet] Wingraph

Wingraph
Librairie pour PC
ALPHA

Version 1.0 alpha

Présentation :
Bon ben voilà (encore) une librairie, qui était assez attendue par au moins une personne
Wingraph est un essai de librairie que j'avais fait lorsque j'envisageais de redesigner l'API d'OSLib en C++. Finalement ça ne s'est pas fait et ce n'est pas plus mal.
Toutefois j'ai repris la librairie il n'y a pas longtemps en pensant à une solution pour développer un défi de noël auquel tout le monde pourrait jouer. Je lui ai alors ajouté des spécificités avantageuses que ce nouveau modèle permet et "modernisée" un peu.

Voici pour commencer un petit exemple de code:
Code PHP:
#include <wingraph.h>
using namespace wingraph;

int WINAPI WinMain(HINSTANCEHINSTANCELPCTSTRint) {
    
// Initialisation
    
initLib();
    
initWindow("Nom fenêtre"320240true);

    
Image ciel("sky.png");
    
Font font("Verdana"16);

    
// Boucle principale
    
while (!closed) {
        
// Tourne l'image
        
ciel.angle += 0.1;
        
// Reset si on appuie sur R
        
keyboard.readInput();
        if (
keyboard.pressed('R'))
            
ciel.angle 0;

        
// Dessin
        
if (!skipFrame) {
            
beginDrawing();
            
clearScreenColor(128128255) );
            
ciel.draw();
            
font.drawText(00"Texte");
            
endDrawing();
        }
    }


Tout d'abord il faut savoir que c'est du C++. Donc il y a quelques notions à piger avant de commencer. Pour ça je vous suggère vivement de lire la doc, qui a une introduction bien utile à ce sujet. Mais basiquement là où vous aviez des structures dans OSLib vous avez maintenant des objets avec des méthodes et propriétés et opérateurs associés. Par exemple notre objet OSL_IMAGE est remplacé par un objet Image, qui se déclare comme tout objet C++:
Code PHP:
Image ciel("sky.png"); 
Cela crée un objet nommé 'ciel' de type 'Image' avec les arguments de construction spécifiés (ici le nom du fichier à charger). En fait cela permet de directement construire un objet initialisé correctement. Avec OSLib lorsqu'on déclarait une variable de type OSL_IMAGE elle était d'abord non initialisée jusqu'à ce qu'on appelle oslLoadImageFile. Ici en créant la variable on s'assure qu'elle est déjà utilisable.
Là encore je vous suggère vivement d'utiliser la notation pointeur comme OSLib et de ne pas initialiser directement les objets à moins qu'ils soient locaux. Rappelez-vous qu'on ne peut utiliser la lib qu'une fois initialisée, donc si vous créez un objet global il sera initialisé au démarrage du programme, avant même que main n'ait démarré, alors la librairie ne sera pas initialisée. La notation pointeur:
Code PHP:
Image img1("test.png"); // Le compilo va essayer de la créer au démarrage, mais la lib n'a pas encore été initialisée
// Bonne solution
Image *img2;
void main() {
    
img2 = new Image("test.png");
    
// Ne pas oublier une fois terminé
    
delete img2;

Donc sauf cas exceptionnel, utilisez la notation pointeur pour les objets globaux et la notation par valeur (présentée plus haut) pour les objets locaux.
Sinon vous avez des objets pour d'autres éléments, comme les couleurs. Vous pouvez alors faire du calcul sur les couleurs:
Code PHP:
Color rouge(25500), bleu(00255);
Color magenta rouge bleu
Ca peut être très pratique. Les objets ont aussi ce qu'on appelle des méthodes, c'est-à-dire des fonctions qui leur sont propres. Avant on aurait écrit oslDrawImage(img, x, y). Maintenant on a une méthode appelée draw qui s'applique à un objet Image, alors il suffit d'écrire image.draw(x, y), ou avec un -> à la place du point s'il s'agit d'un pointeur.
Code PHP:
// Alternative 1
Image img("test.png");
img.draw(00);

// Alternative 2 (notation pointeur)
Image *img = new Image("test.png");
img->draw(00);
delete img
Après tout n'est pas objet dans Wingraph, il y a toujours les fonctions de base: drawLine par exemple. Elles peuvent s'utiliser toujours de la même manière, comme par exemple:
Code PHP:
drawLine(0088); 
Mais on a l'introduction d'un objet Vertex qui peut se substituer aux habituels points. Une vertice (noeud) permet de définir un point avec éventuellement des informations additionnelles, qu'on fournit à la construction. Par exemple on peut écrire:
Code PHP:
drawLine(Vertex(00), Vertex(88)); 
Cela dessine une ligne de (0, 0) à (8, 8). Maintenant on peut par exemple fournir une couleur à la vertice:
Code PHP:
Color rouge(25500), jaune(2552550);
drawLine(Vertex(00rouge), Vertex(88jaune)); 
Ici le rouge sera utilisé pour le départ et le jaune pour l'arrivée, on aura alors un joli dégradé orange le long de la ligne. Si la ligne est texturée par exemple on pourra fournir les coordonnées u et v à l'intérieur de la texture, etc.
Si on maîtrise bien, cela permet de généraliser beaucoup d'effets (au final une image n'est rien de plus qu'un rectangle texturé...).

On a aussi l'introduction du calcul matriciel, qui peut aider énormément au niveau des transformations (rotation, etc.) et de la détection de collisions. Il est évidemment réservé aux utilisateurs expérimentés, mais il n'y a pas besoin de connaître quoi que ce soit en maths pour l'utiliser.
Le projet wingraph_test propose un début d'interface nommé Wingraph UI, qui permet en très peu de lignes de créer des composants tels que des boutons qui peuvent recevoir des événements (cliqué dessus, etc.) et qui peuvent être agrandis ou tournés. Les matrices permettent de simplifier ce genre d'opérations à l'extrême, comme vous pourrez le voir dans le code si ça vous intéresse.

Bref tout ça c'est génial mais comme d'habitude avec l'orienté objet: vous ne pouvez pas deviner ce qui est possible ou pas (quels objets, quels opérateurs, quelles méthodes, etc.), et si vous y arrivez par hasard il y a des chances que ça ne soit pas terrible notamment niveau performance, donc je vous recommande vraiment d'avoir la doc sous la main

Il y a aussi quelques exemples, que vous pouvez télécharger directement ici: http://brunni.dev-fr.org/tmp/WGDemos.7z
Vous y trouverez un début d'air hockey basé sur les réflexions que j'avais faites à l'époque où je souhaitais aider Dreamkey. Il y a aussi un programme affichant des flocons de koch, qui montre bien comment fonctionne le modèle objet de Wingraph.

La lib peut se télécharger ici: http://brunni.dev-fr.org/tmp/Wingraph-1.0alpha.7z
C'est une alpha, et comme je l'ai déjà dit c'est un essai. Je la finaliserai en fonction de vos commentaires et autres feedback.

Merci!

Galerie d'image :


Historique :
Commencé en... houlà 2007?
Première release en ce 20 juillet 2009.

Comment utiliser :
Lire le readme

Autres informations :
-

Dernière modification par Brunni ; 21/07/2009 à 22h43.
Brunni est déconnecté   Réponse avec citation