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++  (Read 48396 times)

0 Members and 1 Guest are viewing this topic.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #25 - 02 July 2007, 13:35:26
Quote
Ca dépend en fait si vous voulez un truc souple ou en "dur" dans le code, si vous voulez
un truc qui marche avec pleins d'autres addons et est très souple comme le DGIV ca doit
taper dans les 100-300 lignes. (le controle de toutes les c... eries que peuvent faire
les utilisateurs prend en général une tapée de code  ) Si vous ne chargez que VOS payload
(vous savez à quoi vous attendre) vous pouvez faire plus simple.
Rien de compliqué, pas besoin de compatibilité avec d'autres addons. les charges utiles sont
connues. Le système du DGIV est bien plus complexe.
Personnellement, j'envisage même de faire une dll différente pour chaque cas à cause des lanceurs
Multistage qui ne permettent pas de lancer un vaisseau qui necessiterait l'inscription de la charge
utile dans le scénario.

Non, vraiment pour l'instant, je ne pense pas faire compliqué, je n'en suis pas encore à faire mon
propre lanceur en C++. Juste un module de service portant une capsule en charge utile. Çà
s'accomodera très bien d'un système en dur dans le code.


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

no matter.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #26 - 02 July 2007, 13:57:42
RAHHHHH çà y est , je viens de trouver mon bonheur :bave:
void SSA::separate()
{
   VESSELSTATUS2 vs;
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
   GetStatusEx (&vs);
   Local2Rel (ofs, vs.rpos);
   VECTOR3 rofs, rvel = {vs.rvel.x, vs.rvel.y, vs.rvel.z};
   VECTOR3 vel = {0,0,1};
   GlobalRot (vel, rofs);
   vs.rvel.x = rvel.x+rofs.x;
   vs.rvel.y = rvel.y+rofs.y;
   vs.rvel.z = rvel.z+rofs.z;

   vs.status = 0;
   oapiCreateVesselEx ("Pegase", "Pegase", &vs);
   SetMeshVisibilityMode(1,MESHVIS_NEVER);
}



Message modifié ( 02-07-2007 13:58 )

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

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #27 - 02 July 2007, 14:18:03
Bravo pour la soluce plus haut ;)

Quote
no matter a écrit:
Personnellement, j'envisage même de faire une dll différente pour chaque cas à cause des lanceurs
Multistage qui ne permettent pas de lancer un vaisseau qui necessiterait l'inscription de la charge
utile dans le scénario.

Un systeme par no dans le scenario est hyper simple aussi avec
payloadtype 1

Et dans clbkLoadStateEx:
Code: [Select]
// restore la variable "IPayloadType" (voir exemple clbkLoadStateEx tuto)

//Un peut plus bas toujours dans clbkLoadStateEx
if(PayloadType==1)
    blabla insertMesh(4,"TelecomSat");
else if PayloadType==2)
    blabla insertMesh(4,"MilitaireSat");

Coder deux dll juste pour éviter une parametre c'est un peut naze ;)

Dan



Message modifié ( 02-07-2007 14:19 )


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #28 - 03 July 2007, 12:56:43
bon, je voulais dire merci a Dan et No-matter pour avoir repondu a ma question, perso j'ai fais exprès car je recherché une
solus sur un autre prb... (mettre un lander orienté comme il le faut dans un lanceur multistage2)
donc, j'ai trouvé la solution, via une dll_tmp... et cela grace au échange de ce fofo!  
si quelqu'un a besoin du code, je le donnerais sur demande ou; ici si notre gourou le veut bien :)



Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #29 - 03 July 2007, 16:46:48
Ca complique les choses ton organisation de projet pour une quiche de débutant :sick:
Ce truc là est défini au début de DeltaGlider.cpp

#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))

Vu qu'il faut respecter un ordre de lecture de haut en bas pour définir des variables ou constantes.
Que se passe t'il en parallèlle ?
Je veux dire, comment savoir qui de clbkSetClass.cpp, clbkPostStep.cpp, MesFonctions.cpp, Cockpit.cpp, etc ...
va être intégré en premier ?
Et comment savoir si il va être vu partout ou c'est nécessaire ?

Plus simplement, je le met ou ce truc ? :badsmile:


DeltaGlider.cpp
Code: [Select]
#define ORBITER_MODULE
#include "DeltaGlider.h"
....
#include <math.h>

[b] #define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id))) [/b]



