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: [DeltaGliderGIV] Eject Eject Eject !  (Read 56858 times)

0 Members and 1 Guest are viewing this topic.

Offline Pagir

  • Legend
  • ******
  • Posts: 4522
  • Karma: 1
Reply #100 - 18 December 2006, 16:03:57
Mon premier "vrai" programme, en basic sur le TRS-80, avait une 10zaine de lignes. Il y avait un robot, à l'écran qui
parlait!

En fait, c'était quelques cubes formant vaguement un visage, dont un, par un changement de couleur, donnait
l'impression d'une bouche qui ouvrait. Quant au fait qu'il parlait, c'était parce que le prog déclenchait... le
cassettophone sur lequel on avait enregistré nos voix...

Évidemment, on avait le modèle dans le livre d'instruction du TRS, et on tapait les lignes à l'écran. Je me souviens
qu'on (mon cousin et moi) avait fait une erreur à la ligne 20 et on était rendu à la ligne 60. On avait donc retapé les
lignes 20, 30, 40, 50 et 60 en entier... avant de comprendre qu'on n'avait qu'à retaper la ligne fautive... :lol:

J'ai arrêté de m'amuser avec la prog après la disparition du basic. Depuis qu'il n'y a plus de numéros aux lignes et
que ça ressemble plus à un texte de loi, finalement :bug:

D'où ma totale admiration pour ces trucs manifestement hermétique et réservés aux initiés des arcanes...

Pagir


Pagir

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #101 - 18 December 2006, 17:55:09
Une fois qu'on a pigé le principe c'est enfantin vraiment. simplement il faut déclarer
les variables avant utilisation, comme si on préparait des tiroirs ou on range ce qu'on veut.
Ces tiroirs on les appelle comme en le désir, souvent avec des nom qui évoquent
à quoi ils servent. Par exemple on veut un "tiroir" qui contient la valeur des battement
de coeur du pilote, on va l'appeller par exemple "BattementCoeurPilote" comme
on a besoin que des entiers on va la declarer en "integer" (int)

// donc on declare la variable et on lui assigne tout de suite une valeur:
int BattementCoeurPilote=65;

Les valeurs qui sont declarée a l'interieur d'une fonction ne durent que le temps de la fonction
après elle n'existent plus. (comme des cartons utilisé pendant un demenagement
mais qui sont detruit après) Donc si on veut une valeur qui persiste durant toute la durée du
programme on la declare a l'exterieur de toute fonction.

Apres finalement ce n'est qu'une question de manipuler ce qu'on a rangé dans les tiroirs.
Le code s'execute principalement dans une boucle (fonction) qui est executée a chaque
image d'orbiter. Les lignes s'y executent toute en sequence a chaque image.

Pour remplir nos "tiroirs" (variables) Orbiter fourni des tonnes de fonctions qui nous donne notre
position, la temperature exterieur, notre altitude etc etc. Par exemple si on veut ranger
dans un de nos tiroir la valeur de notre altitude on fait comme avant on déclare une variable
et pour lui donner une valeur on appelle la fonction qui donne l'altitude:

int NotreAltitude=GetAltitude();

Meme chose pour la vitesse verticale:

int NotreVitesseVerticale=GetVerticalSpeed();


Voila, nous somme pret a faire mourir notre pilote en cas de crash.
Dans la fonction appellée a chaque image on va dabord collecter
les données actuelle pour les ranger dans nos "tiroirs" et après
on va tester tout ca. Ces valeurs contrairement a nos battement de coeur
ne seront valide que durant la fonction "qui s'execute a chaque image"
on en a pas besoin ailleurs.

Donc voici tout le code, je met une image sinon c'est pas indenté:




Le principe est tout con non ?


D'ailleur voila le code en vrai du deltagliderIV pour faire mourir en cas d'impacte
les fonctions "setfailures" "sendwarning" "killallpassengers" etc etc sont des fonction à
moi qui contiennent des blocs de code avec les même principe evoqué.

A noter que "Crew.BasePilotPulse" est notre vieille amie "BattementCoeurPilote"
mais en vrai:






Dan



Message modifié ( 18-12-2006 18:28 )


Offline yoann

  • Legend
  • ******
  • Posts: 1914
  • Country: France fr
  • Karma: 9
Reply #102 - 18 December 2006, 18:22:24
hoouuaaa, un vrai cour de prog comme j"en reve, j'aie rien vue d'aussie beau :bave: (en fait, d'aussi clair...  :):):)  )
bravo a notre grand dan   :applause::applause::applause::applause::applause:


