PDA

Voir la version complète : Projet : Space Lords (Sword of the stars + Europa Universalis + mount and Blade)



Janer
20/02/2012, 13h52
Space Lords
titre non définitif

Projet officiellement lancé le Samedi 18 Fevrier 2012

Salut les Canards! Je viens présenter mon premier vrai jeu sur Unity. Après avoir fait de nombreux tests et embryons de gameplay pour apprendre, j'ai décidé de sauter le pas et de me lancer dans mon premier gros bébé. Il est encore en cours de développement. J'ai décidé d'ouvrir ce post car ce forum est convivial, plein de gens compétents et de bonne foi et je sais que ça va m'enrichir. De plus j'ai l'intention d'expliquer certains codes et de présenter ma façon de faire pour avoir des suggestions/conseils et pour ceux qui sont intéressés par les algos.

Ce sera un 4x spatial, avec économie avancée et univers dynamique, séparation carte galactique et batailles tactique à la Sword of the stars, possibilité de contrôler un vaisseau, le système d'ordre est de type "global" un peu comme dans Starfarer.

C'est un mélange de tout ce qui me plait et de tout ce que j'ai pu expérimenter dans mon apprentissage, mais sans être un joyeux bordel, tout est pensé pour être simple et épuré.

Tout aide ponctuelle est la bienvenue mais pour l'instant je n'ai besoin de rien et j'ai pas envie d'être dépendant.

Objectifs:
Apprendre, m’enrichir, m'amuser, vivre une expérience.

Ma philosophie est simple : j'ai choisi Unity, car on peut avoir des résultats très vite pour garder le moral. Mon concept de départ est aussi pensé ainsi. Un jeu dans l'espace = pas trop dur pour les animations, par trop de modélisation d’environnement, pas trop dur de faire un truc joli. De plus, je vais créer un jeu modulaire, c'est à dire que je n'aurais pas à attendre 6 mois pour avoir un truc jouable correctement, j'aurais d'abord un petit module de combat, puis j'y rajouterais des features, puis un module stratégique basique, je travaillerais l'aspect éco, puis militaire, puis diplomatie... les type d'algo que j'ai choisi (plutôt POO), mon style de programmation va aller dans ce sens, exemple, une fonction GetPlanetIncome() au départ renverra pop*10 pour des soucis de facilité, mais plus tard je pourrais l'étoffer. Ceci est fait dans le but de ne pas me perdre dans un fouillis monstrueux.

Feuille de route

Module de combat 70%

vaisseaux et ia individuelle (agents et pathfinding)
-physique des vaisseaux basique FAIT
-pathfinding basique 99%
-script de tourelle (tourelle, canon, rayon, lance missile) 99%
-gestion des dégats 95%
-ia de groupe, organise les vaisseaux. 95% (globalement mis en place mais pas définitf et plein de trucs à tester)

-IA de l'adversaire 15% (fonctionnelle mais bête : elle joue en "mirroir" du joueur)

