Page 4 of 6

Re: Aide pour un programme en C

Unread postPosted: 26 Mar 2011, 15:24
by Lionel Debroux
Comment affiches-tu le double ?

Re: Aide pour un programme en C

Unread postPosted: 26 Mar 2011, 15:45
by Folco
(en affichant deux fois le simple :%): )

Pardon ^^ Tu as regardé la doc de printf ? Y sont décrites toutes les options de formatage de données pour un affichage justement.

Re: Aide pour un programme en C

Unread postPosted: 26 Mar 2011, 19:21
by Loulou 54
J'aimerais bien tester ton prog, Kiligolo ! :): Mais je ne trouve pas le lien de téléchargement ! :s:

Re: Aide pour un programme en C

Unread postPosted: 26 Mar 2011, 22:18
by Kiligolo
Regarde ma signature! :D:

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 11:55
by Kiligolo
Bonjour,

J'ai un problème avec le menu de mon programme (Calcul Mental): pour choisir une option, il faut la sélectionner avec la flèche (voir ma signature). Elle s'affiche bien sur VTI (OS 2.09, HW2) mais pas sur ma Titanium (OS 3.10, HW4)! J'ai essayé preOS et Ghostbuster mais ça n'a pas marché...
On peut toujours choisir les options mais il faut le faire à l'aveuglette. Voici le code qui permet de sélectionner une option:
 
Show/Hide spoilerAfficher/Masquer le spoiler
unsigned char fleche[] = {0b11000000,
0b11110000,
0b10001100,
0b10000011,
0b10000011,
0b10001100,
0b11110000,
0b11000000,
};
//...

Sprite8(2, posS, 8, fleche, LCD_MEM, A_REVERSE); //posS = position y de la flèche
key = ngetchx(); //key = variable qui contient le code touche
Sprite8(2, posS, 8, fleche, LCD_MEM, A_NORMAL);
//...

Le menu est un type BITMAP (fond noir) et c'est pour ça que je ne l'affiche pas à chaque fois que l'utilisateur appuie sur une touche, c'est trop lent (surtout avec des niveaux de gris). J'ai essayé ceci:
 
Show/Hide spoilerAfficher/Masquer le spoiler
for (i = 0; i {
Sprite8(2, posS, 8, fleche, LCD_MEM, A_REVERSE);
}
key = ngetchx();

La sprite c'est correctement affichée pendant un laps de temps puis s'est effacée...

Si quelqu'un saurait comment résoudre ce problème ça serait gentil (je crois qu'il vient de ngetchx() mais je ne suis pas sûr). :):

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 12:11
by Folco
Je ne crois pas que ça vienne de ngetchx().

Par contre, tu dessines directement à LCD_MEM, c'est à dire à l'adresse 0x4C00.
Sur VTI, donc sur HW1, LCD_MEM est bien utilisé dans le double buffering.
Sur HW3/4, pas sûr. Faudrait que je regarde comment c'est codé dans gray.s, mais si les deux plans sont alloués sur le heap, tu dessines au final sur une partie jamais affichée à l'écran.

Remplace LCD_MEM par GrayGetPlane(LIGHT_PLANE/DARK_PLANE) ou assimilé, je ne connais pas les noms. Je veux parler des adresses des plans clair et foncé.


--------


Par contre, pourquoi afficher 2500 fois ton sprite à la même place, surtout en A_REVERSE, qui n'est pas documenté dans Sprite8 ? Tu dois utiliser SPRT_* à la place, dans le mode désiré.

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 13:13
by Folco
Autre chose qui me vient : il serait peut-être beaucoup plus simple de faire quelque chose comme ça :

Code: Select all
SetAMSPlane(LIGHT_PLANE);
BitmapPut(x, y, ImageDeFond_CLAIR, A_REPLACE);
SetAMSPlane(DARK_PLANE);
BitmapPut(x, y, ImageDeFond_FONCE, A_REPLACE);


short Loop = TRUE;
short key;

while (Loop)
{
    Sprite8(x, y, Curseur, SPRT_XOR);
    key = ngetchx();
    Sprite8(x, y, Curseur, SPRT_XOR);

    if (key == KEY_DOWN) {};
    if (key == ...) {};
    ....
    if ((key == KEY_ENTER) or (key == KEY_ESC))
        Loop = FALSE;
}

Ce n'est qu'une manière de faire, en pseudo-C, à ne surtout pas recopier bêtement ^^. Tu affiches une fois tout le fond, et tu affiches ton curseur en XOR avant et après le ngetchx (comme ça il est effacé en restaurant le fond pendant le traitement du clavier que tu fais).
= Ca évite de tout redessiner, c'est hyper rapide et simple.