__________________________________
    Luke, je suis ton pere            kchuuu  pchiiiii

Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #103 - 18 December 2006, 18:28:00
voila je chercher les fonctions style clbkpoststep ^^

sa va m'orienter dans le sdk bien sa mici dan :top:


"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline zarb-dusk

  • Sr. Member
  • ****
  • Posts: 270
  • Karma: 0
Reply #104 - 18 December 2006, 18:30:21
Cool c'est noel une semaine avant l'heure c vrai que c'est clair comme cours...

Quote
yoann a écrit:
 je suis ton pere kchuuu pchiiiii


note pour Yoann, il manque le bras coupé jeune padwan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #105 - 18 December 2006, 18:30:28
Quote
Apofis a écrit:
voila je chercher les fonctions style clbkpoststep ^^
sa va m'orienter dans le sdk bien sa mici dan :top:

Désolé, j'ai raté ton post avec le titre "x300" j'ai pas percuté :)
je te répond après le repas.

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #106 - 18 December 2006, 19:28:47
/*===Le Nombre Mystère===
-Par  Martin Loos, alias MartySpacelines-

Ceci est un jeu ou l'ordinateur génére un nombre au bol que le joueur doit deviner.
Après chaque coup, l'ordinateur indique au joueur s'il a entré un nombre trop élevé ou trop bas.
Le joueur est avisé du nombre d'essais qu'il lui a fallu pour trouver la solution.
C'EST UN PROGRAMME EN /C/, ET NON PAS EN /C++/ !!*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ( int argc, char** argv )
{
//Initialisation des valeures.
const long MIN = 1, MAX = 100;
long nombreMystere = 0, nombreEntre = 0, nombreDeCoups = 0;

//Ici, on créé un nombre au bol entre 1 et 100 avec les variables MAX et MIN.
srand(time(NULL));   
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;    
   
//Instructions de départ.
printf("Trouvez le nombre entier entre 1 et 100 compris choisi par l'ordinateur.\n");   
printf("Attention, si vous entrez un nombre negatif et/ou decimal, \nl'ordinateur plantera.\n\n");   

do //début de la boucle pour répéter les questions.
{
   nombreDeCoups++;//pour compter les coups.
   printf("\n\nQuel est le nombre ? ");
   scanf("%ld", &nombreEntre);

if (nombreEntre > 0 && nombreEntre < nombreMystere)
{
   
   printf("\nDesole, le nombre mystere est PLUS GRAND que celui que vous avez entre !");
}

else if (nombreEntre <= 100 &&  nombreEntre > nombreMystere)
{
   printf("\nDesole, le nombre mystere est PLUS PETIT que celui que vous avez entre !");
}

else if (nombreEntre != nombreMystere && nombreEntre >100)
{
   printf("\nERREUR, vous n'avez pas rentre de nombre compris entre 1 et 100 !");
}

else if (nombreEntre != nombreMystere && nombreEntre == 0)
{
   printf("\nERREUR, vous n'avez pas rentre de nombre compris entre 1 et 100 !");
}

} while(nombreEntre != nombreMystere);

    //Commentaire final.
    printf("\nBRAVO, vous avez trouve le nombre mystere !\n\n");
   printf("\nVous l'avez fait en %ld coups.\n\n", nombreDeCoups);

   system("PAUSE");    
  return 0;
}

//Voici le programme pour deviuner les nombres.
//je m'attaque à ceci: le joueur pense a un nombre et l'orsi le devine...


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #107 - 19 December 2006, 01:51:32
Bon, vu que ca plait et que je n'ai que 500 tonnes de boulot en retard je vais
encore rajouter un truc sympa. Le C++ c'est démentiel comme language...

:love:

On a vu qu'on pouvait donner n'importe quel noms au variables, au bout d'un moment
quand le projet grandis on va en accumuller des centaines voir des milliers, la ca devient
critique. Prenons un exemple:

Voila une variable globale:

int MyPosition;

Et dans notre fonction voila une variable locale:

function SalutLesgars()
{
int MyPosition;
}


Voila qui va nous rechauffer pendant les longues soirée d'hiver, ou comment s'arracher les cheveux
pendant des heures à comprendre pourquoi notre variable prend des valeur pas prévue du tout.
normal , on en a deux avec le meme nom. On peut les declarer car une est globale et une est locale.

En plus, des positions on en a des milliers; porte, vaisseaux, comme des status, des lights des bidules.
il nous faut donc adopter un systeme de nom ou mourir ignoblement sous le poids de la désorganisation
et des bugs.

Donc on peut adopter un préfixe par catégorie, par exemple:

int VESSELPosition
int VESSELAltitude
int VESSELVitesse


pour le vaisseau et

int AUTOAttitude
int AUTOStatus


pour le pilote automatique.

Mais la il ny a aucune contrainte, quand le listing de declaration fait 20 pages qu'on est a la bourre
on ne retrouve plus nos variables, on commence a les mettres un peut n'importe ou avec n'importe
quel nom. Le début de la fin: 2000 lignes plus tard on y comprend plus rien, vaut mieux tout jeter.

C'est la ou vient à notre secours (TADAAAAAA)  les declaration de type structure.

C'est quoi ce bidule ? :doubt: me direz vous ?

On a vu avant que nos variable sont des tiroirs ou on range des valeurs. Quand dans le village (programme)
il y a des milliers de tiroirs en vrac ca devient difficile de bosser avec de manière organisée.

Pourquoi dès lors ne pas les ranger dans des maisons ? une maison ne contiendra que des tiroirs
ce rapportant aux autopilotes, l'autre que des tiroirs des valeurs qui définissent notre vaisseau dans l'espace,
la troisieme que des valeurs definissant un bonhome etc. etc. En plus les tiroirs pourraient avoir les
meme nom, vu qu'il ne sont pas dans les même maison il ne se mélangeraient jamais... wow ! how cool !

Tient on va ajouter une set de variables (tiroirs) qui contiendront toutes les valeurs d'un bonhomme
de notre equipage. Age, battement de coeur, Poids.
Donc on va d'abord faire une plan de notre maison, ca ce fait avec les typedef structure.

D'abord on dis qu'on va faire un plan:

typedef struct{

La on declare nos tiroirs:

int Age;
int BattementCoeur;
int Poids


et finalement on dis que le plan est fini et on appelle le plan de notre maison avec un nom:

}BONHOMME;

Voila , on a le plan mais la maison n'existe pas encore... on va la créer avec:

BONHOMME JeanPaul;

Super ! on a une maison "JeanPaul" qui contient les tiroirs "Age" "BattementCoeur" et "Poids"
et comment ca marche en pratique ? ben comme avant, sauf que pour remplir ou vider un tiroir
il faut d'abord dire dans quel maison est le tiroir et puis son nom. Ca ce fait avec un point:

JeanPaul.Age=42;

on peut tester son age, le faire vieillir et mourir à 120 ans par exemple:

JeanPaul.Age=JeanPaul.Age+1;   // pan, c'est ton anniv mon vieux, une année dans la glotte !
if(JeanPaul.Age>119)
 TestMortMonPote();


Et la ou c'est super, dément, génial c'est qu'on peut reutiliser ce même plan pour construire d'autre maisons
exactement pareil mais appellée differement, chou, patée, autre bonhomme etc etc.

BONHOMME Pierre;

BONHOMME Chou;

Le chou a t'il le même age que Pierre ?

Chou.Age=Pierre.Age;

Maintenant oui :)

Sans parler qu'on peut mettre une maison dans une autre maison 8o

Le nouveau plan:
typedef struct{
BONHOMME Foetus;
int Age;
}PLANMAMAN;


et on construit la maison:
PLANMAMAN Maman;

Quel age on donne a la maman  ?

Maman.Age=36;

Et quel age on va donner au bébé qu'elle a dans le ventre ?

Maman.Foetus.Age=1;

Mais la soeur Anne peut aussi avoir un bebe d'un an, jalouse:

PLANMAMAN Anne;

Anne.Foetus.Age=1;

Faut dire aussi que c'est une vieille peau aigrie:

Anne.Age=67;


Voila une organisation sans faille, ces valeurs ne peuvent pas ce mélanger du tout, on peux a voir des milliers
de tiroir appelé "age" dans des maisons différente.

Et pour finir l'exemple pratique avec le DGIV d'une structure ce rapportant aux pilote automatique,
d'abord on construit le plan de la maison:




Ensuite on construit la maison qu'on appellera "AP" (comme AutoPilote):




Et finalement on l'utilise, ici ce code est celui executé quand vous chargez un pilote auto,
il regarde le nom defini dans le computer et change les valeurs des "tiroires" de la "maison"
pour que plus tard dans la boucle principale on prenne les bonne actions:




Et dans la boucle principale, chaque image d'abord on test (fleche orange) si il y a du jus dans l'ordinateur
de bord, si le programme est chargé (Loaded==TRUE) et si il tourne (running==TRUE) et on appelle
la bonne fonction (fleche rouge) qui va executer l'autopilote proprement dis:





Le C++ ? c'est démentiel de souplesse et de beauté et faire des addons est une joie !
(pluuus pres de vous mon cooompilateuuuuur)

Dan



Message modifié ( 19-12-2006 02:14 )


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #108 - 19 December 2006, 09:07:28
oucth... Dan va nous faire un tuto... !!!


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #109 - 19 December 2006, 09:09:38
Si je pouvait me tripler ce serais deja fait depuis longtemps...
Ca manque vraiment ca des tutos de démarrage pour faire des addons.

Dan


Offline siriusfett

  • Legend
  • ******
  • Posts: 968
  • Country: France fr
  • Karma: 5
Reply #110 - 19 December 2006, 10:17:18
Effectivement, un petit tuto, pour réaliser un module serait le bien venu.



Offline yoann

  • Legend
  • ******
  • Posts: 1914
  • Country: France fr
  • Karma: 9
Reply #111 - 19 December 2006, 10:41:54
ah ah, un petit tuto ca serai bien, moi j'ai deja pris les 2 post de dan, ca fait un petit tuto deja pas mal ca !!!


__________________________________
    Luke, je suis ton pere            kchuuu  pchiiiii

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #112 - 19 December 2006, 15:55:08
Y a une bonne source aussi c'est le post pour Apofis ici, ca explique à grand trait
un module Orbiter:
http://orbiter.dansteph.com/forum/index.php?topic=6186.msg91438#msg91438 (sauter la section morale)

Un tuto ? ouais ! .... mhhh. Pour l'instant avec ces trois posts ca devrait quand même bien débroussailler.

Il manque quand même un ou deux trucs important que je n'ai pas mentionné pour ne pas faire fouilli.
Il faudrais une section sur les type de donnée (char bool int float double pour les principaux) une section
sur l'initialisation ( tres important, une structure ou une valeur a une valeur indéfinie sans ca)

Dan


Offline yoann

  • Legend
  • ******
  • Posts: 1914
  • Country: France fr
  • Karma: 9
Reply #113 - 19 December 2006, 16:19:06
plus qu'un post avec toutes ces choses, et hop, plus qua faire un pdf...  :)      :wonder:      :badsmile:  mais bon, pour
ceux qui connaissent pas le C++, ca va etre chaud...    ... et puis ceux qui comprennent pas et bas:prout:

(c'est mon cas, je connai pas le C++, juste le site http://www.siteduzero.com ,que j'ai lu premiere partie sur le C,
mais que j'ai deja oublier telement c'est prise tete...    ...clair, c'est trop chaud...   :wall:  )



Message modifié ( 19-12-2006 16:20 )

__________________________________
    Luke, je suis ton pere            kchuuu  pchiiiii

Offline La brique volante

  • Legend
  • ******
  • Posts: 1742
  • Karma: 1
Reply #114 - 19 December 2006, 17:09:07
J'ai une petite requête toute bête pour le DGIV, ça concerne la séléction des astres ou des bases que l'on veut pointer
avec l'antenne. Quand on rajoute des bases dans tout le système solaire, lorsqu'on veut les séléctionner il faut faire
défiler d'abord toutes les bases terrestres avant de trouver celle qui nous interresse. Ce que j'aimerai, c'est un mode
de séléction où l'on puisse directement entrer le nom de la base désirée plutôt que de faire défiler toutes les bases.

Parce que c'est un peu laborieux, si on rajoute pas mal de base terrestres, des aéroports etc.... c'est assez long de
tout faire défiler.



Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #115 - 19 December 2006, 17:44:16
Quote
DanSteph a écrit:


Il manque quand même un ou deux trucs important que je n'ai pas mentionné pour ne pas faire fouilli.
Il faudrais une section sur les type de donnée (char bool int float double pour les principaux) une section
sur l'initialisation ( tres important, une structure ou une valeur a une valeur indéfinie sans ca)

Dan

perso je rajouterai aussi une petite partie sur les type de structure.(style chaine simple ou doublement chainée des liste et
toute ses structures de données de base.

enfin je pense que sa peu toujour etre utile :)


"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #116 - 19 December 2006, 18:14:48
Quote
Apofis a écrit:
perso je rajouterai aussi une petite partie sur les type de structure.(style chaine simple ou doublement chainée des
liste et toute ses structures de données de base.
enfin je pense que sa peu toujour etre utile :)

Sur mais ce n'est pas très utilisé pour un addon, on peut aussi parler des classe
et de pleins de trucs mais on peut faire sans. Pas besoin de tout comprendre
pour faire un addon.
Si je fais un tuto un jour ce sera plutot le coté vraiment pratique avec les bases.

Dan


Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #117 - 19 December 2006, 18:32:17
Je vais m'interesser au C++ mais n'est ce pas trop tard pour moi ?
Il y a bien longtemps j'ai fais de l'assembleur puis du basic puis un peu de Visual Basic et j'ai peur d'avoir quelques
difficultés ?

:sage::sage:Papyref


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #118 - 19 December 2006, 18:49:51
Quote
Papyref a écrit:
Je vais m'interesser au C++ mais n'est ce pas trop tard pour moi ?


Certainement pas, vu ta maitrise des config et modelling tu a certainement le niveau.
En plus tu a une vraie methode de travail et tu est organisé.

Le mieux pour commencer c'est de charger l'exemple ShuttleA, d'essayer de comprendre,
faire des petites modif "pour voir" et poser des questions quand tu ne comprend
pas un truc. Je m'engage à te répondre sans problème en pm ou par post.
(mieux comme cela tout le monde en profite) voir a te faire une petit cour sur les grand principes
(comment marche les fonctions, comment lire et comprendre le code)

Le premier truc que tu peu faire c'est dans le ShuttleA.cpp changer la ligne:
AddMesh (oapiLoadMeshGlobal ("ShuttleA")); (faire recherche sur cette chaine pour tomber dessus,
la recherche est un excellent outil)

A la place tu met: AddMesh (oapiLoadMeshGlobal ("Proton")); (si un mesh de ce nom existe
dans Orbiter/Mesh) et voila, ta fusée s'affiche a la place du shuttleA.

Tu te demande ce que fait addmesh ou oapiLoadMeshGlobal ? tu veux comprendre exactement ?
la doc de reference: "API_Reference.pdf"


Apres dans "clbkSetClassCaps" tu change les parametres qui definissent l'addon a l'initialisation:

   SetSize (17.0);
   SetPMI (_V(86.6, 89.8, 5.5));
   SetEmptyMass (EMPTY_MASS);
   SetCW (0.2, 0.2, 1.5, 1.5);
   SetCrossSections (_V(132.2, 237.9, 42.4));
   SetRotDrag (_V(0.7, 0.7, 0.3));
   SetSurfaceFrictionCoeff (0.5, 0.5);
   SetCameraOffset (_V(0,2.3,16));
   SetDockParams (_V(0,0,18.32), _V(0,0,1), _V(0,1,0));
   SetTouchdownPoints (_V(0,-2.93,9), _V(-2,-2.93,-8), _V(2,-2.93,-8));
   EnableTransponder (true);


La plupart comme "SetSize" sont explicite, si un nous resiste il faut faire une recherche
avec son nom dans "API_Reference.pdf" qui nous explique tout.

Petit a petit en modifiant ici ou la , on ce met a piger des trucs, on apprend, on ce mets a voir
l'image global, on s'affine, il suffit de poser des question pour les zones d'ombres et ca vient
tout seul.

Au début of course on a tendance a faire un peu du code de groin groin mais si ca marche ?

C'est comme des super fichier de spacecraft3.dll en gros. Même pour les anims ca y ressemble
vu que les parametres sont plus ou moin les meme, seul la syntaxe change.
Par contre quand on veut aller plus loin, avec le C++ c'est possible, pas avec spacecraft.
Aucune limite en C++.

Je mentirais si je disais qu'apprendre le C++ prend peu de temps, ca en prend mais tout
dépend ce qu'on veux faire. C'est un outil universel. Ca fait 10 ans que j'en fais et j'apprend
encore tout les jours, pas en lisant des tutoriaux ou des cours  (j'y comprend jamais rien,
la majeur partie sont issue de gens qui ce la pêtent mais n'ont jamais fait de vrais projets)  
mais en lisant le code des autres.

Dan



Message modifié ( 19-12-2006 19:46 )


Offline Papyref

  • Legend
  • ******
  • Posts: 5341
  • Country: France fr
  • Karma: 341
  • Je suis dans la Lune ne pas me déranger
Reply #119 - 19 December 2006, 19:00:16
Merci pour tes encouragements Dan. Je commencerai à regarder tout ça l'année prochaine.
J'ai chargé Visual C++ 2005 de Microsoft pour commencer. Je pense que ça doit convenir ?

Papy


Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #120 - 19 December 2006, 19:18:04
Quote
Papyref a écrit:
Merci pour tes encouragements Dan. Je commencerai à regarder tout ça l'année prochaine.
J'ai chargé Visual C++ 2005 de Microsoft pour commencer. Je pense que ça doit convenir ?

Papy

vi sa convient tres bien ^^ je suis sur que dan as casi le même ;)


"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #121 - 19 December 2006, 19:43:34
Quote
Papyref a écrit:
Merci pour tes encouragements Dan. Je commencerai à regarder tout ça l'année prochaine.
J'ai chargé Visual C++ 2005 de Microsoft pour commencer. Je pense que ça doit convenir ?
Papy


C'est exactement ce qu'il faut... comme dis plus haut j'ai le même ;)

Dan



Message modifié ( 19-12-2006 19:44 )


Offline yoann

  • Legend
  • ******
  • Posts: 1914
  • Country: France fr
  • Karma: 9
Reply #122 - 20 December 2006, 11:55:20
hum, et a votre avis, quel est le meilleur site internet pour aprendre le C++, enfin juste pour comprendre les bases
quoi, pour apres mieux comprendre comment faire avec orbiter... ou essayer de faire des choses mieux que des truc
genre "remplace ca par ca" ou "ca par ca", c'est bien pour faire un add-on, certes, mais si ont veux ajouter 2 3 truc en
plus, que faire ???   :wonder::wonder::wonder::wonder:


__________________________________
    Luke, je suis ton pere            kchuuu  pchiiiii

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #123 - 20 December 2006, 16:05:52
Quote
yoann a écrit:
mais si ont veux ajouter 2 3 truc en plus, que faire ???   :wonder::wonder::wonder::wonder:


Le bon programmeur est un détective confirmé.
Tu peut lire tout les tuto du monde, toutes les doc tu restera une brêle si t'est pas
un bon detective. Pour ca il faut acquerir la méthode "agent X"

-Savoir ou Dénicher l'information.
-Avoir le nez pour reperer un petit élément qui est en rapport avec ce qu'on veux faire et dérouler la pelote.
-Savoir fouiller dans les bureau de tatiana la blonde espionne russe.

Le meilleur copain du programmeur c'est d'abord le bouton "recherche", soit sur le net, soit dans les codes
exemple, soit dans la doc.

Est ce noble de regarder comment les autres on fait ? n'est on pas un minable copieur ?
Non, pourquoi réinventer ce qui a deja été fais ? a ce tarif on pourrait reinventer un language
comme ca on est sur de partir de zéro. en plus on ne peut pas bien copier sans comprendre
et copier nous fais apprendre a vitesse grand V, bien plus que n'importe quel cour. En plus
les exemple de Martin sont la pour ca.

Bon... tu veux rajouter une bouton sur le panel... tu va apprendre ca dans un cour de C++ ?
dans un tuto de C++ ? non, c'est totalement spécifique à Orbiter. Le gars qu'a 10 ans de C++
est au même point que toi la dessus.

Of course tu peu poser la question ici mais si tu bosse 6 mois dessus et qu'a chaque fois
tu pose la question au lieu de chercher tu va mériter le nom de boulet.

Donc premiere solution lire la doc, en général je n'attend pas énormement d'une doc donc moi
je fouille d'abord dans le code existant. L'enorme avantage c'est que a contrario de la doc
tu ne cherche que dans le domaine qui t'interesse et que dans du pratique, du qui marche,
pas du théorique... Les réponses sont donc beaucoup plus adéquates.

Vous me suivez agent Z ? Ouvrons donc le bureau de tatiana (le projet exemple ShuttleA qui a un panel)

Voyons voir, bouton, tableau de bord, tout est en anglais donc cherchons d'abord "button" et ensuite "panel"

Button:
Find all "button", Subfolders, Find Results 1, "Current Project"
define IDB_BUTTON1                     106
srf[2] = oapiCreateSurface (LOADBMP (IDB_BUTTON1));
void ShuttleA::RedrawPanel_MFDButton (SURFHANDLE surf, int mfd, int side)
if (label = oapiMFDButtonLabel (mfd, bt+side*6))
oapiTriggerPanelRedrawArea (0, AID_MFD1_LBUTTONS);
oapiTriggerPanelRedrawArea (0, AID_MFD1_RBUTTONS);
oapiTriggerPanelRedrawArea (0, AID_MFD2_LBUTTONS);
oapiRegisterPanelArea (AID_PODANGLESWITCH,    _R( 521, 263, 571);

[Snip]

 Matching lines: 40    Matching files: 4    Total files searched: 4


Bingo...

Tient voila qui est intteressant... "RedrawPanel_MFDButton"  On a "panel" et "button" la dedans en plus de "redraw"
qui veut dire "re-afficher"

dans le C++ il suffit de cliquer sur une ligne de resultat de recherche pour arriver sur la ligne trouvée. Cliquons donc:



Houlalalala... aucuns commentaires... c'est un peu nébuleux ca... visiblement ca affiche un texte
"SetTextColor" mais c'est pas super satisfaisant... cliquons donc sur une autre ligne... tient "oapiRegisterPanelArea"
m'a l'air pas mal... "Register" "Panel" "Area" enregistrer une zone de panel ? Double Cliquons:

Bingo ! "Load a 2d instrument panel"



On est dans la zone point "Z" visiblement, on tourne autour comme un tigre assoiffé, on a le DEBUT DE LA PELOTE
c'est le moment de tirer sur le fil. La, le gars qui connait un peu le C++ a un avantage, il voit tout de suite quel
fonctions sont spécifique a Orbiter (oapiRegisterPanelArea) et lequel sont du pur C (LoadBitmap) Pas grave, le
detective fait feu de tout bois et utilise sa tête.

Visiblement ce "oapiRegisterPanelArea" enregistre des zones avec des coordonées en rapport avec les boutons et
c'est la fonction qui ce repete le plus... c'est le moment de regarder dans la doc.  D'abord pour voir si c'est bien un fil
de la pelote, et ensuite pour comprendre un peu comment ca s'utilise ca. On aurait pu commencer par
chercher "panel" dans la doc c'est vrai mais grand auraient été les chances de tomber sur 12'000 fonction rare
et la on a un exemple pratique et on sait ou chercher dans la doc pour comprendre cet exemple.

Ouvrons donc API_Reference.pdf qui est LA bible. (y en a pas d'autre) et cherchons "oapiRegisterPanelArea"



Ok, ca defini des zones pour cliquer... c'est un peu nébuleux pour le noobs, lire une doc ca s'apprend aussi
et ca illustre ce que je disais: si on avais regardé la dedans en premier on ne serait strictement pas plus avancé.

Bon, rien de mieux que la pratique... on veux rajouter un bouton ? ben quesqu'on attend ? on va mettre la mains a la pâte, on va ce rajouter une petit bouton tout de go et on verra bien.

On copie une ligne qui fait ce genre de truc visiblement on la colle en dessous et on compile "pour voir"

Copions /collons en dessous:
oapiRegisterPanelArea (AID_PODANGLESWITCH,    _R( 521, 263, 571, 307), PANEL_REDRAW_MOUSE, [SNIP]

"PODANGLESWITCH" ca a une bonne gueule ca surtout qu'on vois dans le SHuttla ou est ce bouton:


On change un peut les coordonnée vu qu'on veut mettre un bouton a coté et pas sur l'autre :
oapiRegisterPanelArea (AID_PODANGLESWITCH,    _R( 421, 163, 471, 207), PANEL_REDRAW_MOUSE, [SNIP]

(j'ai simplement soustrait 100 a chaque valeur)

Et on COMPIIIIILE l'exemple ! a dieux Va ! avec un peut de chance il va tout faire automatiquement ce que je veux !



WHOLOOOO La compilation a marché, note qu'une erreur de compile aurait été informative aussi ! ca aurait
été un file de la pelote... On oublie pas de copier le Shuttla.dll crée dans Orbiter ou mieux, on dis au compilateur
de le mettre directement dans C:\Orbiter2006\Modules\Shuttlea.dll (mais ca c'est du setting de compile, c'est
pas le but de ce post)

Lancons donc orbiter pour voir notre modif...  (a ce stade j'ai pas testé je decouvre avec vous :) )


Mhhhh rien ! désesperant.... on clique un peut sur tout les boutons... on flaire, on reflechi... voyons voir...
on a soustrait 100 a toutes les coordonnées... notre bouton ce trouve donc 100 pixel plus haut a gauche...
Tient y a un truc bizarre le en haut:



Comme un bout de truc superposé ou mal affiché... ce serait t'y pas notre bouton ? :wonder:

Pour confirmer vu qu'on a une place libre un peut a droite on va changer les coordoonées, ce coup ci
on le pousse de 50 pixel a droite simplement:
oapiRegisterPanelArea (AID_PODANGLESWITCH,    _R( 571, 263, 621, 307), PANEL_REDRAW_MOUSE, [SNIP]

On compile et  on lance Orbiter...



OOOOOOOOHHHH Notre premier bouton dans Orbiter :love:
Et en plus ca marche quand on clique dessus.... mignon comme tout.

Bon c'est bien joli tout ca... mais on veux NOTRE bouton a nous et pas une copie... quel est la caracteristique ?
ben le nom "AID_PODANGLESWITCH" donc on mets a la place "MONBOUTON_NA"

oapiRegisterPanelArea (MONBOUTON_NA,    _R( 571, 263, 621, 307), PANEL_REDRAW_MOUSE, [SNIP]

Et on compile...

Ooooohhh :sad:
error C2065: 'MONBOUTON_NA' : undeclared identifier

"undeclarer identifier" identifiant pas declaré... c'est donc que ces nom sont declarer quelque part ?

Ici une fonction chouette du VC avec un clique droit on peut chercher ou sont declaré nos "tiroirs", variables,
identifiant, voir on sont appellée nos fonctions etc etc... on clique droit sur "AID_PODANGLESWITCH"



Et on tombe dessus... A rome faisont comme les romains... on va declarer notre truc a nous en dessous...
poussez vous les gars:



Youpiiiie ca compile .... !!!!  Et on LAAANCE Orbiter.... :eek:

...

Les gars... :sad: le bouton a disparu :sad:... passez moi la corde...

Et oui... c'est comme ca la vie.... Bon on desespere pas c'est exactement comme avant...
C'est quoi la caracteristique UNIQUE des ces zones ? elle on toutes un NOM... "AID_BIDULE" "AID_MACHIN"
c'est bien qu'il y a des choses en rapport avec ce nom quelque part dans le code !!?.... donc on recherche
notre nom "AID_PODANGLESWITCH" soit par bouton droit "find all references" soit par recherche normale...



Et ben voilaaa ! pas de quoi ce pendre hein ? la dedans la premiere et la derniere ligne on connais
un c'est la ligne "registerpanel" et l'autre la definition ou on a rajouté notre "MONBOUTON_NA"
L'en reste deux...

On clique dessus, on tombe sur deux fonctions ou zone de code, un c'est pour changer les valeurs
quand on clique l'autre c'est pour afficher le bouton, le code ets pas super clair pour un noobs
mais c'est exactement comme avant, on fouine, on recherche on utilise le bouton droit pour voir
ou vont nos variable etc etc... on duplique, on colle... et on finira bien par y arriver....


OH punaise tout ca pour un boutons ? C'est la merde ton systeme Dan !!! :sad:



Ben non.... dans l'intervalle vous avez pris un cours accelléré de C++ et appris le plus important:

Un programmeur c'est un detective, la logique, la deduction, le flair, savoir comment chercher, comment devider une pelote

VOILA LE PLUS IMPORTANT !!!!!!!!!

Personne ne peut apprendre entierement le C++, personne ne le connait entierement avec toute les API
existante c'est IMPOSSIBLE !

A force d'experience j'ai un flair exceptionnellement aiguisé et je sais ou chercher, voila la différence !!!!
Voila pourquoi que ce soit du PHP du C du Banana ou du Z++ je me demmerde partout et je les apprends tous
en meme temps que je crée des trucs avec...

Et voila ce que vous devez apprendre de plus important !

Apres... vous pouvez lire des cours... ca fait pas de mal... Il faut quand même quelques bases ;)

Mais tout le monde comprend ca quand même ? :)

if(Detective==0||Feignant==1)
   RetourneDansTonCoin();
else
   FaisAddonOrbiter();




Message modifié ( 20-12-2006 17:14 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #124 - 20 December 2006, 16:41:56
Pour completer le post ci-dessus j'ajouterais ceci: pour rajouter mon premier bouton dans Orbiter ca m'a pris une
heure avec plus ou moins cette methode. Ni plus ni moins qu'un autre gars qui ce serait tapé la doc, je dirais même
plutot moins... Les boutons ce n'est pas ce qu'il y a de plus facile a ajouter.

Mais le principe est valable pour tout, vous voulez animer un train ? cherchez "gear" et dévidez la pelote.
changez le mesh ? tapez 3615 ula... ca marche tout comme ca. Un immense boulot de Detective et
de dévidage de pelote. Et n'oubliez pas qu'a chaque fois vous apprenez des choses !

C'est aussi ca qui est passionnant !

Pacque les doc... pfff c'est une aide du detective, c'est important comme référence, mais jamais personne
n'a appris la programmation en lisant les docs...

Dan



Message modifié ( 20-12-2006 16:52 )