-Interface 15% (fonctionnelle pour donner des ordres basiques mais c'est tout pour le moment)

Base de donnée, graphismes, histoire... A FAIRE


Module Stratégique
n/a

Carnets de développement
a venir : pathfinding basique

beuargh
21/02/2012, 17h05
J'ai décidé d'ouvrir ce post car ce forum est convivial, plein de gens compétents et de bonne foi et je sais que ça va m'enrichir.

:O

Bonne chance, comme on dit. Je serais intéressé à voir l'avancée de ton projet :)

Pour la physique des vaisseaux, t'es parti sur du newtonien ou un truc bien plus simple et moins réaliste ?

Janer
21/02/2012, 18h41
Je suis pas ironique, y'a peu de trolls sur le forum. Y'en a des susceptibles mais il suffit de dissiper tout malentendu.

Pour la physique, c'est basé sur PhysX de Nvidia, donc normalement Newtonien, mais je l'ai bridé :

Newtonien pour la propulsion et la réaction aux chocs (avec inertie, forces...), avec un stabilisateur irréaliste qui annule progressivement les forces non désirées (pour éviter que l'inertie ne face dériver constamment le vaisseau sans qu'il puisse se stabiliser). Quand aux rotations elles suivent également ce principe. En fait c'est comme si un moteur imaginaire en plus du vrai moteur se placé là où ça m'arrange et exerçait une petite poussée.

Pour ceux qui utilisent unity, ça veut dire rigidbody.AddForce() pour les translations avec un drag artificiel sur le rigidbody mais Lerp sur la rotation.

EDIT : MAJ :
J'ai amélioré le pathfinding mais j'ai pas encore trouvé le compromis entre performance et qualité du pathfinding. J'essaye d'optimiser tout ça, je peux afficher 150 vaisseaux sans lags, mais pour l'instant ils sont basiques, il n'y a pas de tourelles et d'ailleurs je sais même pas comment concevoir les tourelles et armes de manière économes en ressources système.

Sinon j'ai aussi avancé sur l'ia des groupes, ça marche mais en même temps elle pas encore beaucoup de choses à gérer...

Don Moahskarton
21/02/2012, 20h10
Pour moi Newtonien ça s'oppose a relativiste... *grattgratt*

Qu'entends tu blurg par "bien plus simple" ?


Et sinon, Unity ça gère physX en natif ?

Janer
21/02/2012, 21h08
Et sinon, Unity ça gère physX en natif ?

Oui tout à fait.

FB74
21/02/2012, 21h24
Tu es tout seul sur ton projet ?

Janer
21/02/2012, 21h39
Je suis seul en effet, pas envie d'être dépendant, juste de m'amuser. Le projet est pensé pour. Sinon j'aurais fait un mmostr :p

EDIT : Alors ce soir je boss sur les tourelles, et si je suis pas trop fatigué après je m'amuse un peu et je modélise des vaisseaux.

beuargh
22/02/2012, 09h41
Pour moi Newtonien ça s'oppose a relativiste... *grattgratt*
Qu'entends tu blurg par "bien plus simple" ?


Non, Newtonien ne s'oppose pas à relativiste :)

Par bien plus simple, je pensais à un moteur limitant l'inertie par un truc un peu plus arcade.

Janer
23/02/2012, 18h47
Mise à jour, tourelles faites, reste la gestion des dégats et les adversaires et j'aurais un moteur de combat opérationnel.

Janer
25/02/2012, 20h30
MAJ : moteur de combat fonctionnel. Démo ce soir j'espère :)

beuargh
26/02/2012, 00h44
Impatient de voir ça à l'oeuvre !

Janer
26/02/2012, 01h43
Je prend du retard là je suis pas productif :p

Janer
26/02/2012, 12h22
Alors voici quelques screens, combat, lasers explosion et pathfinding. Par contre c'est moche pour l'instant mais c'est normal ce sont juste des placeholders.

http://tof.canardpc.com/preview2/5bed5844-7222-485c-a165-999f59d09428.jpg (http://tof.canardpc.com/view/5bed5844-7222-485c-a165-999f59d09428.jpg)

http://tof.canardpc.com/preview2/2c1be6b1-61b8-4836-9b0a-8c9a95739d7e.jpg (http://tof.canardpc.com/view/2c1be6b1-61b8-4836-9b0a-8c9a95739d7e.jpg)

http://tof.canardpc.com/preview2/ded9cc22-d0eb-4e3d-8641-0e72cc90b735.jpg (http://tof.canardpc.com/view/ded9cc22-d0eb-4e3d-8641-0e72cc90b735.jpg)

http://tof.canardpc.com/preview2/b0966e29-2901-4555-b074-675056d3f278.jpg (http://tof.canardpc.com/view/b0966e29-2901-4555-b074-675056d3f278.jpg)

http://tof.canardpc.com/preview2/05602e90-fae1-414b-bf9e-fcbffd593e23.jpg (http://tof.canardpc.com/view/05602e90-fae1-414b-bf9e-fcbffd593e23.jpg)

http://tof.canardpc.com/preview2/14dd0e2e-6284-4531-849f-b8882a79e856.jpg (http://tof.canardpc.com/view/14dd0e2e-6284-4531-849f-b8882a79e856.jpg)

beuargh
26/02/2012, 19h25
Coool :) N'hésite pas à monter des démos sur le web une fois que t'auras un truc qui bouge ^^

T'as un système de localisation de dégâts, genre on peu viser les moteurs, tourelles, etc ?

Janer
26/02/2012, 19h43
Les moteurs pas encore, les tourelles c'est à implémenter à peu près encore.

J'hésite à faire un truc plus "procédural" mais c'est hard. Je vais voir.

Janer
27/02/2012, 00h51
Alors, il se trouve que j'ai un problème, j'arrive pas à faire les graphismes. Je me demande, quel logiciel utiliser? Et puis comment texturer ensuite?

Quelqu'un qu'y s'y connait peut me donner son workflow de A à Z?

war-p
27/02/2012, 00h54
-Tu utilises quoi pour gérer la 3D?(SDL?Ogre?...)
-Pour faire les modèles utilise un logiciel genre blender, avec lequelle tu exportes vers un format que peut lire ton wrapper.
-Dans ton code t'as plus qu'à charger le modèle 3d et ça passes pépère...

EDIT : Whoops, j'avais pas vu que tu utilises unity, il faut que tu exportes vers un format que peut lire unity (il faut que tu te renseignes).

