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] Compiler une DLL avec un panel 2D  (Read 8626 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
16 July 2007, 02:10:13

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352



Compiler une DLL avec un panel 2D

Un panel 2d dans Orbiter ca peut ressembler a ca: (ici en exemple celui du DGIV en 3 parties)



Très cool mais le problème est que si vous avez essayé de compiler les exemples "deltaGlider" ou "shuttleA" pour voir comment faire un panel 2d vous devez avoir eu pleins d'erreurs de compilation.

La cause en est que VC++ ne contient pas nativement une gestion des ressources comme les bitmaps qui sont incluse et compilée dans la DLL et que part defaut la declaration des bibliotheque est minimale ce qui fait échouer la compilation , nous allons solutionner tout ca.


Attention!!!:

1- Ce tuto ne vous expliquera pas comment faire une panel 2d Orbiter de A à Z mais il vous permettra de compiler les exemples, un exemple qui compile c'est la clé pour un bon travail de detective, pouvoir modifier et comprendre comment marchent les choses.  Ceci dit je vous donnerais deux trois pistes à la fin de ce tuto pour expliquer au moins le principe des panels 2d d'Orbiter.

2-Il est déconseillé de commencer par ce tuto, je part du principe que vous avez compris les autres tuto et déjà examiné l'exemple de projet DLL.



Compilation d'une DLL avec panel 2d

Nous allons compiler le projet SHuttleA qui est le plus simple à comprendre. Le Deltaglider lui est deja sacrement toufu et plus difficile à suivre.

1-Cliquez sur "OrbiterSDK/Samples/ShuttleA/ShuttleaA.dsw" cliquez "oui pour tout" à convertir le projet.

2-Dans "outils/Options/projet et solutions/répértoire de VC++" sélectionnez en haut "Afficher les répértoire pour: fichier include" puis rajouter une chemin vers "...windows server2003 R2/include/MFC" (même chose que nous avons fait dans le tout premier tuto sauf que la nous incluons le repertoire "include/MFC" au lieu de "include"
Ceci ne sera a faire qu'une seul fois pour tout les projets.

3-Dans "Projet/Propriété de ShuttleA/Editeur de liens/Entrée" copiez collez la ligne ci-dessous dans le champ "dépendances supplémentaires"

user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Ceci sera a faire pour tout les projet (qui utilisent un panel) n'oubliez pas de faire ca pour debug et release ;)

4-VC++ express contrairement a la version payante ne contient pas d'editeur de ressources mais il en existe de très bon externe en freeware dont un qui s'appelle "resedit" et ce télécharge depuis cette page: http://www.resedit.net/
Dans l'exemple ShuttleA il vous servira à editer les ressources bitmap qui ce trouvent dans le fichier ShuttleA.rc
et "ressource.h" si vous voulez inclure des ressources dans votre propre projet il créera deux fichiers un "*.rc" et un "ressource.h" il ne faudra pas oublier d'inclure le "ressources.h" dans votre projet. (projet/ajouter un élément existant)

Testez la compilation, ca doit marcher.



Le principe du panel 2d dans Orbiter

Je vous donne ci-dessous les grandes lignes qui vous aiderons à comprendre le principe, pour le détail il faudra faire le fameux travail de detective sur les exemples existant (shuttlea deltaglider) Dans le texte ci-dessous je vous donne en jaune les mot clé des fonctions ou variables concernée par l'explication pour que vous puissiez suivre les explications tout en regardant le code du ShuttleA.

Dans le fichier *.rc sera déclaré la bitmap qui sera le fond du panel, cette bitmap ainsi que d'autres éventuelle seront compilée et incluse dans la DLL, pas besoin donc de fournir les fichier bitmap en plus avec votre addon.
Notez que VC++ ne comprend QUE le format bmp.


Un exemple de bitmap, le fond du panel du haut du ShuttleA: (taille réduite)




Autres exemples: les bouttons du panel du DGIV: (taille réel)




Ces bitmaps doivent etre en format 256 couleur bmp, la couleur qui devra etre transparente dans Orbiter etant le blanc complet (RGB= 255,255,255)

Dans Orbiter vous pourrez declarer des zones sur ce panel, soit des zones simplement réactive au clique souris (bouton non animés), soit des zones ou vous pourrez ecrire du texte (affichage données) soit des zones ou vous allez copier des bout d'autres images bmp (bouton animé etc etc) soit un mélange des trois. Ceci ce fait a l'aide de la fonctions orbiter  "oapiRegisterPanelArea"

NOTE:

Il faut etre precautioneux avec cette fonction, un parametre "PANEL_REDRAW_ALWAYS" signifie que la zone sera rafraichie à chaque image, si vous copiez un bmp de 400x400 pixels ca fera 9 millions de pixels à copier chaque seconde ! (à 60FPS) Comme GDI32 la librairie windows 32 bits utilisée par Orbiter pour les graphisme 2d n'est pas super performante votre panel risque d'etre un "Bouffe framerate" pour votre addon.

 "PANEL_REDRAW_ALWAYS" est donc plutot reservé au zones dynamique qui changent à chaque image comme l'affichage de l'altitude, quantité de fuel etc etc.
Pour afficher un bouton sur lequel on peut cliquer par exemple il vaut mieux utiliser "PANEL_REDRAW_MOUSE" qui rafraichira la zone qu'après un clique souris ou "PANEL_REDRAW_USER" qui nous permet grace a"oapiTriggerPanelRedrawArea" d'avoir un control manuel sur le rafraichissement. (cas d'un bouton pressé qui allumerais une lumiere sur une autre zone par exemple)



Note sur la taille du fond du panel et les bitmaps

Quel taille pour cette énorme bitmap ? C'est un compromis et ca dépend de votre projet, plus elle est grosse plus l'affichage sera lent sur de petite machine évidemment. Mais si vous la faite trop petite les gens avec un bon ordinateur et une résolution plus élevée aurons des "trous" à gauche et à droite et verrons l'espace.

En 2007 j'ai passé les fond du DGIV en 1280 de largeur mais je n'affiche les instrument que sur les 1184 pixels du millieux. Comme cela les gens en 1280 n'ont pas de trous et ceux qui tournent en 1184 voient encore tout les instruments. J'ai eu quelques demandes pour la passer en 1600 mais cette résolution (ou plus haute) est encore
"rare" et la pénalisation des performances sur les ordi moyen est vraiment conséquente.

Ceci dis ca dépend aussi de ce que vous y mettez, 1280x400 pour mettre 5 boutons... hem.

Pour les autres bitmap qui contiennent les boutons, lumieres et autre éléments ca dépend encore de votre panel.
Comme nous avons besoin des coordonées des éléments pour pouvoir les copier sur le panel principal il est plus facile de bien ranger les même éléments avec juste un offset x ou y que de les eparpiller sur la bitmap.

Exemple: Un bouton rotatif de 30 pixel de large qui peut avoir trois état par exemple, si vous ranger chaque image horizontalement à la suite vous pourrez faire en une ligne (en pseudo code)  AfficheBouton(EtatBouton*30,0)
ou EtaBouton est 0 1 ou 2, si vous éparpillez les images sur la bitmap vous devrez ecrire les coordonnées pour chaque état bonjour la complication du code.

Donc pour les autres bitmap: assez grande pour que vous puissiez bien organiser vos éléments graphique... Mais pas trop grande ;)



L'exemple ShuttleA décortiqué


Préparation des ressources GDI:

Pour avoir un panel dans un addons orbiter aura besoin d'un certain nombre de ressources, les bitmaps evidemment mais aussi le handle de la DLL (pointeur sur la mémoire dll) et des polices qui seront utilisée pour marquer du texte sur le panel, comme ces ressources sont communes a toutes les instances de votre addon les exemples orbiter les rangent dans la seule structure globale du projet GDIParams g_Param; GDIParams est une structure et g_Param la variable pour acceder à cette structure (pour une aide sur les structures regardez l'exemple de projet)

En tout premier Orbiter copie donc le handle de la DLL dans cette structure et crée de polices (fonts) qui seront utlisée par les affichage de texte. Ceci ce fait dans la fonction InitModule Comme vous le voyez le ShuttleA utilise une polices Arial (voir aide windows "CreateFont") et des "stylos" (CreatePen) et "brosse" (CreateSolidBrush) qui servent à tracer des traits.
Stylos, brosse et affichage de texte sont faite via la librairie graphique de window GDI32 il existe quantité de site qui parlent de cette librarie googlez avec "GDI32 C++ tutorial" pour avoir plus d'aide sinon suivez les exemples du ShuttleA.

NOTE: Les ressources police, pen et brushes doivent absolument etre detruite a la fin du programme sinon vous aurez des "memory leak" (mémoire allouée et jamais libérée) la destruction de ces ressources ce fait dans ExitModule ne pas oubliez quand vous declarer une ressource dans InitModule de modifier aussi ExitModule pour que cette ressource soit libérée.

La handle "hDLL" lui sert a une fonction "LoadBitmap" qu'orbiter utilise pour charger le panel.


Préparation des ressources BITMAP:

Comme dis precedement les bitmaps sont incluse dans le projet par les fichiers ressource.h et *.rc.

La ou les bitmap(s) principales du fond (vous pouvez en avoir plusieurs "panel du haut" et "panel principal" par exemple) ) sera directement affichée par Orbiter grace aux fonction "HBITMAP hBmp = LoadBitmap" et "oapiRegisterPanelBackground"

