CODINGSDCC TUT'S PAR STEPHBB75 ★ Animation par couleur et scrool ★

Sdcc - 13 - Animation Par Couleur et ScroolCoding Sdcc Tut's Par Stephbb75

Animation par couleur et scroll

Faire une animation sur CPC il n'y a pas 50 solutions, la 1er, c'est de faire cela avec des sprites, la seconde le faire avec une image et un cycle de couleurs, on peut le faire avec 1 ou deux écrans que l'on vas swaper, mais cela est vite limité.
Les autres solutions, sur CPC on oublie, la lecture de DivX … :-)
Je vais donc vous présenter quelques animation du type cycle de couleurs et sprite.
Comme je l'est déjà dit, je suis un graphite exceptionnel, donc comme c'est moi qui est fait les images, vous pourrez toujours faire bien mieux !

En fait ce qui m'a donnée envie de faire cela c'est une "demo" Boing! (Amstrad CPC) qui est une adaptation de la démo Amiga "Boing-Ball" mais écrite en BASIC !.

Vous trouverez cette démo sur youtube a cette adresse.

Elle est parue dans Amstrad Action 10 de Jul 1986, et c'est sur que pour un CPC fait en basic elle est superbe !
Comment est t'elle faite, déjà tout est dessiné par programme, on ne charge pas d'image. Dessin d'une grille pour le fond de l'image, d'un cercle pour l'ombre et d'une demis sphères pour la boule, celle ci est dessine de sorte qu'en faisant cycler des couleurs on est l'impression qu'elle tourne sur elle même.
Elle a tout de même un inconvénient, il faut 3 minutes et 35 secondes pour dessiner le tout !!!

   

 

Je vous propose de la refaire mais en C, elle utilise un cycle de couleur et un scroll fait avec le CRTC.
Il y a juste une chose que je ne refais pas, c'est le son... mais cela ne vas pas être très gênant ;-)

En étudiant le code BASIC, voici comment c'est fait :

  • initialisation des valeurs et passage en mode 0
  • trace la grille de font
  • trace un cercle (plein) pour l'ombre
  • trace une demi sphère avec cycle de couleur
  • met les bonne couleurs
  • animation
    • changement des couleurs
    • scroll l'écran
    • synchronisation avec le CRTC
    • calcule des prochaine couleur a changer


Bon, moi je vais être un peut fainéant, je ne refais pas le graphisme en code, je vais prendre une image et simplement faire le déplacement, soit du coup la démo perd un peut de sont originalité mais bon, c'est comme cela ;-)
Il n'y a ici que le main, il fait ajouter les fonctions ReadFileBin, CRTC, SetColor_s, GetChar et WaitVbl, le tout est dans le ZIP de fin.
J'ai mis en commentaire les lignes de BASIC correspondante au code.
Voici donc le code en C :

void main()
{
    char i;
    //420 d=2:'Change variable D for speed
    char d=10;
    //460 dr=1:cl=3:cl2=9:fr=1: xd%=-1:yd=-0.5:x%=30:y=15
    char dr=1;
    char cl=3;
    char cl2=9;
    char xd=-1;
    float yd=-0.5;
    char x=30;
    float y=15;
    int t=137;
    
    // passage en mode 0
    SCR_SET_MODE0_s;
    
    //Chargement de l'image
    ReadFileBin("boing.scr", 0xC000);
    
    // initialisation des encres
    //470 FOR x=2 TO 14 STEP 2:INK x,6:INK x+1,26:NEXT:
    for (i = 2; i<=14; i+=2)
    {
        SetColor_s(i, 6);
        SetColor_s(i+1, 26);
    }
    
    //480 INK 15,1:INK 1,2:INK 0,11:BORDER 11
    SetColor_s(15, 1);
    SetColor_s(1, 2);
    SetColor_s(0, 11);
    
    // Animation
    while( 1 )
    {
        if ( GetChar() != 0 )
            break;

        //500 INK cl,6:INK cl2,26
        SetColor_s(cl, 6);
        SetColor_s(cl2, 26);
        
        WaitVbl();
        //510 OUT &BC00,12:OUT &BD00,48+INT(t%/256):OUT &BC00,13:OUT &BD00,t% MOD 256:'Uses CRTC register 12 & 13 to set OFFSET for hardware scroll
        CRTC(CRTC_R12, 48 + (t/256));
        CRTC(CRTC_R13, t%256);
        
        //530 yd=yd-0.5:x%=x%+xd%
        yd = yd - 0.5;
        x = x + xd;
        
        //540 IF x%>35 OR x%        if ( (x > 35) || (x < 15) )
        {
            xd = -xd;
            dr = -dr;
        }

        //550 t%=x%+(80*y):FOR a=1 TO d:CALL &BD19:NEXT:'Use FRAME instead of CALL&BD19 on 664 & 6128
        t = x + (80*y);
        for ( i=1; i <= d; i++)
            WaitVbl();  // CALL &BD19 -> synchronisation avec le CRTC

        //560 y=y+yd:IF y        y=y+yd;
        if ( y < 11 )
            yd = 2.5;

        //580 cl=cl+dr:IF cl=15 THEN cl=3 ELSE IF cl=2 THEN cl=14:'Keeps control of INK values to give illusion of rotation
        cl = cl + dr;
        if ( cl == 15)
            cl=3;
        else if ( cl == 2)
            cl = 14;
        
        //590 cl2=cl2+dr:IF cl2=15 THEN cl2=3 ELSE IF cl2=2 THEN cl2=14
        cl2 = cl2 + dr;
        if ( cl2 == 15)
            cl2 = 3;
        else if ( cl2 == 2)
            cl2 = 14;
    }    
}


Voila, comme d'hab, le tout se trouve dans se ZIP, boing ... ;-)

stephbb75

ANNÉE: 2013
★ AUTEUR: Stephbb75

Page précédente : Sdcc - 12 - Put Pixel Tres Rapide

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 096 millisecondes et consultée 1015 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.