Janer
27/02/2012, 01h06
Ouai c'est pas ça le problème pour exporter/importer ok. Mais je suis pas du tout un artiste, donc j'ai pas l'habitude, j'ai Maya sur mon ordi et je peux avoir accès à mudbox.

C'est juste que je sais pas quel est la meilleur méthode pour créer un model, le shader, le faire où? Sur maya, mudbox ou unity? Comment faire la texture? Peindre directement sur le modèle, ou sur l'UV avec photoshop? Comment modeler proprement?

J'aimerais que quelqu'un qui pratique me donne sa méthode détaillée du début à la fin pour avoir quelque chose de propre et de joli.

Teto
27/02/2012, 09h12
Je n'utilise pas Unity, donc je ne sais pas. Mais pour dire par rapport à ce que je connais sur CryEngine 3 :
- Le modèle se fait en dehors de CE3, soit avec Maya, XSI, 3DMax (et bientôt Blender). Toi tu as Maya, OK, pas de problème. Donc tout se fait par Maya au niveau de la modélisation -> forme, squelette éventuellement, articulations.
- Le material se fait aussi sous Maya est c'est lui qui est importé sous CE3. C'est là qu'il y a souvent des différences entre les engine, donc je peux trop rien t'affirmer pour Unity, si tu dois le faire sous Maya et ensuite tu fais tes réglages sous Unity ou si c'est 100% Maya.
- Le shader est souvent déjà présent dans l'engine, même si, la plupart du temps, on peut faire les siens.

Là où je veux en venir c'est que tu arrives à un stade où il n'y a qu'un moyen de répondre à ta question : te plonger dans les guides de référence, et les tutos proposés par le site de l'engine. Je ne connais pas Unity, mais il semble qu'il y a une forte communauté et qu'elle est très sympa. Va sur le forum officiel, et zieute la partie import/export d'objets/assets/persos. Tu trouveras nécessairement ton bonheur. Maintenant, il y a sans doute des canards ici qui sauront mieux te répondre que moi.

-> Edit : Pareil pour Maya, tu trouveras sans peine d'excellents sites avec des tutos pour te faire la main. Par contre je n'en connais pas suffisamment pour t'en conseiller un. En revanche, certains sites proposent des tutos payants. Hum, franchement, je ne pense pas que ça en vaille la peine.

war-p
27/02/2012, 11h57
J'ajouterai que souvent, concernant les shader, tu ne peux pas les exporter directement, mais tu dois les réécrire dans le langage supporté par ton moteur (Regarde du côté de GLSL pour OpenGL et HLSL pour directX...)

Janer
27/02/2012, 12h12
D'accord, je vais fouiller alors. Merci.

beuargh
27/02/2012, 14h28
A savoir que tu peux aussi acheter des modèles déjà faits, genre sur Turbosquid (http://www.turbosquid.com/). (Genre là pour les vaisseaux spatiaux. (http://www.turbosquid.com/Search/3D-Models/Spacecraft))Ca peut coûter cher, cela dit en passant. Sinon, t'as des modèles gratos, mais c'est généralement moche.

Janer
27/02/2012, 15h33
Ouai mais pour avoir un design particulier et un univers cohérent ça le fait pas... autant embaucher un artiste quitte à payer. Mais merci. En tout cas on s'improvise pas 3D artiste comme ça... même si des vaisseux spatiaux inanimés c'est relativement "facile" à faire.

beuargh
27/02/2012, 16h20
Ouai mais pour avoir un design particulier et un univers cohérent ça le fait pas... autant embaucher un artiste quitte à payer. Mais merci. En tout cas on s'improvise pas 3D artiste comme ça... même si des vaisseux spatiaux inanimés c'est relativement "facile" à faire.

Dieu que je te comprends. Je suis une quiche dans tout ce qui est artistique, c'est violent. Et la 3D, faut vraiment bien toucher pour faire quelque chose de correct sans perdre deux mois par modèle.

En tout cas, j'ai un profond respect pour les gars qui touchent à l'artistique en général, la 3D en particulier.

Janer
27/02/2012, 21h12
Moi mes models sont jolis et tout, j'ai bien avancé. Mais mon gros problème c'est le texturing bordel de merde!!! C'est quoi la meilleur méthode avec maya? J'ai trouvé aucun tuto correct sur ça, tous les autres tutos donnent des conseils mais aucun ne s'adresse aux débutants nuls comme moi.

beuargh
27/02/2012, 21h37
Après cette série de tutos, tu pourras postuler chez Pixar. Ou pas. http://www.siteduzero.com/tutoriel-3-228998-apprenez-a-modeliser-en-3d-avec-autodesk-maya.html

Janer
27/02/2012, 21h40
Trop tard :p Déjà tout fait en long, en large et en travers. Voilà pourquoi j'arrive à modeler. Mais c'est pas assez détaillé ni précis pour le texturing.

Teto
27/02/2012, 23h46
T'as essayé en tapant "texturing maya tutorial" dans google (section vidéo) ? J'ai fait ça pour Blender et cela m'a permis de savoir enfin comment faire, comment faire l'UV mappings, les coutures, ce genre de choses.

Janer
28/02/2012, 12h29
Là j'aivais trouvé des trucs qui m'avaient l'air complet, trop d'ailleurs, voilà pourquoi j'aurais voulu trouver un tuto texte pour trouver EXACTEMENT ce que je veux. Nan mais vous inquiétez pas ça existe et je vais bien trouver.

Janer
11/03/2012, 22h59
J'ai pas beaucoup avancé après cette semaine de rush initial. J'ai fait beaucoup en très peu de temps, durant ma semaine de vacance. Les bases de mon moteur sont déjà posées, mais j'ai le bac blanc qui arrive, je me contente d'optimiser, améliorer les choses et de commencer à concevoir une ia plus performante. Quand j'aurais une base bien clean, j'espère l'avoir avant les vacances de pâques, je vais rusher les graphismes et peut être sortir une démo. Voilà :)

Hideo
15/03/2012, 01h00
En terminale tu codes un truc pareil ? :o

Janer
15/03/2012, 19h48
Quand on dit que Unity est simple c'est un euphémisme! Tout mon travail est maché, je peux quas-directement m'attaquer au gameplay! (Enfin j'exagère, j'ai quand même passé pas mal de temps à créer un système de combat, mais ça reste simple.)

EDIT : ceci dit c'est le genre de remarque qui fait plaisir à l'égo B)

