See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [tutorial] Posez vos question sur les DLL C++ (no 2)  (Read 69456 times)

0 Members and 1 Guest are viewing this topic.

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #25 - 19 May 2008, 18:37:15
Quote
Papyref a écrit:
Merci,

C'est bien ce que j'avais essayé mais j'ai dû me planter dans la syntaxe.
Je reprendrai ça demain parceque ma femme me harcèle :)

:sage: Papyref

Si tu as un soucis, envois moi le code, j'y jetterai un oeil ;)



Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #26 - 19 May 2008, 18:57:07
Quote
Gat3rZ a écrit:
Au lieu de dire des bétises,
J'ai fais un système de refuel et je voudrais savoir la technique pour rendre ce type de système fps indépendant car
comme tous ce qui est dans la fonction clbkPostStep la vitesse dépend du fps...
Ça dépend beaucoup de ton système justement... mais quelques SetPropellantMass() conditionnés ne tueront pas
ton fps tout de même.
Evidemment, il vaut mieux sortir tout ce qu'il est possible du PostStep, j'essaie à mon niveau mais je ne pense pas
être en mesure de pouvoir vraiment t'aider là dessus...
Le PostStep du CTV est assez chargé après tout et le fps reste vraiment correct.


------------

no matter.

Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #27 - 19 May 2008, 19:09:09
C'est pas un problème de lag, le problème c'est que la vitesse de refuel dépend des fps (et on voit bien la diférence)
je cherche un moyen pour que la vitesse de refuel soit constante malgré les fps.



Message modifié ( 19-05-2008 19:09 )


Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #28 - 19 May 2008, 19:12:20
Tu ne peux rien y faire .... c'est ta machine qui décide ;) Et puis si tu veux du fps, ne code pas alors :) ... et puis bon,
contente toi d'optimiser le mesh de ton addon, pour ce qui est du code à proprement parler, tu optimiseras en temps
et en heure ...



Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #29 - 19 May 2008, 19:34:41
Quote
C'est pas un problème de lag, le problème c'est que la vitesse de refuel dépend des fps (et on voit bien la
diférence) je cherche un moyen pour que la vitesse de refuel soit constante malgré les fps.
Ok, j'avais répondu à coté.
Tu peux récupérer le FPS avec oapiGetFrameRate() et peut-être compenser en fonction du résultat.


------------

no matter.

Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #30 - 19 May 2008, 19:39:52
Ok merci je vais éssayer de bricoler quelque chose avec sa.



Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #31 - 19 May 2008, 20:16:55
J'ai trover un truc tout bète :
   SetFuelMass(GetFuelMass()+(1/oapiGetFrameRate()))
dans clbkPostStep
Le rate 1 est diviser par le nombre de fps mais au bout d'une seconde il est remultiplier par le nombre de fps par
lequel il c'est fait diviser.
Alors a moins que le fps change plusieurs fois en 1 sec sa le stabilise.
C'est corect comme moyen?



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #32 - 19 May 2008, 20:38:11
TIMING DES EVENEMENTS EN FONCTION DU FRAMERATE

Quote
Gat3rZ a écrit:
J'ai trover un truc tout bète :
   SetFuelMass(GetFuelMass()+(1/oapiGetFrameRate()))
dans clbkPostStep

Ne prend pas le framerate qui est imprecis, ce qu'il faut c'est le temps en milliseconde ecoulé
depuis la dernière image et multiplier TOUT ce qui prend une durée (animation) par ce temps
la. (plus communément appelé "Delta time" ou DT)

Ceci va garantir l'indépendance d'événements vis à vis du framerate.

Exemple pour le fuel:

Code: [Select]
// on peut changer le facteur "*60" pour changer la vitesse de refuelling.
SetFuelMass(GetFuelMass()+(oapiGetSimStep()*60));

Même principe pour les anims.

Dan


Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #33 - 19 May 2008, 21:15:57
Ah ok ... j'avais pas vu cette fonction oapiGetSimStep et je cherchais a faire ce qu'elle fait mais je trouvais sa trop
complexe donc je me suis resou a utiliser le calcul plus haut.



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #34 - 20 May 2008, 01:30:38
Il aurais fallu chercher du coté de "performance counter" qui descend
jusqu'à la microseconde mais comme martin le fait, pas besoin.

Dan


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #35 - 20 May 2008, 16:36:51
Pour ouvrir un MFD, j'utilise oapiOpenMFD (int mode, int id) qui ouvre le MFD mode sur le MFD
défini par id (MFD_LEFT, _RIGHT ou encore  _USER1, _USER2, _USER3) .

