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: [C++] HUD - affichage [Résolu]  (Read 3194 times)

0 Members and 1 Guest are viewing this topic.

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
05 December 2007, 18:59:36
Salut :)

Bon, ptite question pour les bons ;) Je vais avoir besoin de faire de l'affichage dans le HUD (Indicateur qui se déplace
pour le bombardement en fonction de l'altitude, de la vitesse et donc de la distance estimée d'impact avec le sol).

Bref, pas de soucis concernant les équations, je sais quoi faire ;) En revanche, niveau HUD, et affichage, là je n'y
comprend pas grand chose. J'ai fouiné par ci par là, mais bon, sans trop comprendre tout ...

Si vous aviez une méthode pour l'affichage d'un truc de base, ça serait sympa, que je pige le principe et que je puisse
le reproduire à ma sauce.

Merci d'avance !!



Message modifié ( 09-12-2007 19:16 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #1 - 05 December 2007, 19:13:21
Tu as tout ce qu'il te faut ici ...

http://orbiter.dansteph.com/forum/index.php?topic=6368.msg96020#msg96020

HUD et Panel ... même combat. C'est du GDI .

Plein de fonctions à ta disposition dans les headers crosoft. Ellipses, rectangles, traits etc ...
C'est pas bien compliqué. Ce qui est plus difficile c'est de bien penser à créer tes surfs à
chaque frame et de ne pas oublier les refresh.

La structure pour le GDI doit être globale. Hors de ta classe.

Cherche sur le forum, il y a plein de trucs sur le GDI et les affichages.
Même une combine de Dan pour désactiver le HUD par défaut d'Orbiter et
démarrer le tien sur un joli zécran tout neuf rien que pour toi



Message modifié ( 05-12-2007 21:28 )

Pic

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #2 - 05 December 2007, 21:23:45
Trop cool ! Merci !



Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #3 - 05 December 2007, 21:46:26
Dans le header de ton addon en dehors de la classe tu met ca:


typedef struct {
   HINSTANCE hDLL;
   HFONT hFont[1];
   HPEN hPen[2];
   HBRUSH hBrush[1];
} GDIParams;
GDIParams g_Param;

Et dans un cpp en dehors de toute fonction CLBK tu met ca:


extern GDIParams g_Param={0};


Combine pour "disabler" le HUD par défaut.

// --------------------------------------------------------------
// disable generic cockpit
// --------------------------------------------------------------
bool PreludeII::clbkLoadGenericCockpit()
{

   return false;
}

Un chtit tuto bien sympathique qui va te faire gagner un peu de temps quand tu
vas bidouiller le GDI et les fonctions basiques. Le chapitre dessinons.

http://cafeine.developpez.com/access/tutoriel/paint/#LVI-C-1



Message modifié ( 05-12-2007 21:52 )

Pic

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #4 - 05 December 2007, 22:12:30
J'ai un CTD avec return false .... avec true par contre, pas de soucis ;)



Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #5 - 05 December 2007, 22:53:36
Bon, ça a l'air super compliqué tout ça !! lol
J'veux juste faire 2 ou 3 ptites lignes vertes ;) En gros, si j'ai moyennement compris, on crée des surfaces sur
lequelles on dessine ensuite. Dans votre cas, c'est surtout pour la gestion de vos panel et boutons....
Mais j'avoue ne pas trop piger comment faire pour afficher une ligne en plein milieu de l'écran en vue interne ...
Je sais pas trop par quoi commencer, c'est un peu comme lorsque je ne maitrisais pas certaines choses il y a plusieurs
mois ... je me retrouve un peu dans la mélasse, à y aller à taton ;)
Sauf que là, c'est mystique ;)



Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #6 - 06 December 2007, 00:26:29
Ah oui, excuses ...
Pour le CTD .... normal.
Il faut créer ton panel aussi.
Là je t'ai juste dit de ne pas appeller le panel générique pour pouvoir virer les  MFDs de base Orbiter.
Mais comme tu n'en as pas créé un autre .... pan CTD. Normal, il n'y a plus du tout de panel quand tu ne fais que disabler le générique. Quand tu veux passer en vue interne il faut bien qu'Orbiter ait quelque chose à manger.

Mais ça me paraissait évident que tu avais commencé par essayer de bosser
ton propre panel . En fait t'as rien foutu encore :badsmile:

Le jeu, appeller tous les callbacks nécessaires, HUD, panel, mouse etc ... qui ont un rapport mais tu ne vas réellemnt travailler que celle qui t'intéresse, à savoir la fonction callback drawHUD.



bool ton addon::clbkLoadPanel (int id)
{
   oapiSetHUDMode(HUD_SURFACE);
   HBITMAP hBmp=NULL;
   hBmp = LOADBMP(IDB_BITMAP1);
   if(!hBmp)
      return NULL;
   oapiRegisterPanelBackground (hBmp,PANEL_ATTACH_TOP, 0xffffff);
   oapiSetPanelNeighbours (-1,-1,-1,-1);
   oapiRegisterPanelArea (1 ,_R( 0,0,5,5),  PANEL_REDRAW_USER,
PANEL_MOUSE_IGNORE,PANEL_MAP_BACKGROUND);
   return true;
}
bool ton addon::clbkPanelMouseEvent (int id, int event, int mx, int my)
{
   return true;
}
bool ton addon::clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf)
{
   return true;
}



Message modifié ( 06-12-2007 00:33 )

Pic

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #7 - 06 December 2007, 15:03:26
Quote
picto wrote:
Ah oui, excuses ...
Pour le CTD .... normal.
Il faut créer ton panel aussi.
Là je t'ai juste dit de ne pas appeller le panel générique pour pouvoir virer les  MFDs de base Orbiter.
Mais comme tu n'en as pas créé un autre .... pan CTD. Normal, il n'y a plus du tout de panel quand tu ne fais que
disabler le générique. Quand tu veux passer en vue interne il faut bien qu'Orbiter ait quelque chose à manger.

Mais ça me paraissait évident que tu avais commencé par essayer de bosser
ton propre panel . En fait t'as rien foutu encore :badsmile:

Le jeu, appeller tous les callbacks nécessaires, HUD, panel, mouse etc ... qui ont un rapport mais tu ne vas réellemnt
travailler que celle qui t'intéresse, à savoir la fonction callback drawHUD.



bool ton addon::clbkLoadPanel (int id)
{
   oapiSetHUDMode(HUD_SURFACE);
   HBITMAP hBmp=NULL;
   hBmp = LOADBMP(IDB_BITMAP1);
   if(!hBmp)
      return NULL;
   oapiRegisterPanelBackground (hBmp,PANEL_ATTACH_TOP, 0xffffff);
   oapiSetPanelNeighbours (-1,-1,-1,-1);
   oapiRegisterPanelArea (1 ,_R( 0,0,5,5),  PANEL_REDRAW_USER,
PANEL_MOUSE_IGNORE,PANEL_MAP_BACKGROUND);
   return true;
}
bool ton addon::clbkPanelMouseEvent (int id, int event, int mx, int my)
{
   return true;
}
bool ton addon::clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf)
{
   return true;
}

Grave ! Que dalle ;)
Nan, j'plaisante !! En fait, je cherche toujours à piger comment ça marche tout ce bazar Je commence peu à peu à
comprendre. MFD, Panel, et "HUD", tout est lié. On crée une surf correspondant à un bitmap, sur lequel on va
dessiner ensuite ... j'ai bon ? ;)
Bref, le truc, c'est que j'ai constaté que vous travaillez un peu tous sur les panels, boutons et cie Moi, je veux juste
dessiner quelques lignes et carrés (ou triangle on s'en fou ;)) au niveau de mes lignes correspondant au pitch et bank
du vessel.
Donc, je peux utiliser un bitmap genre 1024x768 tout noir, définir le noir comme translucide, et dessiner dessus ? Si
c'est ça j'ai pigé le principe.
Après, les notions qu'il me manque, c'est genre le placement de ces surfs, la façon de tracer, mais bon, ça je
découvrirai bien au fur et à mesure ;)



Message modifié ( 06-12-2007 21:38 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #8 - 06 December 2007, 15:39:27
J'ai pas tout lu mais je vois plein de trucs tout complexes!!!
On dit : " HUD = PANEL = GDI ", je serais tenté également de dire oui mais je voudrais aussi apporter une petite
nuance.
Le HUD est différent du panel dans la mesure ou il y a un HUD par défaut et donc ses paramètres GDI sont déjà
définis et le surf est déjà crée, c'est l'écran tout entier!

En tout cas, c'est ce que j'en ai compris et çà m'a permis de faire le HUD du CTV sans passer par des surf, sans avoir à
préciser quoi que ce soit au niveau du gdi autre que le linkage avec gdi.lib.

En gros, tout se passe dans clbkDrawHUD, avec des RectFill des TextOut et autres fonction gdi.

Pour certains truc, il aurait quand même fallu que je définisse d'autre paramètres pour le gdi si par exemple j'avais
voulu utiliser plusieurs "brush" différentes ou même une autre police que celle employée par défaut.

Voilà, ce n'étais que quelques centimes d'euro de plus ;)



Message modifié ( 06-12-2007 15:39 )

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

no matter.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #9 - 06 December 2007, 15:51:13

Je regarde dans les projets si j'ai un truc basique qui utilise le HUD sans tout le reste.
Boulinium, c'est pas la peine, le temps de démêler l'échevau (pas les cheveux ah ah :) )
tu auras fini de comprendre en partant de zéro.

En plus, l'est bourré de bugs d'affichage justement. :sad:
Mais NoMatter a raison en ce qui concerne l'écran.


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #10 - 06 December 2007, 15:58:38
Quote
Donc, je peux utiliser un bitmap genre 1024x768 tout noir, définir le noir comme translucide, et dessiner
dessus ? Si c'est ça j'ai pigé le principe.

Non, pas pour le HUD
Comme dit NoMatter, la surf existe.


Pic

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #11 - 06 December 2007, 16:18:09
Si tu veux des exemples, dans le SDK, il y a le HUD du DeltaGlider qui fait apparaitre l'état du train
d'atterrissage par trois cubes qui peuvent clignoter. Du côté du shuttleA, il y a aussi un HUD assez
simple.

J'ai bien le HUD du CTV mais il y a surtout du texte, rien que tu ne trouveras pas dans les
exemples venant du SDK.



Message modifié ( 06-12-2007 16:20 )

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

no matter.

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #12 - 06 December 2007, 21:17:46
Super, ça m'arrange tout ça ;) Je vais jeter un oeil sur tout ça ... ;)



Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #13 - 07 December 2007, 07:39:07
Ok, ça marche, j'arrive à affichr qulques trucs c cool ;) Merci à vous


« Last Edit: 07 December 2007, 07:39:07 by brainstorm »