Janer
17/03/2012, 21h52
Ce Samedi je me prends un pause et j'en profite pour bosser sur Space Lords.

Alors ajourd'hui j'ai :

amélioré le pathfinding, optimisé encore plus le tout. (60 vaisseaux contre 60 facile, avec des graphismes rudimentaires (des cubes et des cercles) et ma config de 2/3 ans (mais haut de gamme y'a 2/3 ans). Mais bon, dans tous les cas je peux pas vraiment optimiser les graphismes dans le code, donc je me concentre sur l'utilisation du processeur.)

J'ai été bloqué par un sale bug du moteur de jeu que je ne pige absolument pas, ça s'est calmé mais sur le long terme va me falloir une solution. Ici si vous voulez m'aider : http://answers.unity3d.com/questions/228590/my-projectils-are-randomly-destroyed.html

J'y ai donc passé pas mal de temps et j'ai pas pu bosser sur le cosmétique.

Il me faut améliorer le système de dégat, l'IA adverse. J'ai déjà fait le gros de la prog du module en tout cas. Ça donne de jolis ballets de cubes tirant des lasers rouges moches, tournoyant les uns autour des autres (la plupart des vaisseaux que j'ai testé ont pour angle de tir optimal le tir sur le côté, comme des bateaux pré-industriels, genre XVIIIème sauf les chasseur qui ont des canons à l'avant, ils sont toujours en train de se repositionner en tournant autour de leur cible, ça fait un bordel que j'aime bien) mais en imaginant à la place des beaux vaisseaux HD tirant des particules magnifiques ça rend déjà pas mal.

J'ai aussi conceptualisé l'algo stratégique. Je pioche des idées de CKII, Victoria II, EUIII, Total War, Civilisation, SOTS... et j'épure le tout, simplifie là où il le faut. Encore pas mal de trucs à voir.

Là où j'ai vraiment peur ça reste comme toujours les graphismes, je suis nul en texturing, et je me suis pas non plus trop lancé dans le background et le design. (Mais j'ai déjà les grandes lignes).

Bref, j'ai pas mal avancé, pas autant que j'aurais voulu, étant donné que la semaine prochain j'aurais pas le temps (bac blanc) mais ça me fait une jolie base.

Janer
19/03/2012, 19h30
Je triche un peu, je suis pas censé être sur mon jeu là mais j'ai passé une petite heure à écrire un bon système de visée, de dégat et à améliorer le système physique.

J'aimerais avoir un graphiste mais je suis pas prêt à payer, en tout cas pas maintenant (par contre si je décide de vendre le jeu c'est CLAIR qu'il sera rémunéré :p)

Thufir Hawat
17/04/2012, 15h38
Des nouvelles ? :)

Janer
18/04/2012, 00h36
Je suis mon planning. Y'avais mon bac blanc juste avant^^ Les vacances sont dans une semaine donc je pourrais réavancer vite. Toujours les même problème pour les graphismes. Voilà :)