Message modifié ( 03-07-2007 16:47 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #30 - 03 July 2007, 17:26:45
le mot clé #define dit à C++ que chaque fois qu'il rencontrera le mot
clé de gauche (LOADBMP) dans le code *au moment de la compilation*
il le remplacera par ce qui est défini à droite.

En bref un #define SALUTPICTO(x) (x=x+1)

sera utilisé comme cela dans le code:

MaVariable=SALUTPICTO(AutreVariable);
TaVariable=SALUTPICTO(CoolVariable);

Et sera compilé comme cela en language machine:

MaVariable=AutreVariable+1;
TaVariable=CoolVariable+1;

C'est une manière de définir une fonction barbante a écrire et qui peut ce retrouver
souvent dans le code de manière plus simple à retenir.

Dans ton cas à chaque fois qu'il rencontrera LOADBMP dans Deltaglider.cpp
par exemple ici:

srf[2] = oapiCreateSurface (LOADBMP (IDB_LIGHT1));

Il le remplacera par ceci *au moment de la compilation*:

srf[2] = oapiCreateSurface (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_LIGHT1)));


#define permet aussi de définir des valeurs:

#define PICTO               "le peintre david"
#define NBRPEINTURE   2  


En bref dans ton code colle #define LOADBMP dans le header, Il y a deux problème:
tu a deja mis g_param il me semble ca c'est bon ?

La limitation de VC++ express (gratuit) c'est que justement il ne gere par les ressources
incluse dans le projet comme bitmap etc etc... il y a pleins d'outils gratuit pour palier
ce manque google un peut avec "VC express" "ressource"

Dan



Message modifié ( 03-07-2007 17:28 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #31 - 03 July 2007, 18:14:38
Je ne sais pas encore :badsmile:
Je dévide ... je dévide ... :sick:
Et évidemment je lis tout ce que je peux en parallèlle sur la doc...
Ca donne un défrichage inommable que j'essaye d'organiser sur un notepad .... :badsmile:
Si j'osais, je ferais un copier coller de toutes ces recherches ... :siffle:

Juste en dessous de cette ligne, je trouve ça dans
DeltaGlider.cpp .... donc
Code: [Select]
GDIParams g_Param;
je trouve ça dans ...
DeltaGlider.h
Je sais ce qu'est typedef ...
GDIParams deviens le synonyme de tout le reste. Pour simplifier la lecture quoi.
Tout le reste viens de platform-sdk ... pour gérer le GDI je suppose.

Code: [Select]
typedef struct {
HINSTANCE hDLL;
HFONT font[2];
DWORD col[4];
HBRUSH brush[4];
HPEN pen[2];
} GDIParams;

Et au début de
Horizon.cpp
Code: [Select]
#define STRICT 1
#include "DeltaGlider.h"
#include <math.h>

extern GDIParams g_Param;



Message modifié ( 03-07-2007 18:59 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #32 - 04 July 2007, 00:25:42
Code: [Select]
#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))

void MonAddon::InitVC (int vc)
       {
                 srf[3] = oapiCreateSurface (LOADBMP (IDB_HORIZON));  
        }
error C2065: 'g_Param' : identificateur non déclaré
error C2228: la partie gauche de '.hDLL' doit avoir un class/struct/union
1>        le type est ''unknown-type''

Tu l'avais vu venir celle là :badsmile: Comment je me le demande :wonder:

Et une autre erreur dont j'ai suivi le fil ...
Qui me ramène à ça sur
DeltaGlider.rc
Code: [Select]
IDB_HORIZON             BITMAP  DISCARDABLE     "Horizon.bmp" Et à ça sur
resource.h
Code: [Select]
#define IDB_HORIZON 115Pour le #define, pas de problèmes en le mettant sur le header.
Pour l'autre .... IDB_HORIZON             BITMAP  DISCARDABLE     "Horizon.bmp"

1>MonAddon - 36 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

Je suppose que ça a à voir avec ces fonctions complémentaires de MSVC payant.
Je cherche sur Google .... mais quelle galère ces trucs ... deux jours là dessus.
Bon ... l'avantage c'est que petit à petit ça familiarise avec la syntaxe, les fonctions
et tout le bord... :badsmile:

Et puis, tu pourrais pas nous lâcher un peu sur Google .... en fait je sais ce que tu es .... UN VIRUS !
http://www.google.fr/search?hl=fr&q=VC+express+ressource&btnG=Recherche+Google&meta=



Message modifié ( 04-07-2007 00:33 )

Pic

Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #33 - 04 July 2007, 13:24:59
Attention question simple :)

Avec l'aide de momo j'ai réussi a faire une petite anim sur Esalab, ma question porte sur la touche pour déclencher mon anim:

Actuellement il faut que je fasse Shift1 (1 du clavier) et je souhaiterais faire Shift1 (1 du pav num) ???

Quote
if (!down) return 0;

   if (KEYMOD_SHIFT (kstate))
   {
      switch (key)
      {
      case OAPI_KEY_1:
                Revertantenretra();
         return 1;
      }
   }
   return 0;

A votre bon coeur :)



Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #34 - 04 July 2007, 13:45:39
Je crois qu'il suffit d'écrire:
case OAPI_KEY_NUMPAD1:
et il faudra peut-être appuyer sur "Verr Num" avant de pouvoir t'en servir.