Par contre pour les autres bitmaps qui contiennent uniquement des bout qui serons copiée sur le fond (bouton, lumiere etc etc) Orbiter necessite qu'elle soient incluse dans des "surfaces" ces surface sont crées dans la fonction "InitPanel"

Exemple:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SLIDER1));

Prend la bitmap déclarée dans ressource.h avec le nom "IDB_SLIDER1" et crée une surface avec dont le handle sera gardé par la variable srf[0].

Attention: comme pour les polices vous devez absolument liberer ces surfaces sous peine de memory leak ceci ce fait avec "oapiDestroySurface" dans "ReleaseSurfaces"

Attention2: comme ces surface sont crée pour chaque instance de vessel qui a un panel les handle des surfaces ne sont PAS globale. Les variables srf[] sont declarée dans la classe.



Silence on tourne:

Ouf, la vous avez tout, maintenant il est temps de faire tourner tout ca.
Dans orbiter le traitement du panel ce fera a l'aide de trois fonctions callback:

1- clbkLoadPanel

Appellée par Orbiter quand l'initialisation du panel doit ce faire, quand on switch exterieur/interieur ou quand on change de panel "haut/bas" par exemple. Cette fonction donne dans la variable "id" le no du panel à afficher.
Notez comme la fonction "ReleaseSurface" est appellée avant l'initialisation du panel et comme la fonction "InitPanel" qui crée les surfaces est appelée à la fin.

