Je ne savais pas trop où poster ça. Vu que c'est un projet sur lequel je bosse et qu'il est presque terminé (les 3/4 du code sont bouclés et ça devrait être fini d'ici un mois), j'ai opté pour la section "projets terminés". Je m'excuse d'avance pour la publicité mensongère.
Voici donc mon projet: AGE. AGE, pour Adaptable Game Engine.
Introduction
AGE est une bibliothèque DLL écrite en C# permettant la création de toutes formes de jeux/applications multimédia. Elle utilise IrrlichtNETCP pour la vidéo, Bass.NET (pas IrrKlang, qui n'offre pas assez de possibilités) pour le son et ODE.NET pour la physique.
L'utilisation du moteur est simple : il suffit de créer une instance de la classe AGEEngine (imaginez-la comme une sorte de IrrlichtDevice, la mère de tout le reste). Ensuite, cette classe a pour principale fonction de créer des entités via les diverses méthodes AddEntity().
1- Le concept d'entité
C'est quoi donc, une entité? En fait, tout élément du monde de AGE dérive de la classe abstraite AGEEntity. L'idée est de faire en sorte que cet objet soit la SEULE chose dont vous ayez besoin pour ajouter un élément à votre jeu. Vous voulez lui faire émettre un son? Pas de problème, le moteur gérera la stéréo et le volume automatiquement en fonction de sa position relative à la caméra. Vous préférez qu'il émettre un vrombissement permanent ? Très bien, AGE s'occupe de tout: quand l'entité passera à côté de vous, le volume et la stéréo évolueront automatiquement. Oui, l'effet Doppler est géré. De la même façon, plus besoin de se prendre la tête à "lier" l'objet du moteur physique à l'objet du moteur vidéo. Une entité a un modèle 3D (ou autre chose d'ailleurs, ça peut être un skydome, une fontaine de particules, un billboard, etc...), c'est un fait, mais elle a aussi une masse, une vitesse, etc... En gros c'est un « objet » complet, comme dans le monde réel. Quand je me casse la gueule de ma chaise, il n'y a pas mon modèle 3D d'un côté, ma physique de l'autre et un informaticien derrière qui se bagarre pour lier les deux : pourquoi cela devrait-il être différent dans un moteur de jeu ?
Mais le concept d'entité va plus loin : au delà du moteur de jeu, l'entité est donc supposée être un "objet" du monde. Pourquoi alors faudrait-il stocker ailleurs les éléments qui ne relèvent pas du moteur mais du gameplay ? La classe AGEEntity contient donc une sorte de hashtable (pour ceux qui ne connaissent pas, c'est un tableau qui lie une clé -ici une string- à une valeur) baptisée Properties. Vous voulez que votre entité ait des points de vie? Ajoutez une valeur health de type integer à ses propriétés. Pour y accéder, vous n'aurez qu'à faire MyAGEEntity.Property[health]. Une propriété peut être de n'importe quel type (même une autre entité ou une autre table de propriétés, mais là bon courage), et peut aussi être un tableau.
Maintenant, si vous voulez que votre entité reste tranquille à regarder les étoiles scintiller dans la skybox au dessus de sa tête, vous pouvez le faire. Mais si vous voulez qu'elle ait un comportement un peu plus dynamique, rien de plus simple. Tout se fait via des events et des delegates. Par exemple, l'évènement OnEachFrame est appelé 10 fois par seconde. Ecrivez une petite méthode d'intelligence artificielle, et hop, en une ligne de code (MyAGEEntity.OnEachFrame += MyAIRoutine()) vous pouvez l'assigner à toutes les entités qui doivent l'utiliser. D'autres évènements seront prévus pour tout ce qui peut se produire (clic sur l'entité, collisions, proximité, etc...)
En résumé : avant, un personnage c'était un node Irrlicht + un Geom ODE + tout un machin truc pour le son + une classe en plus qui gérait son comportement. Maintenant, c'est une entité AGE.
2- Autres fonctionnalités
En plus de cela, AGE contient (pour l'instant, ça va s'alourdir avec le temps) :
- Une classe AGEInputHandler qui permet de gérer (via des événements) à peu près tous les « inputs » dont on peut avoir besoin dans une application multimédia. Cela va des classiques OnMouseMove(), OnMouseWheel() et OnKeyUp() à d'autres plus exotiques comme OnJoystickMove(), par exemple.
- Une classe AGEAudioPlayer qui permet de jouer un son/une musique (wav, ogg, mp3 ou midi) et d'altérer sa position dans l'espace mais aussi sa fréquence (par exemple pour simuler le moteur d'une voiture qui accélère). Une variation aléatoire de la fréquence peut aussi être spécifiée (pour que le son d'un flingue sonne un peu plus grave ou plus aigu d'une détonation à l'autre, par exemple).
- Un nouveau type de caméra en plus de la caméra FPS et de la caméra "targeted" : la caméra "rotating". Sa rotation est passée via un vector3d comme pour un node "normal", y compris sur l'axe Z (axe "roll"). Ceux qui se sont cassés les dents à essayer de simuler un cockpit d'avion sous Irrlicht savent de quoi je parle.
- AGE étend également les possibilités de Irrlicht en ce qui concerne les jeux 2D. Certes, Irrlicht a toujours permis de créer des jeux en 2D, mais bon, c'était pas pratique: il fallait, à chaque boucle "BeginScene() - EndScene()", redessiner tout le bordel, calculer la position modifiée par rapport à la "caméra". Il n'y avait pas d'équivalent 2D du SceneManager. Maintenant, c'est fini : une entité peut être 2D. C'est à dire qu'elle aura une taille, une texture et une position (comme un Node 3D de Irrlicht). Quand à la classe Camera2D, elle a une position et un "field of view" comme sa contrepartie 3D que vous connaissez déjà. Du coup, plus à se fatiguer à calculer les coordonées-écran de vos petits personnages de votre jeu de rôles 2D à l'ancienne, AGE le fait pour vous.
3- L'espace AGE.Library
AGE contient également, dans le namespace AGE.Library, toute une batterie de classes "gadgets" qui peuvent servir pour divers types de jeux, entre autre (il y en a beaucoup) :
- La classe AGERandom a un constructeur qui admet en paramètre une chaîne pouvant contenir toutes sorte de plages de valeurs aléatoires : rentrez "1-8" et un chiffre entre un et huit sera généré lors du tirage. Entrez "3d6+4" et la classe simulera le jet de 3 dés à 6 faces auquel 4 sera ajouté (ce qui permet, entre autre, de distribuer les résultats de façon non linéaire – selon une distribution de Gauss, pour être plus précis). Il est également possible de spécifier des valeurs "plancher" et "plafond" pour que, par exemple, le résultat de votre tirage de "2d8-4" ne soit jamais inférieur à 1.
- La classe NameGenerator permet de générer aléatoirement des noms en combinant création aléatoire de syllabes et parties "fixées". Par exemple, spécifier un prénom dans une liste de prénoms existants (fournis via un tableau de strings) et laisser le nom de famille être généré totalement aléatoirement. Ou seulement la deuxième partie du nom de famille pour un écossais dont le nom commencera forcément par "Mac". Enfin c'est juste un exemple. Ici un programme en ligne qui fait grosso modo la même chose, pour vous donner une idée.
- La classe LevelGenerator crée, d'après certains paramètres, un niveau de "donjon" (utile pour un jeu de rôle, ou pour le mode "skirmish" d'un FPS par exemple) ou une carte géographique (avec la distribution des différentes "tiles" : eau, montagnes, rochers, neige... Par exemple pour un wargame, ou les niveaux en extérieur d'un jeu de rôle). Ici un programme en ligne qui fait grosso modo la même chose, pour vous donner une idée.
- La classe AGEXMLFile permet de gérer facilement des fichiers XML pour enregistrer/lire les paramètres de jeu, ou pour permettre de créer des jeux "moddables" (si chaque unité d'un wargame est un fichier XML dans le répertoire "units", et bien le jeu gagne beaucoup en durée de vie par rapport à une version où elles seraient "hardcoddées" dans le code source, non?)
- La classe AGEEncryptedXMLFile fait la même chose, sauf que le fichier XML enregistré est crypté via un algorithme RC2. Utile pour les sauvegardes de jeu, histoire que le petit Kévin, 11 ans, ne s'amuse pas à se rajouter quelques vies vite fait. On pourrait faire la même chose en utilisant un fichier binaire pour les sauvegardes, me dites-vous? Ouais, mais là vous conservez la souplesse d'utilisation du XML.
4- Et maintenant ?
Et bien voilà... J'attends vos suggestions, vos conseils, vos critiques... Pensez-vous que tout ce projet est une bonne idée ou pas ? Qu'aimeriez vous y voir de plus ?
Tenez-moi informé, j'en ferai de même d'ici un mois environ, quand la version 0.1 de AGE sera mise en ligne. Je rechercherai alors des gens pour m'aider à écrire une API, tester tout ça à fond et m'aider à réaliser le plus vite possible une version totalement crossplatform (certains morceaux du code de la version actuelle, comme ceux utilisés pour le moment pour le son et le joystick sont windows only).
Voilà voilà. Merci d'avoir lu jusqu'ici !
Hé bé !!!
En voila un projet qui me plaît !
J'attend de pouvoir tester avec impatience !
Hors ligne
J'ai tout lu
très très bon projet.
Ca se passe comment avec ODE? Tu charges un mesh et la géométrie entière de l'objet est prise en compte? ou c'est au choix box/sphere/... ?
Seul bémol : .NET mais bon après c'est une question de goûts
Hors ligne
sympa le projet
si en plus yavais un wrapper C++ ... (je plaisante, je plaisante, .. quoi que .. )
comment ca fonctionne au niveau du frame rate ?( c a d : ya des fonctionnalités prévues pour faire du time elapsed ? )
Dernière modification par Jerry Kan (28-03-2007 20:35:03)
Hors ligne
Je te l'ai déjà dit en mail, je trouve ça très intéressant (d'autant plus que tu utilises Irrlicht .NET CP )
Seul bémol : .NET hmm mais bon après c'est une question de goûts
Question d'avenir, pas question de goût
Hors ligne
Merci pour vos commentaires... Quelques réponses en vrac et après j'y retourne.
izguit :
Ca se passe comment avec ODE? Tu charges un mesh et la géométrie entière de l'objet est prise en compte? ou c'est au choix box/sphere/... ?
Pour le moment c'est au choix, via une "enum" passée en paramètre lors de la création de l'entité. L'implémentation de ODE est ce sur quoi je bosse actuellement, donc rien de défintif pour le moment (d'autant plus que j'apprends à me servir de ODE au fur et à mesure. Contrairement à Bass et IrrlichtNETCP avec lesquels j'ai beaucoup d'expérience, je n'avais jamais utilisé une bibliothèque physique avant).
izguit :
Seul bémol : .NET mais bon après c'est une question de goûts
Jerry Kan :
si en plus yavais un wrapper C++ ... (je plaisante, je plaisante, .. quoi que .. )
Vu que mon expérience C++ se limite à la réalisation de petits mods pour Quake III et Half-Life, faudra vous contenter de .NET, les gars . Cela dit, tout cela sera bien sûr open source, alors si ça vous chante de faire une version C++, vous êtes les bienvenus!
Jerry Kan :
comment ca fonctionne au niveau du frame rate ?( c a d : ya des fonctionnalités prévues pour faire du time elapsed ? )
Je ne suis pas sûr de comprendre ta question, alors voici plusieurs réponses, choisis celle qui te convient:
1- Si tu parles de performances, on perd 1% à 5% de FPS par rapport à du IrrlichtNETCP "pur". Mais je n'ai rien optimisé pour le moment, donc au final ça sera sans doute beaucoup moins.
2- Si tu parles de synchronisation (je penses que c'est ce que tu veux dire par "time elapsed"), il y a un timer inclus dans le moteur (donc tu peux toujours voir la différence entre la valeur actuelle du timer et la dernière valeur que tu as stockée). Sinon tu peux utiliser l'évènement "OnEachFrame", qui se produit 10 fois par seconde. J'introduirai peut-être une classe "timer" comme celle du namespace System.Windows.Forms (avec une propriété "interval" et un évènement "OnTick"), c'est à voir.
En tout cas, je suis content de voir que le projet vous intéresse. Je vais sans doute mettre mon travail sur le moteur de côté quelques jours le temps de créer une ébauche de site web ou tout sera bien présenté.
Je vous tiens au courant.
Dernière modification par Agar (29-03-2007 18:46:25)
Hors ligne
Génial ! C'est un excellent projet !!
Le fait de créer une "super-entité" rassemblant graphisme, physique et son... que du bonheur. Des classes bien propres dans un environnement 100% Objet... rien à redire. Si je peux t'aider dans cette entreprise, n'hésite pas...
(Je me permettrais de te contacter par e-mail si tu n'y vois pas d'inconvénient, histoire d'en discuter plus longuement)
Hors ligne
C'est effectivement des plus intérréssant. Je ne sais pas si ce serait faisable dans ta logique actuelle mais avoir une couche réseau avec pourrait être intérréssant (qui disposerait elle aussi d'un fonctionnement souple basé sur les event) parce que celle standart de c# est un peu lourde à implémenter (thread only). Eventuellement une gui évoluée via ton système d'entity devrait aussi être faisable.
Ca permettrait de faire un belle librairie entièrement dédié au jeu.
Hors ligne
wizad :
Avoir une couche réseau avec pourrait être intérréssant (qui disposerait elle aussi d'un fonctionnement souple basé sur les event).
Oui, j'y avais déjà pensé, mais ça ne sera sans doute pas pour la première release vu que ça demandera BEAUCOUP de boulot.
Cela dit, à moyen/long terme, je crois que cela s'impose si je veux que AGE soit vraiment complet.
Hors ligne
Ca y est, le site est en ligne ici.
Il n'y a pas grand chose pour le moment, mais ça va bientôt changer, donc vous pouvez toujours le bookmarquer.
Le site est en anglais, mais une partie du forum est réservée aux discussions en français, donc les anglophobes sont les bienvenus.
Hors ligne
Cool, on va pouvoir obtenir plus d'info sur ce projet fort sympathique !
Hors ligne
Pour ma part j'ai commencé une étude perso sur la fesabilité du couche supérieur à la couche socket du framework .net pour faciliter l'accés au système réseau. Pour ce qui est de l'utilisation coté dev je m'inspire de directPlay qui était assez bien conçu par sa simplicité de prise en main. Je donnerai des nouvelles à l'occasion.
Hors ligne
Pitié Agar, donne nous des nouvelles :-)
Hors ligne
Mode flood ON
Agar!!!!!! reviens!!!!
Mode flood Off
Hors ligne
Tiens ??? site plus accessible .
Dommage , la publicité était pourtant fort sympathique ...
enfin , c'est vrai que ça date un peu tout ça .Désolé pour le remontage de topic ...
Dernière modification par ramis (04-11-2008 20:51:28)
Hors ligne
Effectivement, j'ai fait quelques recherches sans succès, mais le blog d'Agar semble toujours ouvert, si interessé tu es, un p'tit message envoyé tu peux,
et si Agar tu passe par là, nouvelles donne nous...
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 52 invités en ligne Aucun membre connecté RSS Feed |