Message modifié ( 04-07-2007 13:47 )

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

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #35 - 04 July 2007, 14:21:26
A cause du verr num je garderais SHF+1 (en haut)
sinon tu aura des FAQ "je fais shf+pavé et ca marche paaaaaas"

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #36 - 04 July 2007, 14:31:58
Quote
no matter a écrit:
Je crois qu'il suffit d'écrire:
case OAPI_KEY_NUMPAD1:
et il faudra peut-être appuyer sur "Verr Num" avant de pouvoir t'en servir.

Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Edit:

ça fonctionne :wor:



Message modifié ( 04-07-2007 14:36 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #37 - 04 July 2007, 14:36:43
Quote
siriusfett a écrit:
Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Et le clique droit il est fait pour les Gluons peut-être ? :rant:

Comme mentionnée 32 fois dans les tutos clique droit sur n'importe quoi:
fonction, variable, mot-clé pour voir ou ils sont déclarés, tu serais tombé
sur la liste complete des "touches orbiter" avec le clique droit... ;)

(Si c'est pas explicite clique sur n'importe quel mot cle de touche genre OAPI_KEY_B
et "aller à declaration")

Dan



Message modifié ( 04-07-2007 14:38 )


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #38 - 04 July 2007, 14:44:39
Quote
DanSteph a écrit:
A cause du verr num je garderais SHF+1 (en haut)
sinon tu aura des FAQ "je fais shf+pavé et ca marche paaaaaas"

Dan

Oui tu peux être raison, mais en même temps il est difficile de servir d'orbiter sans avoir verrouiller sont numpad (à moins
de modifier le fichier keymap).

j'arrêterais ma décision plus tard pour le moment j'ai des panneaux à animer moi :badsmile:



Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #39 - 04 July 2007, 14:46:55
Quote
DanSteph a écrit:
Quote
siriusfett a écrit:
Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Et le clique droit il est fait pour les Gluons peut-être ? :rant:

Comme mentionnée 32 fois dans les tutos clique droit sur n'importe quoi:
fonction, variable, mot-clé pour voir ou ils sont déclarés, tu serais tombé
sur la liste complete des "touches orbiter" avec le clique droit... ;)

(Si c'est pas explicite clique sur n'importe quel mot cle de touche genre OAPI_KEY_B
et "aller à declaration")

Dan

Oui c'est vrai je viens de vérifier, désolé j'ai la tête comme une pastèque depuis 4 jours :)



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #40 - 04 July 2007, 15:16:12
La methode les gars, c'est la methode qui vous sauvera !

Au début il y avait le néant, puis la méthode vint et créa un module ShuttlePB
elle vit que c'était bon et créa un DeltaGlider...
Le septieme jour elle ce reposa...

La sainte méthode ! :badsmile:

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #42 - 04 July 2007, 16:05:13
Quote
picto a écrit:
http://eden-esperance.over-blog.com/article-1422852.html :badsmile:

1>Édition des liens en cours...
1>Incorporation du manifeste en cours...
1>Erreur C5678 "Dieu" non trouvé
1>Univers - 1 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi,1 a échoué, 0 mis à jour, 0 a été ignoré ==========

:badsmile:

Dan
"Mécréant"