Notez aussi "oapiRegisterMFD" qui declare des MFD (avec coordonnées dans "MFDSPEC")

Pour les autres fonctions regardez dans la doc orbiter.


2- clbkPanelMouseEvent

Cette fonction est appellée automatiquement quand l'utilisateur clique sur une zone définie avec "PANEL_MOUSE_LBDOWN" c'est ici que vous procedez au changement induit par le clique sur la zone, allumage d'un systeme ou d'un réacteur, changement variables animations, extinction d'une variable qui vous fait consommer l'electricité d'un systeme (virtuel) etc etc.


3- clbkPanelRedrawEvent

Dans cette fonction sera fait l'affichage proprement dis sur le panel du fond, soit par copie de petit bouts d'autres bitmap (boutons etc etc) soit par dessin direct via des fonctions GDI (lignes, boites colorée) soit par ecriture direct de texte (TextOut)

En parametre de cette fonction est fourni le nom de la zone concernée par l'affichage (nom déclaré dans oapiRegisterPanelArea) et le handle du carré concernée sur le panel du fond. Ce handle servira aux fonctions GDI ou au fonctions de copie de bitmap.


Pour l'affichage de texte regardez par exemple la fonction RedrawPanel_Fuelstatus.
Cette fonction est appellée depuis clbkPanelRedrawEvent et affiche en texte les chiffres du fuel.
En tout premier il nous faut obtenir le handle DC (Draw Context) de la surface avec "HDC hDC = oapiGetDC(surf);", ce handle sert à toute les fonctions GDI . En deuxieme nous selectionnons avec SelectObject la police que nous allons utiliser en l'occurence la police arial créée dans InitModule En troisieme nous allons choisir la couleur RGB du texte avec SetTextColor (hDC, RGB(224,224,224)); ici un blanc/grisé. En dernier nous voulons que le fond du texte laisse apparaitre le panel en dessous ceci ce fait avec SetBkMode (hDC, TRANSPARENT);