Janer
26/04/2012, 14h45
Alors, je suis toujours dans mon planning, j'ai eu de bonnes note au bac blanc, donc j'ai pas trop besoin de bachoter. Mon planning : je code le matin, je travaille en début d'aprem, je recode en fin d'aprem et je profite de ma soirée. J'ai 10 jours pleins environ pour profiter.

Quand j'ai du temps libre j'avance assez vite.

Pour faire un bilan j'ai quasiment fini la parti code du module de combat.

Il reste deux gros morceaux : l'IA de l'adversaire (pas le pathfinding et tout, ça c'est bon)
l'éditeur de vaisseaux.

Après tout n'est qu'optimisation. MAIS mon soucis majeur reste le même et j'ai toujours pas trouvé de solution : les graphismes. Je pense payer un graphiste. Je suis en négociation avec mon père pour le fric. L'idéal pour moi serait de trouver quelqu'un de compétent qui accepterait de travailler pour des royalties :p. Bref je rêve. Mais au pire ça devrait pas me couter cher, les vaisseaux c'est sympa à modéliser. D'ailleur là où je pèche c'est au niveau 2D, texture exct... Peut être solution intermédiaire? Je paye un 2D artiste texturer? On verra. Autant se concentrer sur le code et faire se battre mes cubes de l'espace!

EDIT : pour pas vous laisser comme ça, des infos sur le système de combat.

Chaque vaisseau est constitué de modules qu'on fixe les uns les autres. J'ai choisi des points fixe pour les placer. C'est plus simple et ça permet d'éviter les abus tout en laissant un grande liberté. Parmi les modules crées pour l'instant : des tourelles et des bouts de coque.

Les tourelles sont de trois type :

tourelles à projectile :
Peut balancer un projectile métalliques ou énergétique dans une direction donnée. Les dégats sont fonctions de la masse du projectile ET/OU de son "énergie"

tourelles à rayon :
Un laser type rayon, hyper précis car instantané. Les dégâts sont différents, il faut un contact prolongé qui augmente la température du composant visé jusqu'à le bousiller.

tourelle lance-missile :
Balance un missile qui provoque une explosion. Les dégats sont bien plus imputables à l'explosion qu'à la vélocité du missile bien sûr.

Calcul des dégats :
D'abord le bouclier, quasi insensible aux missiles, costaud contre la masse mais vulnérable à l'énergie.
Il peut supporter une certaine quantité de joules avant de lâcher. Il se régénère plus ou moins vite.

Ensuite l'armure, hyper sensible aux missiles, vulnérable à la masse mais costaud contre l'énergie.
En fonction du rapport du potentiel de dégâts du projectile et de la résistance de l'armure, il y a une certaine chance de percer et donc de bousiller le vaisseau.


Rentrent en compte également :
-La maniabilité, des vaisseaux rapides et agiles sont très dur à toucher, un vrai cauchemar.
-la précision et la maniabilité des tourelles, pour être plus réactif et précis aussi.
-le style du vaisseau, du petit chasseur mono tourelle qui vire-volte au gros croiseur super armé et super blindé.

Janer
28/04/2012, 21h14
Là je suis en train de me casser les dents sur des fichier XML, c'est pour enregistrer les vaisseaux crées avec l'éditeur. C'est la première fois que je fais ça. J'ai fini la lecture, je vais commencer l'écriture... Je pense que je vais en chier quand il va falloir créer un système de sauvegarde :p

Teto
28/04/2012, 21h43
D'autnt que ce genre de choses, en général, faut y penser dès le départ, sinon c'est l'enfer. J'ai testé pour vous...

Janer
28/04/2012, 22h05
Pour l'instant j'ai pas en m'en soucier. Les batailles n'étant pas prévu pour durer trop longtemps, je ne prévois pas de sauvegarde en plein milieu, seulement en mode stratégique. Et ça j'ai pas encore commencé!

Teto
28/04/2012, 22h52
Oki ! :p

Hideo
29/04/2012, 22h57
Quand je pense que moi j'arrive a peine à trouver le temps de réviser mon bac *give me five bro*.

En plus je commence une école d'info l'année prochaine, va falloir que je me mette a niveau ! Enfin bonne chance pour ton projet, qui a l'air déjà bien avancé. Tant que tu as ton bac fais toi plaise ! :)

Janer
30/04/2012, 14h02
Mais oui t'inquiète pas §§

Janer
01/05/2012, 18h49
Ah mais quel cauchemar cet éditer de vaisseaux! Mon code est dégueulasse, je compte même plus les heures passé sur ce truc... le soulagement quand j'aurais fini... puis le soupir quand je vais devoir nettoyer et commenter tout ça :p!

Janer
01/05/2012, 22h13
Je suis rendu super loin et je suis content du résultat! Par contre, je cherche un moyen de vérifier que le créateur 'n'abuse' pas de l'éditeur. (En superposant des parties par exemple). C'est chaud.

Après je galère sur la sauvegarde mais j'ai trouvé un algorithme ok.

---------- Post added at 19h13 ---------- Previous post was at 18h44 ----------

Quelques screens, quoi que peu de mes résultats sont visible, sachant que niveau art et assets je reste au point mort. :( Avec aussi beaucoup d'Aliaising.

http://tof.canardpc.com/preview2/658b9e00-66ac-4eb7-a5ab-c930a995f713.jpg (http://tof.canardpc.com/view/658b9e00-66ac-4eb7-a5ab-c930a995f713.jpg)

http://tof.canardpc.com/preview2/772d53b7-e134-425f-bbb9-b14168f4205f.jpg (http://tof.canardpc.com/view/772d53b7-e134-425f-bbb9-b14168f4205f.jpg)

http://tof.canardpc.com/preview2/cb1478a7-7d28-40bf-b3f8-061fd23604c1.jpg (http://tof.canardpc.com/view/cb1478a7-7d28-40bf-b3f8-061fd23604c1.jpg)

Janer
02/05/2012, 15h06
J'étais en train de réfléchir à un truc et j'ai une question.

Mon système de vaisseau fonctionne ainsi : chacun a un module de base "commandX", sur lequel est attaché d'autres modules, ses "enfants" (ici tous des "hullTest") qui eux même peuvent avoir des enfants, formant un arbre.

Quel technique utiliser pour sauvegarder cet arbre dans un fichier XML?

Pour l'instant je rajoute le vaisseau à la fin du fichier, en élément <vaisseau3></vaisseau3>, je lui rajoute un enfant qui correspond au premier module <commandTest></commandTest> et là je bloque sur comment itérer dans l'arbre.

Je prend d'abord la liste des enfants du commandTest, et je peux les rajouter, là c'est facile. Mais après?

Pour les enfants des enfants? Commencer par le "premier"? Comment remonter? En fait une grosse difficultée vient du fait que plusieurs modules ont le même nom "hullTest" donc pour remonter je peux pas juste dire aller au noeud "hullTest" parce qu'il y en a plusieurs...

Et puis j'ai du mal à imaginer les boucles à utiliser.

Je sais c'est vague mais je vois pas trop comment être plus précis...

Tomaka17
02/05/2012, 17h07
Je comprends pas trop ton problème


<vaisseau3>
<commandTest>
<hullTest>
<hullTestEnfant>
<hullTestEnfantEnfant />
<hullTestEnfantEnfant />
</hullTestEnfant>
<hullTestEnfant />
</hullTest>
<hullTest>
<hullTestEnfant />
<hullTestEnfant />
</hullTest>
</commandTest>
</vaisseau3>

Janer
02/05/2012, 19h17
Ouai ok, ça j'en ai déjà fait manuellement et j'arrive à les lire pour générer des vaisseaux et tout.

Mais là où je galère c'est pour le générer automatiquement à partir du vaisseau. Mais je crois voir le bout du tunnel. En fait c'est dur à expliquer comme ça, en gros je dispose des bibliothèques .NET sur le XML, et pour les modules des vaisseaux j'ai accés à des méthodes qui me donnent les parents et les enfants, mais je visionne très mal la boucle en fait... j'ai déjà jeté une dizaine de papiers :p

Tomaka17
02/05/2012, 19h59
Il faut pas faire un gros "for" qui traite tout, mais utiliser la récursivité
Tu écris une fonction "transformerEnXML(ComposantVaisseau&);" qui va écrire "<hullTest>", puis s'appeler elle-même pour chaque enfant du composant, puis écrire "</hullTest>"

Janer
02/05/2012, 20h27
Le temps que tu me réponde j'ai réussis en utilisant ce code :


function Save(prefabName:String, prefab:GameObject)
{

if(XMLFile != null)
{
//crée un document XML et charge dessus le fichier de sauvegarde
var document:XmlDocument = new XmlDocument();
document.Load(XMLFile);

//Variables correspondant aux noeuds "racines"
var root:XmlNode = document.GetElementsByTagName('prefab')[0];
var newSpaceShip:XmlNode;

//recherche du vaisseau à sauvegarder s'il existe pour "écraser" le noeud du vaisseau dans ce cas
var i:int = 0;
for(i=0; i < root.ChildNodes.Count ; i++)
{

if(root.ChildNodes[i].Name == prefabName)
{
newSpaceShip = root.ChildNodes[i];//positionner la noeud racine sur ce noeud s'il est trouvé
}

}

//s'il existe effacer le contenu précédent
if(newSpaceShip != null)
{
newSpaceShip.RemoveAll();
}
//sinon, créer un nouveau noeud à la fin du document
else
{
newSpaceShip = document.CreateElement(prefabName);
root.AppendChild(newSpaceShip);
}

//commencer par ajouter le composant de base
newSpaceShip.AppendChild(document.CreateElement(pa th[0].name));

//définir les variables,
//triplé correspondant respectivement : au noeud auquel on va éventuellement rajouter des enfants
//à la partie dont on étudie les enfants
//à la liste des joints possible de cette partie
var actualNode:XmlNode = newSpaceShip.ChildNodes[0];
var actualPart:GameObject = prefab;
var actualJointList:PartJoint[] = actualPart.GetComponent(Part).jointList;

//varibales de maintenance de la boucle
var j:int = 0;
var done:boolean = false;

while(!done)
{
//on compte le nombre de noeud déjà enregistrés
j = actualNode.ChildNodes.Count;
if(actualJointList.length >= j+1)//est-ce qu'il existe d'autre joint non étudiés?
{
//Si oui, est-ce qu'un module y est accroché
if(actualJointList[j].isUsed == true)
{
//Oui? Alors enregistrer ce module et l'étudier à la prochaine boucle
actualNode.AppendChild(document.CreateElement(actu alJointList[j].part.gameObject.name));
actualNode = actualNode.ChildNodes[j];
actualPart = actualJointList[j].part.gameObject;
actualJointList = actualPart.GetComponent(Part).jointList;
}
else
{
//Non? Alors enregistrer un élément vide
actualNode.AppendChild(document.CreateElement('voi d'));
}

}
else
{
//Non? Est-on alors à la racine des composants?
if(actualPart.transform.parent.parent == null)
{
//Oui? Alors c'est bon.
done = true;
}
else
{
//Non? Retourner au parent pour éventuellement étudier les autres enfants.
actualNode = actualNode.ParentNode;
actualPart = actualPart.transform.parent.gameObject;
actualJointList = actualPart.GetComponent(Part).jointList;
}
}
}


//Enregistrer le document XML dans le fichier.
document.Save(XMLFile);

}


Je pense que en effet j'ai utilisé une sorte de récursivité.

PS : vous moquez pas de mon style pour coder :sad:

EDIT : elle est ignoble la mise en page sur le forum, personne pourra déchiffrer mon code :p

war-p
02/05/2012, 20h35
Non, la récursivité, c'est en fait la construction d'une pile par appel successif d'une même fonction (en fait elle s'appelle elle même tant que le point d'arrêt n'est pas atteint). On s'en sert notamment pour parcourir les fichiers contenus dans des dossiers et des sous dossiers ;)

Janer
02/05/2012, 20h40
D'accord je vois.

Ça peut être utile pour la suite. Question, un lien pour apprendre ce genre de technique? Ça fait partie des trucs de base non, comme parcourir un tableau avec un for?

Genre des liens sur la théorie en algo. J'ai trouvé plein de trucs intéressant déjà pour l'IA, le Pathfinding, les algos de backtrack, la génération procédurale...

Ou bien faut que je vois au cas pour cas?

Tomaka17
02/05/2012, 20h54
Quand tu codes une fonction factorielle tu peux le faire comme ça :

int factorielle(int valeur) {
if (valeur == 0) return 1;
return factorielle(valeur - 1) * valeur;
}

Avec ton truc, même principe (j'ai jamais codé dans ton langage, je sais même pas lequel c'est, donc la syntaxe est approximative)

function Save(xml:String, prefab:GameObject) {
xml += '<hullTest>';
for (int i = 0; i < prefab.childNodes.length; ++i)
Save(xml, prefab.childNodes[i]);
xml += '</hullTest>';
return xml;
}

EDIT : grillé

---------- Post added at 19h54 ---------- Previous post was at 19h43 ----------


Ça peut être utile pour la suite. Question, un lien pour apprendre ce genre de technique? Ça fait partie des trucs de base non, comme parcourir un tableau avec un for?

Ce "genre de technique" c'est de la programmation générale, donc il y a peu de chances que tu tombes sur des articles sur ça
Personnellement en première année de fac les mecs nous ont rabattu les oreilles avec la récursivité (d'ailleurs là c'est un cas où c'est bien visible, il y a des cas où tu peux l'utiliser et t'y penses pas)

Tu peux jeter un coup d'oeil aux "design patterns" (cf. wikipedia) mais c'est plus pour s'inspirer qu'autre chose. C'est juste des solutions élégantes à des problèmes précis, si tu n'as pas de problème il faut pas se sentir obligé de les utiliser.

Après t'as la RAII (mais c'est spécifique au C++), les itérateurs
Si t'as envie de toucher au "C++ hardcore" (même si c'est pas vraiment hardcore) t'as le CRTP et le SFINAE
Après il y a pas non plus 36000 techniques de programmation générale

Janer
02/05/2012, 21h00
D'accord merci des conseils. C'est quand même 100 fois plus compact que ce que j'ai fait. (j'ai tendance à faire des usines à gaz. Sauf sur les fonctions qui sont amenés à être appelée chaque frames de jeu, là je m'applique pour que ça reste fluide.)

war-p
02/05/2012, 21h12
Ahh la première année de fac avec les assiettes vietnamienne (ou thai je sais plus...), bref, de manière générale tu peux transformer la plupart des boucles en fonction récursive, ça présente son lot d'intérêt, c'est notamment assez optimisé, après, l'algo peut se révéler vite complexe, et la plupart du temps un simple boucle for/dowhile/while suffit. Mais, bon, savoir quand l'utiliser relève de l'expérience. Sinon, oui ça marche très bien pour le pathfinding, et de manière générale, ça marche très bien dès que tu as des graphs. (Qui a dit que l'arborescence de fichiers fonctionnait comme le pathfinding...:))