J'espère en tout cas que j'ai bien compris ce que tu veux.

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 16:44
by Kiligolo
Folco wrote:Je ne crois pas que ça vienne de ngetchx().

Ah ok!

Folco wrote:Par contre, tu dessines directement à LCD_MEM, c'est à dire à l'adresse 0x4C00.
Sur VTI, donc sur HW1, LCD_MEM est bien utilisé dans le double buffering.
Sur HW3/4, pas sûr. Faudrait que je regarde comment c'est codé dans gray.s, mais si les deux plans sont alloués sur le heap, tu dessines au final sur une partie jamais affichée à l'écran.

Tu parles du Graph buffer qui s'affiche sur l'écran qu'avec une fonction? (sinon la ROM de vti que j'utilise est HW2 mais je pense que ça ne change rien ^^)

Folco wrote:Par contre, pourquoi afficher 2500 fois ton sprite à la même place, surtout en A_REVERSE, qui n'est pas documenté dans Sprite8 ? Tu dois utiliser SPRT_* à la place, dans le mode désiré.

J'ai fait ceci pour bien vérifier que le sprite s'affichait (puisqu'il s’effaçait après...). Sinon le A_REVERSE marche! :):

Folco wrote:Autre chose qui me vient : il serait peut-être beaucoup plus simple de faire quelque chose comme ça :
Code: Select all
SetAMSPlane(LIGHT_PLANE);
BitmapPut(x, y, ImageDeFond_CLAIR, A_REPLACE);
SetAMSPlane(DARK_PLANE);
BitmapPut(x, y, ImageDeFond_FONCE, A_REPLACE);


short Loop = TRUE;
short key;

while (Loop)
{
    Sprite8(x, y, Curseur, SPRT_XOR);
    key = ngetchx();
    Sprite8(x, y, Curseur, SPRT_XOR);

    if (key == KEY_DOWN) {};
    if (key == ...) {};
    ....
    if ((key == KEY_ENTER) or (key == KEY_ESC))
        Loop = FALSE;
}

Ce n'est qu'une manière de faire, en pseudo-C, à ne surtout pas recopier bêtement ^^. Tu affiches une fois tout le fond, et tu affiches ton curseur en XOR avant et après le ngetchx (comme ça il est effacé en restaurant le fond pendant le traitement du clavier que tu fais).
= Ca évite de tout redessiner, c'est hyper rapide et simple.
J'espère en tout cas que j'ai bien compris ce que tu veux.

Merci je vais essayer (surtout faire le fond gris foncé/clair avant il était en noir/gris foncé :D: ).

Bon en tout cas merci! :#love#:


Merci, ça marche!!!! :D:


Lionel Debroux wrote:Comment affiches-tu le double ?


Folco wrote:(en affichant deux fois le simple :%): )

Pardon ^^ Tu as regardé la doc de printf ? Y sont décrites toutes les options de formatage de données pour un affichage justement.

Ah je suis désolé je n'avais pas vu vos posts! :s: (notés comme lus par forum actif)
Je vais y jeter un coup d’œil!

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 17:51
by Folco
Sinon le A_REVERSE marche!

Oui, évidemment que A_REVERSE marche, voici comment ça fonctionne :

Dans la doc de GCC4TI, on lit ça à la page Attrs :
Code: Select all
enum Attrs {A_REVERSE, A_NORMAL, A_XOR, A_SHADED, A_REPLACE, A_OR, A_AND, A_THICK1, A_SHADE_V, A_SHADE_H, A_SHADE_NS, A_SHADE_PS};

Ce qui veut dire en clair que A_REVERSE vaut 0.
Et à la page SprtModes, on a ça :
Code: Select all
enum SprtModes {SPRT_XOR, SPRT_OR, SPRT_AND, SPRT_RPLC};

Et ici, c'est SPRT_XOR qui vaut 0.

Donc en fait, tu obtiens du code qui marche en passant 0 comme argument à Sprite8(). Seulement, pour être propre, tu dois utiliser le symbole défini pour Sprite*(), et non pour BitmapPut(). Parce que sinon, tu pourrais aussi utiliser F_4x6 qui vaut également zéro, mais qui désigne la petite police dans les fonctions de chaines de caractères.

Voilà, j'espère que j'ai été clair :%):

Re: Aide pour un programme en C

Unread postPosted: 28 Mar 2011, 17:55
by Kiligolo
Bien vu! :D:
Et c'est pour ça que A_NORMAL marche aussi (avec le SPRT_OR)!
En tout cas merci ça marche j'ai pu finir une nouvelle activité pour mon programme! (surprise...)