Ensuite vient l'affichage proprement dis avec des fonctions TextOut. Notez qu'un rectangle est aussi tracé avec la fonction "Rectangle" de GDI.

Important: quand on a un handle DC (oapiGetDC) il faut toujours le liberer quand on n'en a plus besoin
notez donc à la fin de la fonction RedrawPanel_Fuelstatus la fonction oapiReleaseDC (surf, hDC); qui libère le handle.

Le caneva d'un affichage de texte à donc toujours ce schema (pseudo code)

Code: [Select]
// préparation
oapiGetDC(SurfaceDestination) // obtient le handle DC de la surface destination
SelectObject(NotrePolice) // selectionne la police a utiliser
SetBkMode(TRANSPARENT) // l'affichage du fond de la police laissera apparaitre le fond

// affiche le(s) texte(s)
SetTextColor(RGB) // selectionne la couleur du texte
TextOut // affiche le texte
SetTextColor(RGB) // selectionne une autre couleurs de texte
TextOut // affiche un autre texte

// fin de cette affichage
oapiReleaseDC // libere le handle DC


Pour la copie de bitmap, une image vaut des centaines de mots, le principe est simple:



La copie de bitmap ce fait avec la fonction Orbiter oapiBlt avec en parametre le handle de la surface destination (fond) le handle de la surface d'une autre bitmap les coordonnées du carré source à copier et les coordonnées ou vous voulez la copier sur la destination.

Le truc très chiant c'est qu'un pixel de différence dans la taille source et destination vous donnera une bouillie de pixel, il faut être précis. (ne pas copier une zone de 21 pixel sur une destination de 20 pixel)

Il faut bien comprendre une chose importante: Si vous ne mettez pas une zone en "PANEL_REDRAW_ALWAYS" la bitmap du fond est comme un tableau noir qui n'est jamais effacé Ce que vous copiez ou ecrivez dessus le restera toujours.

Il serais suicidaire pour le framerate de réafficher à chaque image une zone qui ne change pas ou très peu, si vous avez un bouton déclarer le en raffraichissement manuel ou en "PANEL_REDRAW_MOUSE" (raffraichi après un clique souris) Comprennez bien qu'en interne le rafraichissement d'une zone déclenche des centaines de lignes qu'une simple test de votre coté pourrais éviter. (GDI est notoirement lent)

Exemple: si vous avez un compas directionnel declarez le en rafraichissement manuel (..REDRAW_USER) enregistez le dernier heading affiché et comparez le avec la nouvelle valeurs, si elle n'a pas changée ne déclencher pas le réaffichage si il a changée déclenchez un raffraichissement avec oapiTriggerPanelRedrawArea



