Aide pour un programme en C
Re: Aide pour un programme en C
Comment affiches-tu le double ?
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
-
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)- Posts: 6863
- Joined: 23 Dec 2009, 00:00
- Location: France
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: -
- GitHub: debrouxl
Re: Aide pour un programme en C
(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.
Pardon ^^ Tu as regardé la doc de printf ? Y sont décrites toutes les options de formatage de données pour un affichage justement.
-
Folco
Niveau 8: ER (Espèce Rare: nerd)- Posts: 150
- Joined: 23 Sep 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: anapu :p
Re: Aide pour un programme en C
J'aimerais bien tester ton prog, Kiligolo ! Mais je ne trouve pas le lien de téléchargement !
Mes programmes => ici !
-
Loulou 54Premium
Niveau 13: CU (Calculateur Universel)- Posts: 1985
- Images: 8
- Joined: 02 Aug 2009, 00:00
- Location: 54, près de Metz
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: Ingé Logiciel chez Amazon
Re: Aide pour un programme en C
Regarde ma signature!
-
Kiligolo
Niveau 11: LV (Légende Vivante)- Posts: 1465
- Joined: 17 May 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: 1reS
Re: Aide pour un programme en C
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:
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:
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).
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);
//...
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();
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).
-
Kiligolo
Niveau 11: LV (Légende Vivante)- Posts: 1465
- Joined: 17 May 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: 1reS
Re: Aide pour un programme en C
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é.
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é.
-
Folco
Niveau 8: ER (Espèce Rare: nerd)- Posts: 150
- Joined: 23 Sep 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: anapu :p
Re: Aide pour un programme en C
Autre chose qui me vient : il serait peut-être beaucoup plus simple de faire quelque chose comme ça :
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.
- 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.
-
Folco
Niveau 8: ER (Espèce Rare: nerd)- Posts: 150
- Joined: 23 Sep 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: anapu :p
Re: Aide pour un programme en C
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é ).
Bon en tout cas merci!
Merci, ça marche!!!!
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! (notés comme lus par forum actif)
Je vais y jeter un coup d’œil!
-
Kiligolo
Niveau 11: LV (Légende Vivante)- Posts: 1465
- Joined: 17 May 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: 1reS
Re: Aide pour un programme en C
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
-
Folco
Niveau 8: ER (Espèce Rare: nerd)- Posts: 150
- Joined: 23 Sep 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: anapu :p
Re: Aide pour un programme en C
Bien vu!
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...)
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...)
-
Kiligolo
Niveau 11: LV (Légende Vivante)- Posts: 1465
- Joined: 17 May 2010, 00:00
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: 1reS
Who is online
Users browsing this forum: No registered users and 2 guests