Pour les MFD d'orbiter aucun problème:
oapiOpenMFD (MFD_COMMS, MFD_USER1); ouvre bien le MFD COM/NAV à l'emplacement USER1 que j'ai
défini.

Par contre, pour ouvrir un MFD autre que ceux d'orbiter, je n'ai pas trouvé le truc. Comme mode, on a :
MFD_NONE
MFD_ORBIT
MFD_SURFACE
MFD_MAP
MFD_HSI
MFD_LANDING
MFD_DOCKING
MFD_OPLANEALIGN
MFD_OSYNC
MFD_TRANSFER
MFD_USERTYPE
Je vois bien ce MFD_USERTYPE... mais je ne vois pas comment l'utiliser.

Est-il possible d'ouvrir un MFD autre que ceux livrés avec orbiter?
Comment?

D'avance: :wor:


------------

no matter.

Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #36 - 20 May 2008, 16:40:23
Quote
no matter a écrit:
Est-il possible d'ouvrir un MFD autre que ceux livrés avec orbiter?
Comment?

Avec le boutton "mode" a coté de power  :badlink:









Je sors ->


Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #37 - 20 May 2008, 16:47:19
Quand je veux lancer un débogage, cette m... de Visual C++ me sort le message suivant et je ne vois pas pourquoi.
Quelqu'un peut il me dire ou est l'erreur ?



Merci

:sage: Papyref


Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #38 - 20 May 2008, 16:51:43
c'est pas grave tu fait "oui" et sa roule.



Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #39 - 20 May 2008, 16:55:26
Quote
Avec le boutton "mode" a coté de power
Rah, j'aurais du m'y attendre :ptdr:

Quote
Quand je veux lancer un débogage, cette m... de Visual C++ me sort le message suivant et je ne vois pas
pourquoi. Quelqu'un peut il me dire ou est l'erreur ?
Euh...oui...c'est normal (réflexion pensive....j'avais eu çà mais en anglais si mes souvenirs sont bons...), tu peux
continuer en répondant "Oui".
Vu que tu n'as pas généré Orbiter.exe en mode debug, c'est normal. Tu ne vas pas débugger Orbiter.exe mais ta dll.



Message modifié ( 20-05-2008 16:56 )

------------

no matter.

Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #40 - 20 May 2008, 17:23:28
Même en insistant il y a des trucs qui le chagrine



Je ne vois pas ce que vient faire mon clavier Logitech dans cette affaire ?

:sage: Papyref


Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #41 - 20 May 2008, 19:01:26
Alors la .... ya quelque chose qui a merder...
Faut demander a Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #42 - 20 May 2008, 20:35:43
Quote
Papyref a écrit:
Quand je veux lancer un débogage, cette m... de Visual C++ me sort le message suivant et je ne vois pas pourquoi.
Quelqu'un peut il me dire ou est l'erreur ?
:sage: Papyref

Comme l'a dit No Matter c'est que l'executable Orbiter.exe ne contient aucune données de débug mais ta DLL
oui, donc c'est juste un message d'information il faut répondre "oui".

Quote
Papyref a écrit:
Je ne vois pas ce que vient faire mon clavier Logitech dans cette affaire ?
:sage: Papyref