Message modifié ( 18-07-2007 17:24 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 18 July 2007, 15:31:20
TRUC: T'en a mis partout et maintenant tu comprend plus rien ?

Normal c'est l'effet kiss-cool :badsmile:

Pour chaque bouton vous avez des dizaines de lignes de code impliquée, un panel
ca peut aussi s'ettoffer avec les années, si vous n'organisez pas ca correctement
dès le début vous courrez à la catastrophe.

Pourquoi dès l'ors ne pas utiliser des structures pour stocker tout vos variables
du panel et des système du vaisseau ?

Exemple pratique , voila un petit bout de la structure concernant le panel du DGIV

Code: [Select]
typedef struct {
int BUTTONSTATE_iExt;
int BUTTONSTATE_iBatt;
int BUTTONSTATE_iApuStart;
int BUTTONSTATE_iGen1;
int BUTTONSTATE_iGen2;
int BUTTONSTATE_iBusSelector;
int BUTTONSTATE_iPowerHud;
int BUTTONSTATE_iPowerMfd;
int BUTTONSTATE_iPowerRadio;
int BUTTONSTATE_iPowerAirlock;
int BUTTONSTATE_iPowerEngine;
int BUTTONSTATE_iPowerLifepack;
int BUTTONSTATE_iPowerAp;
int BUTTONSTATE_iPowerMainBus;
int BUTTONSTATE_iPassengerSeat;
int BUTTONSTATE_iStrobe;
int BUTTONSTATE_iForceCanopy;
int BUTTONSTATE_iRetroDoor;
int BUTTONSTATE_iHoverDoor;
int BUTTONSTATE_iGearHydPress;
int BUTTONSTATE_iEmergencyPower;
float LEVEL_fCabinO2;
double LEVEL_fCabinCO2;
float LEVEL_fCabinTemp;
float LEVEL_fCabinPressure;
float LEVEL_fCabinMoist;
float LEVEL_fCabinImpurity;
float LEVEL_fSettingCabinO2;
float LEVEL_fSettingCabinTemp;
float LEVEL_fSettingCabinPressure;

         etc etc.... (encore 50 lignes)

}PANELDG;

Dans l'extrait de code suivant on voit tout de suite les variable (SYS) qui sont dans cette structure
et concernent l'etat d'un bouton ou d'un systeme:

Code: [Select]
...
else if(SYS.BUTTONSTATE_iBusSelector==2&&SYS.VOLTAGE_fGen2>80)
{
SYS.VOLTAGE_fGenBus=SYS.VOLTAGE_fGen2;
}
else if(SYS.BUTTONSTATE_iBusSelector==3&&SYS.BUTTONSTATE_iEmergencyPower==2&&SYS.LEVEL_fEmergencyPower>0)
{
SYS.VOLTAGE_fGenBus=96.0f;
}
else
SYS.VOLTAGE_fGenBus=0;
...

Regardez dans l'exemple de projet le listing "MesDonneeSimulation.h" à propos des structures.
N'oubliez pas que même si vous prennez une convention de nom il est facile sur des milliers
de lignes de ce planter quelques fois et de ruiner la convention. Avec une structure impossible.
Si elle est dedans vous ne pouvez y acceder que par le nom de structure.

Et surtout vous pouvez traiter cette structure en bloc, par exemple pour l'initialiser:

Code: [Select]
// dans le header de classe on declare nos variable structure:
PANELDG SYS;

// dans clbkSetClassCap on initialise toutes les variables à zéro en une ligne:
memset(&SYS,0,sizeof(PANELDG ));

Imaginez que vous devez initialiser implicitement chaque variable séparément et qu'un seul
oubli peut vous faire des bug de la mort difficile à detecter.


Comme vous le voyez le DGIV utilise abondament les structures, pourquoi pas vous ?

Code: [Select]
memset(&CHECK, 0,sizeof(CHECKLIST));
memset(&Cfg, 0,sizeof(CONFIG_CONFIG));
memset(&Data, 0,sizeof(VESSELDATA_1));
memset(&Crew, 0,sizeof(LIVECREW_1));
memset(&AP, 0,sizeof(AUTOPILOT_1));
memset(&HudHeader, 0,sizeof(HEADERCUSTOMHUD_1));
memset(&APRCS, 0,sizeof(AUTOPILOTRCS_1));
memset(&Calc, 0,sizeof(CALCULATOR_1));
memset(&Warn, 0,sizeof(WARNING_1));
memset(&Hud[0], 0,sizeof(CUSTOMHUD_1));
memset(&Hud[1], 0,sizeof(CUSTOMHUD_1));
memset(&Hud[2], 0,sizeof(CUSTOMHUD_1));
memset(&Hud[3], 0,sizeof(CUSTOMHUD_1));
memset(&Hud[4], 0,sizeof(CUSTOMHUD_1));
memset(&SYS, 0,sizeof(DANSYS_DANSYS));
memset(&Fail, 0,sizeof(FAILURE));
memset(&Ant, 0,sizeof(ANTENNA_1));
memset(&P2Perf, 0,sizeof(PANEL2_PERF));
memset(&Turbo, 0,sizeof(TURBOPACK_1));
memset(&AutoDock, 0,sizeof(AUTODOCK_1));
memset(&PShortcut, 0,sizeof(PROGSHORTCUT_1));
memset(&Cargo, 0,sizeof(CARGOSTRUCT));
memset(&GCalc, 0,sizeof(GCALCULATION));
memset(&ExtLoadCfg, 0,sizeof(EXTLOADCFG_1));

En dernier une structure ce sauve et ce recharge en une ligne, très pratique par exemple
pour des fichiers configuration commun à tout vos vaisseaux:

Sauve la structure config:
Code: [Select]
FILE * stream;
stream  = fopen( "Sound\\DeltaGliderIV\\config.cfg", "wb" );
{
fwrite( &Cfg, sizeof( Cfg ), 1, stream );
fclose( stream );
}


ouvre le fichier et charge la structure config:
Code: [Select]
FILE * stream;
stream  = fopen( "Sound\\DeltaGliderIV\\config.cfg", "rb" );
if(stream)
{
fread( &Cfg, sizeof( Cfg ), 1, stream );
fclose( stream );
}

Dan



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


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #2 - 18 July 2007, 22:51:06
gné continue demains (houamff)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5013
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #3 - 19 July 2007, 04:15:26
Vi pourquoi pas :)
Surtout après avoir lu le topo dans le template sur la façon de les utiliser entre elles.
Ca donne des idées .... T'as pas fini de te faire tanner :badsmile:

