:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Autres > Projets

Projets Projets de développement amateur sur d'autres supports

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
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 225
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

Publicité

Vieux 21/07/2009, 09h49   #2
Ass-Itch
Graphiste / Modérateur
 
Date d'inscription: 05/09/2006
Localisation: Hossegor
Messages: 2 583
Voir les codes amis Wii
Par défaut

Comme d'hab, c'est trop technique pour que je puisse apprécier le truc à sa juste valeur, mais quelque chose me dit que je vais malgré tout en profiter

Bon, il faut une news digne de ce nom... RIOLEHH, LÈVE-TOI ET NEWS, PUTAIN DE TOI !
Ass-Itch est déconnecté   Réponse avec citation
Vieux 21/07/2009, 17h15   #3
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Boah c'est pas si technique hein c'est vrai que les derniers trucs que j'ai rajoutés le sont à fond mais sinon y a qu'à voir le petit exemple que j'ai posté, ça se comprend assez facilement
Brunni est déconnecté   Réponse avec citation
Vieux 21/07/2009, 20h26   #4
Monsieur J
Membre confirmé
 
Date d'inscription: 19/03/2009
Localisation: Dijon, Paris
Messages: 124
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

Brunni tu es mon Dieu.
Tu ne t'arretes jamais. Déjà que tu m'avais bluffé d'une force entre GbaGraphics et la µib...

Un seul mot à dire: Bravo
Monsieur J est déconnecté   Réponse avec citation
Vieux 23/07/2009, 18h18   #5
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Merci quelqu'un a essayé ou est en train d'essayer de faire un jeu avec ça?
Brunni est déconnecté   Réponse avec citation
Vieux 25/07/2009, 05h49   #6
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

J'ai modifié un peu l'exemple de Air Hockey (pas encore updaté) pour montrer que les fonctions de la lib sont plus générales que mes libs précédentes et ne limitent plus forcément votre jeu à la 2D.



Ce que je vais dire là c'est pour les utilisateurs qui maîtrisent déjà bien la lib. C'est pas super compliqué mais ça fait appel à des concepts un peu plus avancés, qu'on retrouve en 3D.
Donc pour faire ça il n'y a pas de fonction native, mais ça consiste en fait juste à définir une matrice de projection pour changer le point de vue. On se débrouille pour faire en sorte que l'observateur regarde notre plan Oxy habituel (2D) et ensuite on opère les transformations qu'on veut pour l'inclinaison et autres. Je sais que c'est du chinois dit comme ça, un exemple sera plus parlant:

