Accueil

CPC


 Dev C sur CPC :

  • le C sur CPC
  • SDCC débuter
  • fichier BAT pour compiler
  • Dessiner Sur CPC
  • Optimiser le dessin
  • Ecrire du texte
  • Lire un fichier
  • Ecrire un fichier
  • Swap d'écran
  • CLS ultra rapide
  • H line
  • Attaquer le CRTC
  • Full Overscan
  • Put pixel très rapide
  • Afficher une image
  • Slide show 1
  • Bézier
  • faire un fichier pour Bézier

  • Quelque fonctions utile

  • Animation
  • 3D
  • Raster
  • Manche a balais

    Le plan du Site

  •  
      Ici les nouvelle du site  
     
    Recherche ?
    Saissisez un mot clé

     
      Quelques chiffres
    Visiteurs:4526
    Visiteurs aujourd'hui:2
     
     
    Me contacter
    Donnez votre avis
     
    Le site de Steph : Le CPC

    Animation par couleur et scrool


    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%<15 THEN xd%=-xd%:dr=-dr
    		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<11 THEN yd=2.5	
    		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 ... ;-)