Ca que je préfère dans le DGIV ce sont toutes les manips que l'on peut faire sur l'ordinateur.
Entre les saisies clavier et les actions sur le panel. Ca donne vraiment l'impression " d'être à bord "



Message modifié ( 19-07-2007 04:17 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #4 - 19 July 2007, 04:25:05
Mais tanne mon amis tanne, c'est en partie grace (à cause de  :badsmile: ) à toi
que ce tuto existe... si on n'a pas un minimum d'enthousiasme et d'interet du coté
des utilisateurs ca diminue grandement la motivation...

Désolé pour l'ortho dans le tuto (frappe km) et il est verbeux, on aurais peut etre
pu faire mieux mais il a au moins le mérite d'exister.

Dan



Message modifié ( 19-07-2007 04:31 )


Offline picto

  • Legend
  • ******
  • Posts: 5013
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #5 - 19 July 2007, 04:42:35
 Pffff, à cause :sad:
Y'a Sirius qui est bien motivé aussi :sad:
Et puis les autres, mais qui ont déjà un autre niveau.


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #6 - 19 July 2007, 04:46:48
Quote
picto a écrit:
 Pffff, à cause :sad:
Y'a Sirius qui est bien motivé aussi :sad:
Et puis les autres, mais qui ont déjà un autre niveau.

Tu est quand même le plus motivé et le plus accroché sirius y est venu + tard
en plus c'est ton bavardage incessant et tes question a la c... qui m'ont
décidé a faire le tuto. :badsmile:

Je te remercie donc bien bas au nom de toute la communauté :wor:

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5013
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #7 - 20 July 2007, 00:11:58

Allez, puisqu'on est dans le côté pratique des choses. L'organisation c'est pas mon fort :badsmile:
Pour déclarer des variables dans une structure, ferais tu un truc du genre.
Panel.cpp correspond à Panel.h dans lequel on trouve juste la structure SYS par exemple.
Ou alors tout dans un MesStructures.h ?


Pic

Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #8 - 20 July 2007, 00:19:05
Quote
DanSteph a écrit:
Quote
picto a écrit:
 Pffff, à cause :sad:
Y'a Sirius qui est bien motivé aussi :sad:
Et puis les autres, mais qui ont déjà un autre niveau.

Tu est quand même le plus motivé et le plus accroché sirius y est venu + tard
en plus c'est ton bavardage incessant et tes question a la c... qui m'ont
décidé a faire le tuto. :badsmile:

Je te remercie donc bien bas au nom de toute la communauté :wor:

Dan

Moins motivé je ne suis pas sur, moins doué surement ;)