Sahnvour
02/05/2012, 23h02
Mais on apprend aussi (normalement :p) que la récursivité est à utiliser avec parcimonie car souvent moins efficace qu'une solution itérative (bien pensée) ! ;)

Teto
02/05/2012, 23h15
Mais surtout plus gourmande en temps d'exécution. Quand j'utilisais java c'était bien spécifié, la récursivité c'est super-élégant mais aussi super-lent. Ce n'est peut-être pas valable pour tous les langages, par contre, mais je ne suis pas calé pour être affirmatif.
Ce que je sais :
1°) Opérations chaînées normales : A -> B -> C. Le programme calcule A, utilise le résultat pour calculer B, utilise le résultat pour calculer C. Facile. C'est le cas d'une boucle for standard.
2°) Opération récursive : Le prog alloue des ressources pour calculer A, mais doit attendre le résultat de B pour calculer. Ce résultat de B attend également le résultat de C. Les langages en général n'aiment pas ça, car cela siginifie en clair qu'à chaque opération le prog doit créer des instances nouvelles de chaque variable que tu utilises, ce qui prends énormément de temps (et de mémoire).

En gros tu peux voir que pour 1°) un nombre X de ressources est nécessaire pour l'opération. dans 2°) c'est (en gros) X*3 plus de ressources nécessaires. Donc pour moi, qu'on me corrige si j'ai tort, la récursivité n'est pas conseillé si tu veux être rapide et si tes ressources sont limitées. Sinon c'est très élégant. :)