En lancement debug VC++ te liste un peut toutes les DLL chargées par le programme ou le système. (Une DLL c'est exactement fait pour cela, être chargée quand un prog à besoin de certaines fonctions)
C'est tout à fait normal donc, tu dois en voir passer des dizaines: CRT, systèmes, clavier, souris, directX etc. etc.
"Aucun symbole chargé" ca veut dire que la DLL en question à été compilée en mode release
donc sans informations de debugging. (normal aussi)

A un moment tu peux voir passer ta DLL avec à coté "symbole de débogage chargé" ou un truc dans le genre.

Quand on compile en debug le code est parsemé d'informations et tourne dans
un cadre qui controle ce qui ce passe, ce qui permet l'execution pas a pas, la lecture
des variables etc etc. C'est pour cela que c'est un poil plus lent et qu'un prog ou
dll compilé en debug est plus gros.. (à cause des "symboles" de debug)

Moralité: tout baigne mais ne pas oublier de compiler en mode "release" avant de
publier un truc. Et (pour ceux qui ne connaissent pas encore) ne pas passer à coté
de l'importance du debugging, l'oublier c'est vouloir s'arracher pleins de cheveux
pour rien. Voir: "Comment debugger pas à pas sa DLL ?"
http://orbiter.dansteph.com/forum/index.php?topic=6336.msg95354#msg95354


Dan



Message modifié ( 20-05-2008 22:37 )


Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #43 - 21 May 2008, 18:13:19
Je me demande quelque chose:
J'ai remarquer que l'on pouvait séparer les fonction en plusieurs ccp, mais je voudrais aller plus loin : quand j'aurais
un projet avec beaucoup de fonction et autres, au lieu de tous mètre dans un seul .cpp, .h et autres je pourrait les regrouper dans plusieurs
fichiers selon leurs catégorie mais si dans mon projet je les regroupes dans différents dossiers, il peut y avoir des problèmes
(pertes de perf, mauvaise compilations... je ne sait quoi) ? je pense que non mais je voudrait être sur.
Je pose la question car je voudrait prendre directement des habitudes d'organisation même si je ne suit pas encore a
des projets de cette ampleur.
Et sinon si il y a des petits "truc" a savoir sur ce sujet...



Message modifié ( 21-05-2008 18:14 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #44 - 21 May 2008, 18:50:32
Du moment que vc++ retrouve ses petits, que tous les fichiers ont leur chemin valide, çà ne pose pas de problème  
j'imagine. D'ailleurs lorsque tu compiles, tu vas chercher des librairies ailleurs que dans ton répertoire de solution, des
 .h et des .lib.


------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #45 - 21 May 2008, 21:46:04
Quote
Gat3rZ a écrit:
fichiers selon leurs catégorie mais si dans mon projet je les regroupes dans différents dossiers, il peut y avoir des
problèmes (pertes de perf, mauvaise compilations... je ne sait quoi) ? je pense que non mais je voudrait être sur.
Je pose la question car je voudrait prendre directement des habitudes d'organisation même si je ne suit pas encore a
des projets de cette ampleur. Et sinon si il y a des petits "truc" a savoir sur ce sujet...

Si tu fait des fonctions "générique" qui peuvent servir dans de multiples projets je te conseil de les mettres dans des
librairies. Mais en général quand on débute ca ne sert à rien, on n'a pas assez de connaissances pour juger de la
pertinence d'une fonction pour d'autres projets ni pour les faire assez "générique". Donc on fait des libs qui ne
servent à rien. Pas adaptée, mal foutue, pas documentée (donc on ne retrouve plus les fonctions)

J'en ai eu fait mais évidemment elle ne m'ont jamais servie donc. Je n'en fais plus. Maintenant j'utilise le "copier/coller"
tout mes projets sont aux meme endroit et je fais des recherches comme expliqué dans ce tuto:
"Peu de mémoire beaucoup de méthode" http://orbiter.dansteph.com/forum/index.php?topic=6337.msg95356#msg95356

Sinon pour un même projet vaux mieu tout garder dans un seul répertoire. On peut spliter les h et cpp pour clarté de
lecture mais ca sert à rien de tout disperser sur le disque, au contraire.

Par contre le nom des sources et la manière de spliter sont eux très importantes pour tout retrouver rapidement.
donc pas de "essai21.cpp" mais plutôt "AnimationMesh.cpp"

Ici exemple d'organisation du projet DeltagliderIV (36387 lignes de code)
Le but est de tout avoir sous les yeux pour tout retrouver très rapidement.



A++

Dan



Message modifié ( 21-05-2008 21:50 )


Offline Gat3rZ

  • Sr. Member
  • ****
  • Posts: 289
  • Karma: 0
Reply #46 - 21 May 2008, 22:29:32
Exactement ce que je voulait savoir, merci.
Sinon je me suis attaquer a un gros morceaux : les panels 2D.
Je me suis un peux embrouiller dans toutes les fonction nécessaires, je reprendrais sa demain soir , mais si
quelqu'un a du temps pour me bricoler un ptit exemple pour juste faire un bouton "toggle" ce serait sympa.  Attention
je demande pas un truc près a compiler avec toute les ressources, juste les quelques lignes qui font que l'on peux
voir et appuyer sur un bouton ;) , pour le reste je me débrouille. l'exemple du shuttleA est un peux mélanger avec
d'autres choses et c'est pas très clair. Et le tuto sur les panels 2D ne l'explique pas (C'est marqué dedans vous allez
me dire).