Mais je cherche :





Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #9 - 20 July 2007, 00:40:21
Quote
siriusfett a écrit:
Moins motivé je ne suis pas sur, moins doué surement ;)

Ah, pardon, j'aurais du ecrire le "moins motivé sur mes tutos" celui qui a
donné moins de feedbacks posé moins de questions etc etc...
Mais bon tu y est venu plus tard aussi.

Moins doué je suis pas sur non plus, le fait est que picto est un bourreau
de travail capable de bosser 18 heures sur un truc, c'est sur qu'a ce rhytme
ca avance vite... ;) (mais il est doué le petit)

(ca y est je vais facher tout le monde la :sad: )

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #10 - 20 July 2007, 00:43:38
Quote
picto a écrit:

Allez, puisqu'on est dans le côté pratique des choses. L'organisation c'est pas mon fort :badsmile:
Pour déclarer des variables dans une structure, ferais tu un truc du genre.
Panel.cpp correspond à Panel.h dans lequel on trouve juste la structure SYS par exemple.
Ou alors tout dans un MesStructures.h ?

tout dans le header principal, en fait tu peut aussi tout declarer dans un "messtructures.h"
qui lui est inclu dans "monaddon.h" visible par tous...

Question d'organisation comme tu préferre, en général un "h" est beaucoup plus petit
celui du DGIV (ou il y a tout) est encore abordable. Les CPP par contre eux sont énorme
très vite, ca vaut le coup de bien organiser et séparer.

Perso je preferre toutes mes structures dans le même header pour pas les disperser,
maintenant monaddon.h ou messtructure je crois pas que ca changerais beaucoup.
(on touche peu au h comparativement au cpp)

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #11 - 20 July 2007, 00:53:25
A non pas facher, loin de là et c'est vrai, que c'est ton premier tuto pour installer VC Express qui m'a mis le pieds à
l'étrier ;)



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #12 - 20 July 2007, 01:03:07
Quote
siriusfett a écrit:
A non pas facher, loin de là et c'est vrai, que c'est ton premier tuto pour installer VC Express qui m'a mis le pieds à
l'étrier ;)

Lache pas le licole alors ;)

Mais les autres tutos ? sont trop toufu ? ils servent etc etc ? tu les a lu ?
Pour l'instant vous ete deux, picto qui lis tout, toi, (et tout les silencieux
dans le fond qui répondent jamais (oui vous la ;) )

Enfin j'éspère au moins qu'il y a des silencieux, sinon je me suis peté
la nenette pour pas beaucoup de monde :sad: (je regrette pas hein)

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 967
  • Country: France fr
  • Karma: 5
Reply #13 - 20 July 2007, 11:46:35
je ne lache pas ;)