Tomaka17
02/05/2012, 23h45
es langages en général n'aiment pas ça, car cela siginifie en clair qu'à chaque opération le prog doit créer des instances nouvelles de chaque variable que tu utilises, ce qui prends énormément de temps (et de mémoire).

Ouai enfin ça c'est en Java
Dans les langages normaux ça va sur la stack, et si c'est juste des variables de base le coût d'une allocation mémoire c'est une simple soustraction

Je sais pas pour ce qui est de Java mais en C++ c'est vraiment du gros gros enculage de mouche
À ce moment là on peut aussi dire que la boucle for va avoir moins de succès au branch-prediction que si tu fais de la récursivité

Je pense qu'il vaut mieux avoir un truc simple et garanti sans bug qu'un truc super compliqué pour un gain de performance incertain

war-p
03/05/2012, 00h01
En java, il me semblait pourtant avoir gagné un peu en perf... Mais, ça reste vraiment de la sodomie de droso...

Janer
03/05/2012, 03h56
Ba moi je me suis déjà fait mon truc avant de voir la méthode de récursivité. Le résultat me semble rapide mais c'était chiant à faire, si c'était à refaire je passerais sur la récursivité.

Janer
05/08/2012, 02h19
Salut tout le monde. Juste pour vous dire que mon projet est mis en pause. J'ai pas eu le temps de faire grand chose durant les vacances contrairement à ce que je voulais. J'ai un peu poli le truc, j'ai appris à faire un peu de 3D, une ébauche d'IA, grandement amélioré et optimisé ma physique (qu'elle soit plus en harmonie avec Physix intégré à Unity), le moteur de combat adapté à l'architecture modulaire des vaisseaux, mais même le moteur de combat est loin d'être fini.

A la rentrée je vais en prépa HEC, je vais pas avoir trop de temps. Mais peut être un jour...

Merci à tous pour votre aide.