Page 1 of 1

Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 05 Feb 2017, 19:06
by Wistaro
Bonjour à tous,

Vous avez peut-être commencé à programmer en langage C sur votre calculatrice, et vous bloquez sur un code qui ne fonctionne pas? Vous avez des ram cleared intempestifs? Vous avez tout essayé et rien ne fonctionne?

Pas de problème.

Ici, vous pourrez poser votre question ou expliquer votre souci à l'ensemble de la communauté.
Les autres internautes se chargeront de vous répondre!

Souvenez-vous, il n'y a pas de questions bêtes :)

Ce topic est dédié aux questions/problèmes et n'est pas destiné à vous faire le programme de A à Z.
Les membres peuvent vous débloquer, mais ils ne vous donnerons jamais le code "clef en main"!


Retrouvez un tutoriel en français sur le langage C ici: viewtopic.php?f=12&t=18775 ou en anglais ici:

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 11 Feb 2017, 18:57
by Wistaro
Bon j'inaugure ce forum avec un question qui peut sembler bête mais qui me pose problème.

Mon souci est très simple. Je souhaite déplacer un/plusieurs sprites sur un autre assemblage de sprite.

On m'a expliqué (et je me suis renseigné) qu'il fallait utiliser la méthode du "double-buffering" pour éviter les traces laissées par le passage du sprite.

Malheureusement, je dois sûrement mal m'y prendre.
Voici comment je procède:
Le curseur est le sprite que l'on souhaite faire bouger par dessus.

Code: Select all
On récupère la fenêtre dans un sprite de la taille de l'écran dans un pointeur "tototo"
Affichage en transparence du curseur à la position du curseur
Boucle While(){

     si fleche haut:
            Incrémentation du compteur pour le curseur
            Affichage du sprite tototo
            Affichage en transparence du curseur à la nouvelle position
            Affichage du sprite tototo
            Affichage en transparence du curseur à la nouvelle position
     FinSi
     Si fleche bas: [...] // idem
     Si fleche gauche: [...] //idem
     Si fleche droite: [...]  //idem

           
}


Après de nombreux tests infructueux, je fais appel à vous :p
Auriez-vous une solution? Ma logique n'est-elle pas la bonne?

Merci!

(PS: le code est disponible ici en read/write: https://tiplanet.org/pb/?id=11600_14853 ... ile=main.c )

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 12 Feb 2017, 03:15
by MateoConLechuga
I modified your main function code so that way you can see how to do it :) There isn't any double buffering, but if you have questions on how to do it feel free to post. Enjoy!

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 13 Feb 2017, 16:08
by Wistaro
MateoConLechuga wrote:I modified your main function code so that way you can see how to do it :) There isn't any double buffering, but if you have questions on how to do it feel free to post. Enjoy!


Big thanks I understand better :)

I just add "gfx_GetSprite(behind_cursor, cursor_x, cursor_y);" in the moving conditions, to avoid cursor "flapping" effect.

Thanks for unlocking me :)

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 09 Mar 2017, 15:59
by Litarvan
Bonjour !

Je commence la programmation C sur CE depuis peu, et j'essaie pour l'instant d'afficher un splash tout simple.
Hors, je n'arrive pas à afficher du texte et une sprite sur le même écran.

Si je dessine la sprite, le texte ensuite sera invisible.
Si je dessine la sprite, puis remet la palette de base, le texte sera visible mais la sprite avec des couleurs moches.
Si je dessine pas la sprite, le texte sera visible.
Et dans ces trois cas, le deuxième texte que je dessine est buggé.

Voilà mon code :

Code: Select all
    gfx_SetPalette(logo_gfx_pal, sizeof(logo_gfx_pal), 0);

    gfx_SetDrawBuffer();

    gfx_Sprite(logo, 50, 75);

    gfx_SetDefaultPalette(gfx_8bpp);
    gfx_SetTextFGColor(gfx_black);
    gfx_SetMonospaceFont(8);

    gfx_PrintStringXY(strcat("Paint v", VERSION), 120, 80);
    gfx_PrintStringXY("Appuyez sur une touche", 120, 110);

    gfx_SwapDraw();


Voilà le résultat de ce code (qui est le deuxième cas que j'ai décrit).

Image

Merci d'avance pour votre aide :/

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 09 Mar 2017, 20:18
by MateoConLechuga
Since you converted your image using a custom palette rather than using the default palette (xlibc) option, you have to specify the correct text foreground color. You can specify for example something like this instead:

Code: Select all
#define TEXT_FG_COLOR 254

    gfx_SetPalette(logo_gfx_pal, sizeof(logo_gfx_pal), 0);

    gfx_SetDrawBuffer();

    gfx_Sprite(logo, 50, 75);

    // gfx_SetDefaultPalette(gfx_8bpp);
    // gfx_SetTextFGColor(gfx_black);
    gfx_palette[TEXT_FG_COLOR] = gfx_RGBTo1555(0, 0, 0);
    gfx_SetTextFGColor(TEXT_FG_COLOR);
    gfx_SetMonospaceFont(8);

    // gfx_PrintStringXY(strcat("Paint v", VERSION), 120, 80); // This line is incorrect
    gfx_PrintStringXY("Appuyez sur une touche", 120, 110);

    gfx_SwapDraw();


Alternatively you can look at what colors are generated in the convpng output using the `#OutputPaletteImage` option as well, and use one of those indexes instead. Or just add the line `#Palette : xlibc`

Also, strcat doesn't work that way. You have to allocate space in your buffer to store the resulting string.

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 10 Mar 2017, 14:05
by Litarvan
Works perfectly ! Thanks a lot, your work is awesome

Re: Langage C sur ez80: Vos questions/problèmes

Unread postPosted: 10 Mar 2017, 14:07
by Adriweb
You can also use a (global) temp buffer for string operations if need be, it avois the "heavy" heap allocs, and strcat (etc.) works just fine as well