Code PHP:
// Permet d'avoir une vue en perspective
void passeEn3D() {
    
// Définit une perspective 3D
    
glMatrixMode(GL_PROJECTION);
    
glLoadIdentity();
    
// Angle d'ouverture 50°, aspect ratio largeur/hauteur
    
gluPerspective(50double(screenWidth) / screenHeight0.1, -0.1);
    
// En mode 2D le plan x,y correspond au plan y,z en 3D à cause du système d'axe
    // Ainsi avec notre x,y on dessinerait au sol... on a donc défini une caméra qui
    // regarde depuis le haut (z=1) et un peu reculée (x=1)
    
gluLookAt(101,        // Pos. observateur x,y,z
              
000,        // Cible x,y,z
              
001);        // Axe Oz (vers le haut, normal)

    // On va s'arranger avec diverses transformations pour voir quelque chose à l'écran
    // Le système de coordonnée change lui aussi (x dirigé vers le bas, y vers la droite)
    
rotateScreen(PI 2);
    
scaleScreen(1, -1);
    
// Le rendu est normalement entre -1 et 1, nous on dessine entre 0 et 480
    
scaleScreen(1.0f screenHeight);
    
moveScreen(-screenWidth 2, -screenHeight 2);

Il faut savoir qu'en 3D le système d'axes est le même qu'en maths: X pointe vers soi (s'il est négatif on s'éloigne), Y va vers la droite (s'il est négatif vers la gauche) et Z vers le haut (s'il est négatif sur le bas). Le plan (x,y) actuel est en fait au sol maintenant! On crée alors une caméra qui se trouve au-dessus du plan de rendu et un peu plus loin (x positif) pour l'inclinaison. Ensuite on fait une rotation car si vous faites le test de visu avec ce système d'axes, vous verrez que ça ne joue pas: x qui vient vers soit ira donc vers le bas et y ira vers la droite. On veut x vers la droite et y vers le bas pour correspondre au rendu 2D habituel. On utilise alors une rotation de 90° (PI/2), mais là on a toujours le problème du fait que x va vers le haut comme normalement en maths. On fait alors un scaling négatif en y pour corriger ça. Ensuite il ne reste plus qu'à recentrer l'écran et à le scaler correctement pour qu'il soit à la bonne taille (ça peut aussi se régler avec l'angle d'ouverture ou avec la distance de l'observateur, c'est comme vous le souhaitez).

Ensuite on peut dessiner sur notre écran incliné comme une table de jeu! Rappelez vous que lorsque vous faites moveScreen ou autre vous n'affectez pas ce qui a déjà été dessiné sur l'écran: ce sont juste les prochains objets qui seront dessinés plus loin en l'occurence. Ces fonctions affectent la matrice nommée "screen" dans Wingraph. Cette matrice définit les calculs à réaliser pour transformer les coordonnées d'un objet sur l'écran. Ainsi même si vous avez l'impression de dessiner les objets "tout droit", les opérations (rotation, déplacement, etc.) définies par la matrice screen feront qu'ils apparaîtront en fait inclinés sur l'écran. Pareil pour la matrice projection ici.
On peut donc dessiner en 2D et dessiner par plan: par exemple pour dessiner un objet plus haut on peut faire ceci:

Code PHP:
dessineFond();
moveScreen(0015);    // monte (z) de 15
dessineTruc();           // dessine le truc plus haut 
Une possibilité pour dessiner un truc différemment pourrait être d'utiliser le fait que les objets Vertex peuvent prendre 3 coordonnées. Ainsi mettons qu'on veut ériger une barrière prenant toute la largeur de l'écran, et d'une hauteur de 100, alors on pourrait écrire ceci:

Code PHP:
drawFillRect(
    
Vertex(000),
    
Vertex(screenWidth00),
    
Vertex(00100),
    
Vertex(screenWidth0100)); 
Bref avec ça on voit qu'on peut gentiment passer à la 3D sans trop de problème même en utilisant la lib. Ca pourrait encourager certains à réaliser des effets 3D, bien pratiques dans certaines situations

Dernière modification par Brunni ; 25/07/2009 à 09h09.
Brunni est déconnecté   Réponse avec citation
Vieux 05/08/2009, 13h12   #7
Monsieur J
Membre confirmé
 
Date d'inscription: 19/03/2009
Localisation: Dijon, Paris
Messages: 124
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut

Je l'ai téléchargé et regardé un peu.

Je testerai quand j'aurai un peu de temps car ces dernières semaines, je suis full de chez full.

Très intéressant l'effet 3D
Monsieur J est déconnecté   Réponse avec citation
Vieux 08/08/2009, 02h59   #8
Yodajr
Administrateur
 
Date d'inscription: 09/11/2005
Messages: 3 750
Par défaut

Arg saletés de vacances sans connexion au net, j'ai raté le lancement du topic ainsi que des explications
J'ai du faire comme avant et me passer d'msn et de google pour faire ce que je voulais
Sinon j'ai fait 2, 3 projets-conneries histoire de bidouiller avant de me lancer dans le défi, je me suis vraiment amusé (je te montrerais si tu veux).
Comme quand j'ai découvert oslib, ça fait trop du bien de pouvoir faire enfin tout ce qu'on a dans la tête sans prise de tête de convertion, nombre de couleurs, nombres de sprites, etc...

Merci Brunni
Yodajr est déconnecté   Réponse avec citation
Vieux 25/03/2010, 16h11   #9
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par défaut

ça a l'air sympa ta lib Brunni

ce serait cool une lib multi plateforme ...
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test
Arialia est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
[Projet] PatrickBoy Brunni Projets 9 23/06/2009 23h06
[PROJET] A Touch of War dem1980 [NDS] Divers 12 10/04/2006 17h05
[projet] Recherche codeur pour projet RPG thoduv [DEV] Divers 2 03/12/2005 18h46


Fuseau horaire GMT +2. Il est actuellement 08h50.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince