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++] J'arrive pas à oapiBlter![résolu]  (Read 2158 times)

0 Members and 1 Guest are viewing this topic.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
08 September 2008, 07:31:16
Je sèche sur les oapiBlt, j'ai réussi sans aucun problème à faire apparaitre du texte, des rectangle() et autre
roundrect() mais pour les surfaces copiées, je n'arrive pas à les faire apparaitre.

Si quelqu'un veut bien m'aider merci ;)

Le bouton en question est un simple switch à deux positions, haut/bas qui change la valeur d'un int.

Par étape voilà ce que j'ai fait:

1- déclarer ma surface sur le panel ou on va placer la copie (clbkload2dpanel -> switch(id)->case0)
Code: [Select]
// BO anim lock Switch
oapiRegisterPanelArea (AID_SW_BO_ANIMS,
_R(498, 133, 541, 178), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN,PANEL_MAP_BACKGROUND);
Le bouton ne rempli pas la surface, il a des parties transparentes, donc je pense que PANEL_MAP_BACKGROUND est la bonne option.
au header:
Code: [Select]
...
#define AID_SW_BO_ANIMS 14

2/ je déclare la surface que je vais copier:
Code: [Select]
void Korabl::InitPanel (int panel)
{
//int i;
switch (panel)
{
case 0:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SW_BO_ANIMS)); <- C'est celle-là
srf[1] = oapiCreateSurface (LOADBMP (IDB_SW_LR));
break;
}
}
accompagné d'une ribambelle de nécessité:
au constructeur:
Code: [Select]
// surface oapiBltées
for (i = 0; i < nsurf; i++)
srf[ i ] = 0;
Code: [Select]
void Korabl::ReleaseSurfaces()
{
for (int i = 0; i < nsurf; i++)
if (srf[ i] )
{
oapiDestroySurface (srf[ i ]);
srf[ i ] = 0;
}
}
Sans oublier ReleaseSurface() et InitPanel(id) dans clbkload2dPanel

3/ je met en place ce qui va se passer dans clbkPanelMouseEvent
Code: [Select]
...
case AID_SW_BO_ANIMS:
PlayVesselWave3(MyID,SWITCH);
if (my < 22) <- le bouton faist 44 pixel de haut
BO_animlock=0;
else
BO_animlock=1;
return 1;

4/je donne les infos sur le redraw dans clbkPanelRedrawEvent
Code: [Select]
case AID_SW_BO_ANIMS:
if(BO_animlock==0)
oapiBlt (surf, srf[0], 0, 0, 88, 0, 44, 44,0xfe00fe);
else  
oapiBlt (surf, srf[0], 0, 0, 44, 0, 44, 44,0xfe00fe);
return true;

5/ maintennant on a besoin de oapiTriggerRedrawArea
Avec mon int pas vraiment le choix, vu que je n'ai aucune fonction ni animation liée, j'ai mis
Code: [Select]
oapiTriggerPanelRedrawArea (0,AID_SW_BO_ANIMS);
déclenché avec la touche qui a la fonction équivalente à un clic sur le bouton (il arme les boutons des
animations qui eux fonctionnent mais n'utilisent aucun bitmap) et également dans le  prestep avec la condition d'avoir le focus...ce qui me plait moins.
EDIT2: pas besoin de çà, le bouton n'a besoin d'être mis à jour que lorsqu'on clique dessus où à l'initialisation du panel, ce n'est pas comme mes boutons pour les animations qui changent de couleur suvant l'état de l'anime.


Mais quoi qu'il arrive pour l'instant mon bitmap n'apparait pas.
J'ai testé la surface sur laquelle j'applique le bitmap en virant PANEL_MAP_BACKGROUND, elle apparait bien avec le
premier bout de bitmap qui lui passe sous la main.

Je suis bloqué là-dessus et je n'arrive pas à capter ce qu'il manque ou doit être corrigé, en débug, rien ne bronche,
pas une seul valeur semble ne pas être correcte (pour moi). Le bouton lui-même marche, la valeur passe bien de 0 à
1 si je clique au bon endroit.

Voilà, je n'ai plus qu'un chose à dire :help:

EDIT: application des contre-mesures pour les [ i ] mangés par le forum, je laisse le fumeur tranquille parcontre :)



Message modifié ( 09-09-2008 01:25 )

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

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 08 September 2008, 08:14:22
T'a mis un coup de break point sur "if(BO_animlock==0)" et controllé ton handle surf[] et les values ?


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #2 - 08 September 2008, 08:33:10
oui oui, je vais faire de captures ... je suis pas sûr, le debug je ne comprend pas tout le temps.

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

no matter.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #3 - 08 September 2008, 08:51:18
capture debug --> voir plus bas

Panel_map_none :


Panel_map_background :




Message modifié ( 08-09-2008 09:20 )

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

no matter.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #4 - 08 September 2008, 09:07:53
baaaah, j'ai marqué srf au lieu de srf[0] dans mes oapiBlt... j'aurais bien aimé que la solution soit aussi simple mais ce
n'est pas le cas.
Même résultat avec srf[0] que j'avais déjà testé (je debugge et remanie mon code depuis cette nuit, j'avoue avoir
passablement envie de taper sur mon pc avec un burin >_<)



Edit par Dan: j'ai enlevé les images...

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

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #5 - 08 September 2008, 10:32:18
A priori je dirais la taille du blit, Orbiter DETESTE qu'on lui passe pas la bonne taille et manifeste de la mauvaise
volonté.

L'a t'a 43 pixel en X et 45 en Y

Code: [Select]
oapiRegisterPanelArea (AID_SW_BO_ANIMS,
_R(498, 133, 541, 178 ), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN,PANEL_MAP_BACKGROUND);

Et la tu lui passe 44x44...

Code: [Select]
oapiBlt (surf, srf[0], 0, 0, 88, 0, 44, 44,0xfe00fe);
Essaie avec : (ou modifie le RegisterPanel)

Code: [Select]
oapiBlt (surf, srf[0], 0, 0, 88, 0, 43, 45,0xfe00fe);
ou 1 pixel de moins, mais je dirais que la cause est la, Orbiter n'aime pas du tout ce genre de truc me suis déja
arraché quelques cheveux dessus.

A++

Dan



Message modifié ( 08-09-2008 10:33 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #6 - 08 September 2008, 12:07:52
Note que si t'a une petée de bouton il vaudrais mieux faire une classe qui automatise les tâches, avec picto on avait
fait ca, une classe complete qui s'occupe de tout.

Pascque les panels.... :sick:

C'est vraiment du trivial fouilli bordelique au possible dès que t'arrive vers 10 boutons. Le code devient illisible. Si tu dois modifier genre "tient je vais pousser un peu pour faire de la place" la t'est en galère.

Problème est que pour faire cette classe il faudrais que tu connaisse deja bien les panel pour voir comment faire.
Je sais pas si picto a une version propre de nos trouvailles ?

De mon coté si un jour je refais un panel ce sera une classe... trop la chienlit les panels !

Code: [Select]
Panel->AddSwitchButton(blabla)

clbkload2dPanel
Panel->ProcessAllButtonPanel();

clbkPanelMouseEvent
If(Panel->ButtonPressed(MONBOUTONPOWER)==1)
{
   blabla
}


Le but serait d'avoir qu'une declaration "addbouton" avec en parametre, l'image, les coordonnées, les etats etc etc
Le load, delete, redraw et mouse ce serait tout auto. Une fois fait rajouter un bouton c'est juste une question
d'une ligne "AddBouton" en plus. (et un ou deux "GetPressed" pour qu'ils servent ;) )

J'éspère que tu tu utilise deja la classe saverestore ? pasque au dela de dix variables :sick: :badsmile:

http://orbiter.dansteph.com/forum/index.php?topic=6381.msg96441#msg96441

A++

Dan



Message modifié ( 08-09-2008 13:16 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #7 - 08 September 2008, 18:16:02
Quote
Pascque les panels....
oui :sick:, sans parler de l'exemple du deltaglider, où je rencontre des trucs qui me rendent soucieux comme ce
return hBmp!=NULL; ... des return et des break là où j'aurais mis des break et des return :wonder:

Quote
A priori je dirais la taille du blit, Orbiter DETESTE qu'on lui passe pas la bonne taille et manifeste de la
mauvaise volonté.
J'espère que c'est çà, j'en un peu marre d'être sur ce bouton-là.

Quote
classe saverestore
En général, oui, depuis peu mais je ne l'ai pas encore implanté sur ce code, ce n'est que le début...Mais je te rassure,
mon premier panel sera loin de la complexité qu'avait pensé Picto pour irridium, aucun slider, le seul truc qui sera plus
complexe c'est pour les fréquences de navigation... là j'ai moins d'idées, et aucun exemple.

Bah, je suis complètement néophyte avec les panels, même un cockpit virtuel est de la rigolade à côté d'un panel!
J'ai relu les discussions entre toi et picto sur les panels, je vois ce dont tu parles mais je ne pige guère pour
l'instant...faudrait déjà arriver à bien comprendre le panel dans son ensemble.
Comme je le disais, je n'ai eu aucun problème tant que j'ai dessiné avec ce que je connais, textout, rectangle,
roundrect mais lorsque j'ai voulu un bitmap, çà m'a pris la nuit et çà ne fonctionne pas encore ^^

Bon, je m'en vais parlementer avec mon oapiBlt et ces pixel à ajuster



Message modifié ( 08-09-2008 18:16 )

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

no matter.

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #8 - 08 September 2008, 18:36:13
Merci, Dan, çà marche :bave: ;) :wor:

1 pixel en x et 1 pixel en y de différence et voilà de quoi perturber l'histoire... j'aurais pu chercher longtemps...dire
que mon code est bon depuis hier :drink:

voilà,  çà fait un bon tuto pour un bouton simple ^^

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

no matter.

Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #9 - 08 September 2008, 19:20:47
Ah oué, faut faire très très gaffe aux dimensions :)



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #10 - 08 September 2008, 22:38:06
Quote
no matter a écrit:
1 pixel en x et 1 pixel en y de différence et voilà de quoi perturber l'histoire... j'aurais pu chercher longtemps...dire
que mon code est bon depuis hier :drink:

Raison de plus pour ecrire une classe qui automatise, plus j'avance plus je privilégie le code qui évite l'erreur
humaine. Aun final c'est un gain de temps très net sans compter les bugs en moins.

Pour ca Orbiter est un formidable outil d'apprentissage de la prog, on peut programmer comme un goret ca passe
mais on vois vite les limites, il nous oblige a nous améliorer sans risque avec des cas pratique.

Sans Orbiter jamais je n'aurais pu faire mon shareware, c'est lui qui m'a perfectionné jusqu'au bon niveau.

A++

Dan

« Last Edit: 08 September 2008, 23:19:39 by DanSteph »

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #11 - 08 September 2008, 23:19:39
Quote
Pour ca Orbiter est un formidable outil d'apprentissage de la prog, on peut programmer comme un goret ca passe
mais on vois vite les limites, il nous oblige a nous améliorer sans risque avec des cas pratique.
C'est mon avis également, on saisi vite la nécessité, par exemple, d'un handle d'être toujours valide ou null, on voit
également bien le fonctionnement de son module.
Avant les module pour orbiter, le c++ me paraissait plus compliqué et un peu inaccessible. Maintenant, çà reste dur
mais accessible et interessant même.


« Last Edit: 08 September 2008, 23:19:39 by no matter »
------------

no matter.