Message modifié ( 04-07-2007 16:11 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #43 - 04 July 2007, 16:55:11

Il fallait le déclarer avant :rant:
Pour ça qu'il compile pas !


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #44 - 04 July 2007, 18:18:17
Quote
picto a écrit:
Il fallait le déclarer avant :rant:

Il a essayé de déclarer mais il a pas passé la douane car il ne voulait
pas payer les taxes, t'imagine la TVA sur l'univers ? :badsmile:

Un univers passé en fraude ? :doubt:

Dan
"même pas honte"



Message modifié ( 04-07-2007 18:20 )


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #45 - 05 July 2007, 22:25:40
Salut les Pro's    :badsmile:   

J'ai enfin réussi à faire l'anim de mes panneaux et leurs rotation en boucle :flower:

Une des questions que je me pose et comment empêché l'utilisateur de déclencher la rotation avant le déploiement ?

comment puis-je faire rentré mon antenne après l'avoir dépliée ?? je ne pense pas
m'en servir pour Esable mais ça me turlupine :)

Et enfin je recherche un exemple pour la déclaration de deux docks, j'ai des exemples et lu la doc mais je n'arrive pas à
l'appliquer.

Pas taper Dan :beer:



Message modifié ( 05-07-2007 23:03 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15102
  • Karma: 193
  • Hein, quoi !?
    • FsPassengers
Reply #46 - 05 July 2007, 22:59:02
Quote
siriusfett a écrit:
Pas taper Dan :beer:

Ouaaais mais noooon  ! tu fais du necro-oeuf topic, ca va plus la :rant:

Ce thread est la pour ca, hésite pas ;)

Quote
siriusfett a écrit:
J'ai enfin réussi à faire l'anim de mes panneaux et leurs rotation en boucle :flower:

Comprend pas très bien la, comme c'est toi qui fait l'animation à chaque clbkpoststep
tu a le control total, il suffit de ne pas appeler "setAnimation" avant déploiement total.

Peut tu poster un peu de code si la réponse ne te satisfait pas ?

Quote
siriusfett a écrit:
comment puis-je faire rentré mon antenne après l'avoir déplié ?? je ne pense pas
m'en servir pour Esable mais ça me turlupine :)

Dans ton code qui incrémente la variable d'animation il suffit d'inverser le processus,
decremente la variable...

Quote
siriusfett a écrit:
Et enfin je recherche un exemple pour la déclaration de deux docks, j'ai des exemples et lu la doc mais je n'arrive pas

Ben... heu si t'a deja des exemples, c'est quoi qui pose probleme ? :badsmile:

Un chouia de code pour des réponses plus précise...

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #47 - 05 July 2007, 23:17:04
Quote
void module1::clbkPostStep (double simt, double simdt, double mjd)
{
    if (Panneaux_status >= Panneaux_CLOSING)
   {
      double da = simdt * Panneaux_SPEED;
      {
         if (Panneaux_proc < 1.0) Panneaux_proc = min (1.0, Panneaux_proc+da);
      }
      SetAnimation (anim_Panneaux, Panneaux_proc);
   }

   if (Rotpan_status >= Rotpan_CLOSING)
   {
       double dant = simdt * Rotpan_SPEED;
           if (Rotpan_proc >= 1.0)
      {
   Rotpan_proc = 0.0;
   SetAnimation (anim_Rotpan, 0);
      }
   Rotpan_proc = min (1.0, Rotpan_proc + dant);
      SetAnimation (anim_Rotpan, Rotpan_proc);
   }

dans l'état actuel des choses, je peux enclencher la rotation avant le déploiement

Shift2 : déploiement
Shift3 : rotation

Pour les docks je continue à chercher, je n'ai rien de correct à présenter.
et il faut que je dorme :zzz::badsmile:



Message modifié ( 06-07-2007 00:05 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #48 - 06 July 2007, 01:25:55
Siriusfett, pour les docks tu peux très bien mettre leur définition dans le fichier cfg si vraiment çà te parait trop sorcier
de faire çà en C++. Pourtant, créer un dock c'est ultra simple. SDK p73, lecture de l'exemple deltaglider
(SetDocksParams dans clbkSetClassCaps). C'est quoi que tu ne comprend pas?

N'oublie pas d'attribuer des IDS à tes docks: SetIDSChannel (DOCKHANDLE dock, DWORD canal);

Comment interdire la rotation si les panneaux ne sont pas sortis:
...
case OAPI_KEY_3:
if (panneaux_proc == 1)
{MaFonctionQuiLanceLaRotation();}
...


tout ce qui va se retrouver entre les {} NE SERA EXECUTE QUE SI tes panneaux sont dépliés.



Message modifié ( 06-07-2007 01:30 )

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

no matter.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #49 - 06 July 2007, 01:59:40
J'ai un souci pour faire jouer un son lors de la séparation de la capsule du CTV.
Le focus passe automatiquement sur la capsule et donc je ne peux pas jouer le son à partir du code du module de
service qui contient la fonction pour séparer.

Je me suis dis ok, pas de problème, je vais faire jouer le son dans le clbkVisualCreated de la capsule:
void Pegase::clbkVisualCreated (VISHANDLE vis, int refcount)
{
   PlayVesselWave3(MyID,SEP);
}


mais çà ne marche pas lors de la séparation. Par contre, le son est bien joué à la création lorsque je recharge un
scénario où la capsule est déjà détachée.

Comment pourrais-je faire pour jouer ce son de séparation lorsque la capsule est crée?



Message modifié ( 06-07-2007 02:08 )

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

no matter.