Message modifié ( 21-05-2008 22:30 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #47 - 21 May 2008, 23:15:37
Correction commentée  - Trucs pour tout le monde

Papy m'a envoyé sont projet, je vais faire ici une correction commentée pour souligner certains points important qui
peuvent vous bloquer ou faire que les choses ne marchent pas. Donner une "méthode" et des trucs plutot que
simplement corriger est beaucoup plus utile.

Donc papy vient de s'y mettre, il a modifié sont hercule et il vole, Bravo !
Par contre sur les animations (pas évident) ca coince, tout compile nickel mais rien, pas d'animations.

Donc je commence mon boulot de détective... Un bon programmeur n'est pas celui qui fait tout marcher du premier
coup (n'existe pas) Un bon programmeur c'est avant tout un excellent detective.

Au boulot Mr Watson.

De l'importance de l'indentation

Premier coup d'oeil, le code la partie qui m'intteresse est mal indenté, ceci pose d'énorme problème de lectures.
Si il y a une erreur de "logique" dans le code il est dur de la détecter. La présentation est importante il faut la soigner.

Code mal indenté: (par exemple on a l'impression que le premier "if" ne concerne que la premiere ligne, ce genre de
fausse "impression" peu nous faire perdre des heures)



Heureusement VC++ propose des utilitaires d'indentation automatique, pas besoin de s'embeter donc. Une fois le
code tapé si il est mal indenté (ou régulièrement) tapez:

CTRL+A (selectionne tout le texte du cpp présent)
ALT+F8 (indente automatiquement le code selectionné)

Et voila, beaucoup plus clair de voir la logique, le premier "if" englobe le reste etc etc:




Comment trouver ce qui ne marche pas ?

Votre code à l'air bon, mais ca ne marche pas. Pourquoi ?
La il faut de la méthode, en regardant "en vrac" et sans organisation des bouts de code on peut passer 50 fois sur
une erreur sans la voir. La méthode consiste à "remonter" le fil logique. Exemple avec une porte qui s'ouvre:

Pour ouvrir une porte il faut une main qui actionne la poignée, il faut donc une poignée, il faut que la poignée marche,
il faut des gonds , il faut que les gond marchent... vous voyez la logique ?
Sans organisation on peut passer des heures à controller en vrac toutes la mécanique de la porte alors qu'il nous
manquait simplement la main peut etre ?

Donc avec le code plus haut pour le problème d'animation de papy je cherche à un bout de la chaine, l'instruction
finale "SetAnimation" (La main) il peut y avoir plusieurs problemes:

Code: [Select]
SetAnimation (uAnim_PorteGauche , PorteGauche_proc);

1-Defaut de logique, elle n'est jamais declenchée (le "if" est faux)
2-Defaut de parametres, le "handle" est inccorrecte ou la valeur 0->1 qui fait l'animation ne change jamais ou hors
limite.

La méthode la plus évidente est de controller en débug (execution "pas a pas") , un point d'arret sur
l'instruction "SetAnimation ", on lance le programme et on regarde ce qui ce passe.

NOTE: sans debug pas à pas personne n'ira très loin, c'est vital, voir donc le tuto la dessus:
http://orbiter.dansteph.com/forum/index.php?topic=6336.msg95354#msg95354



Donc je lance, rien, SetAnimation n'est jamais appellé. Je met un point d'arret plus haut sur le "if" et la le programme
s'arrette et je vois ceci:



Horreur !, notre variable qui est sensé prendre la valeur 1 ou 0 pour passer le if contient "-842150451", aucune
chance de de declencher l'anim donc. Pourquoi quoi cette valeur ?

-Dans une classe les variables ne sont jamais initialisée par défaut ! elle prennent n'importe quel valeur. Je vais pas
rentrer dans les explications complexe mais le truc à retenir de vital !!!! c'est:

REGLE INVARIABLE: Toute variable déclarée dans votre classe ("class" dans le fichier ".h" ) doit
être initialisée avec une valeur valide dans "clbkSetClassCap()" qui est la fonction d'initialisation d'un vessel
Orbiter


Donc : chaque fois qu'on rajoute une variable dans la classe (par ici si vous ne voyez pas):



On l'initialise dans clbkSetClassCap à une valeur valide pour notre programme:




Voila, c'était les "méthodes" qu'il me semblait importante de souligner. Pour le reste j'ecris à papy en PM.

A++

Dan



Message modifié ( 22-05-2008 05:44 )


Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #48 - 22 May 2008, 09:37:44
Merci Dan je vais essayer de corriger mais il faut d"abord que mon debug fonctionne.

:sage: Papyref



Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #49 - 23 May 2008, 17:16:21
Mes animations marchent (pas encore toutes) et le debug fonctionne . Je ne sais pas encore de façon sûre pourquoi il
ne fonctionnait pas mais j'ai peut être une piste ?

Bon WE
:sage: Papyref