J'ai lu les autres tutos mis à part le panel que j'ai survolé. J'ai besoin de commencer par des choses plus basiques pour
comprendre déjà se que je fais, faire et refaire pour que tout se mette en place dans ma caboche, après il me reste beaucoup
de chose à assimilés.
Par exemple, je regarde beaucoup l'API mais de là à coucher en ligne de code ce que je li il y a un pas que je n'ai pas
encore franchit, de plus je suis limité par l'anglais (je vais mis mettre).

Heureusement qu'il y a les exemples, comme pour les UMmu  que j'ai réussit à intégrer à mon "MonAddon" hier soir en suivant
pas à pas le modèle du ShuttlePB.

Bref continu comme ça, moi je me régale même si je me prend quelque fois (souvent) la tête...


« Last Edit: 20 July 2007, 12:01:48 by siriusfett »

Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #14 - 20 July 2007, 11:51:17
tu sais dan même pour moi qui connais le c++ une bonne partie de tes tutosme servent. ils me permettent d'avoire un bel
apercu sans devoir trop foiller, des exemple a disécer et surtout pour ma part la configuration du compilo(ha cette config
j'en ai tjs souffert :lol:)

donc mici a toi et ne crois po que tes tutos sont inutiles.... s'est de loin po le cas ;)


« Last Edit: 20 July 2007, 12:01:48 by Apofis »
"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15002
  • Karma: 178
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 20 July 2007, 11:55:44
Ben ca fait plaisir, notez que même si il n'y a que deux addons sympa qui sortent suite au tuto
ca veux dire qu'ils auront été utile...

Je pourrais bien encore en ecrire 10 ou 15 j'ai pas épuisé tout les trucs mais
ca deviendrais effrayant la ;)

Dan

« Last Edit: 20 July 2007, 12:01:48 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5013
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #16 - 20 July 2007, 11:59:15
Quote
Sirius a écrit :
Heureusement qu'il y a les exemples, comme pour les UMmu que j'ai réussit à intégrer à mon "MonAddon" hier soir en
suivant pas à pas le modèle du ShuttlePB.

Je ne comprend pas que tu t'excuses à moitié de ça.
C'est une des bases de la prog. Même Maître Dan fait comme ça.
Tu ne vas pas apprendre par coeur 10 api si tu programmes pour
10 softs de jeu en même temps !

Le langage s'acquiert en parallèlle . Peut être plus difficilement
parce que ça fait beaucoup en même temps, mais après tout nos
gosses n'apprennent pas à parler en lisant un Bled ou un dico ;)


« Last Edit: 20 July 2007, 12:01:48 by picto »
Pic

Offline picto

  • Legend
  • ******
  • Posts: 5013
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #17 - 20 July 2007, 12:01:48
Quote
10 ou 15 j'ai pas épuisé tout les trucs mais ca deviendrais effrayant la

Beuh non ....

Te gêne pas, c'est passionnnant ces trucs.
Comme dit Apofis, une fois passé ces saloperies de configurations  c'est vraiment sympa.
Par exemple, le coup des structures, pas évident au départ d'y penser tout le temps.
Ce n'est pas un réflexe comme ça l'est sans doute devenu chez toi.

Paf une petite piqûre de rappel et un ou deux exemples et c'est parti.
Et puis, là ou tu as raison, c'est sur les bonnes habitudes à prendre.

Le DeltaGlider qui est un projet touffu mais pas tant que ça en fin de compte
après le premier defrichage serait 100000 fois plus clair si séparé en cpp par sujets.

Il m'a fallu galérer pour comprendre que destructeur et constructeur s'adressait au GDI
parce que noyés dans la masse, si je les avais trouvés dans un panel.cpp j'aurais évité
deux jours de prise de tête ....

Donc Dan, si tu vois d'autres choses qui peuvent DES LE DEPART d'un projet devenir
une source d'enniuis dans le futur, n'hésite pas à tutorer un chouia sur le sujet...



Message modifié ( 20-07-2007 12:30 )

« Last Edit: 20 July 2007, 12:01:48 by picto »
Pic