Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Atelier] Fond animé Space Invaders

Venez vous entraîner avec le langage de votre choix :)

    29 avril 2013 à 10:01:03

    kristofjé a écrit:

    mogolecho a écrit:

    Je suis déçu, personne ne propose d'ASM ?
    La flemme de le faire... Mais on est dans un atelier de prog, il faudrait honorer ce langage qui est la base de tous les autres n'est-ce pas :p

    Avis aux amateurs ;)

    Si ça te fait plaisir, je peux prendre un des codes en C proposé et demander à gcc de me sortir le code ASM correspondant...

    Le challenge n'est pas le même...

    • Partager sur Facebook
    • Partager sur Twitter

    Retrouvez moi sur mon blog et ma chaine Youtube !

      29 avril 2013 à 10:01:30

      Pour ma part, ce sera en perl. Je ferai peut être une autre version en mode commando (comprendre : illisible).

      #!/usr/bin/perl -w
      
      use strict;
      use warnings;
      
      while(1) {
      	system("cls");	# Replace 'cls' by 'clear' for Linux/MacOSX users
      	my $pattern = "\x20\x20\x20\x20\xdb\xdb\x20\x20\xdb\xdb\x20\x20\x20\x20\n\xa4\x20\x20\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x20\x20\n\xa4\x20\x20\xdb\xdb\x20\x20\xdb\xdb\x20\x20\xdb\xdb\x20\x20\n\xa4\x20\x20\xdb\xdb\x40\x40\xdb\xdb\x40\x40\xdb\xdb\x20\x20\n\xa4\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\n\xa4\xdb\xdb\x20\x20\xdb\xdb\x20\x20\xdb\xdb\x20\x20\xdb\xdb\n";
      	my @eyes = ("X","O","-","*");
      
      	my ($i, $space);
      	my $x = int(rand(66));	# offset x
      	my $y = int(rand(40));	# offset y
      	my $e = int(rand(4));	# random eye
      
      	for($i=0;$i<$y;$i++) { print "\n" };							
      	for($i=0;$i<$x;$i++) { print "\x20"; $space .=  "\x20" };		
      
      	$pattern =~ s/\xa4/ $space /ges;
      	$pattern =~ s/\x40/ $eyes[$e] /ges;
      
      	print "$pattern\n";
      	sleep(3);
      }


      edit :

      Code minimaliste (mais pas en perl strict) : 336 octets !

      while(1){system("cls");$p="2020db20db20200aa420dbdbdbdbdb200aa420db20db20db200aa420dbb1dbb1db200aa4dbdbdbdbdbdbdb0aa4db20db20db20db0a";$s="";$x=int(rand(66));for($i=0;$i<int(rand(40));$i++){print"\n"};for($i=0;$i<$x;$i++){print"\x20";$s.="20"};$p=~s/(20|db|b1)/$1$1/g;$p=~s/a4/$s/eg;$p=~s/([a-f0-9]{2})/chr(hex($1))/eg;print$p;sleep(3)}



      -
      Edité par elyppire 29 avril 2013 à 11:15:48

      • Partager sur Facebook
      • Partager sur Twitter
      Retrouvez-moi aussi sur Zeste de SavoirTutoriel WAMP • Nouvelle F.A.Q. PHP
      Anonyme
        29 avril 2013 à 14:39:41

        Participation en HTML/CSS/JS pour moi :

        <canvas />
        <style>
        	body{margin:0;overflow:hidden}
        </style>
        <script>
        	(function() {
        		var canvas = document.querySelector("canvas"), ctx = canvas.getContext("2d"), m = Math, round = m.round, rand = m.random,
        			w = window.innerWidth, h = window.innerHeight;
        		
        		canvas.width = w;
        		canvas.height = h;
        		
        		ctx.translate(rand() * (w - 374), rand() * (h - 320));
        		
        		ctx.fillStyle = '#' + round(rand() * 16777215).toString(16);
        		
        		for(i=0; i<42; ++i) {
        			if("  ' '   '''''  ' ' '  ' ' ' '''''''' ' ' '"[i] == "'") ctx.fillRect(54 * (i % 7), 54 * m.floor(i / 7), 50, 50);
        		}
        		
        		ctx.fillStyle = 'black';
        		ctx.fillRect(108, 54 * (2 + round(rand())), 50, 50);
        		ctx.fillRect(216, 54 * (2 + round(rand())), 50, 50);
        		
        		setTimeout(arguments.callee, 3000);
        	})();
        </script>

        Le code n'est pas des plus jolis, surtout au niveau du HTML, mais j'ai essayé de faire court ;)
        Pour tester, je l'ai hébergé sur jsbin : http://jsbin.com/iticiy

        Une fois minimifié, le code pèse 559 octets. 

        -
        Edité par Anonyme 29 avril 2013 à 15:32:34

        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2013 à 15:01:42

          le setTimeout(arguments.callee, 3000); est trés élégant, bravo ;)

          tu peux enlever le ctx.clearRect(0, 0, w, h); si tu veux, le simple fait de changer la taille du canvas suffit a reset son contenu.

          • Partager sur Facebook
          • Partager sur Twitter

          N'utilisez JAMAIS alert() pour debugger. Utilisez console.log()

          Anonyme
            29 avril 2013 à 15:30:27

            Bien vu, je n'avais plus travaillé avec canvas depuis un moment. Le problème est que arguments.callee est déprécié par le W3C (bien qu'encore supporté sur la plupart des navigateurs)...
            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2013 à 16:12:10

              oui j'ai hésité a te le dire aussi, mais bon, si tu veux faire un truc le plus ptit possible, faut s'affranchir de ça. Sinon, effectivement, c'est déprécié.
              • Partager sur Facebook
              • Partager sur Twitter

              N'utilisez JAMAIS alert() pour debugger. Utilisez console.log()

              Anonyme
                29 avril 2013 à 16:17:13

                Hey ! :)

                Voici ma participation en C sous linux et avec des couleurs :

                #include <stdio.h>
                #include <stdlib.h>
                #include <time.h>
                #include <unistd.h>
                
                #define clear system("clear") /* Efface l'ecran */
                #define couleur(nb) printf("\033[%sm", nb) /* Definis comme couleur, le nombre donne en parametre */
                
                #define COULEUR_MIN 30 /* 30 correspond au noir */
                #define COULEUR_MAX 37 /* 37 correspond au blanc */
                
                #define MAX 65
                
                #define EVER ;;
                
                void afficherForme(void);
                
                int main(void)
                {
                	int couleurAleatoire;
                	char parametre[3];
                	
                	srand((unsigned int)time(NULL));
                	
                	for(EVER)
                	{	
                		clear; /* On nettoie l'ecran */ 
                		
                		couleurAleatoire = (rand() % (COULEUR_MAX - COULEUR_MIN + 1)) + COULEUR_MIN;
                		sprintf(parametre, "%d", couleurAleatoire); /* parametre contient la couleur aleatoire */
                		
                		couleur(parametre); /* On met la couleur du texte */
                		afficherForme(); /* On affiche le space invader */
                		couleur("0"); /* On reinitialise la couleur a 0 */
                			
                		sleep(3); /* On marque une pause de 3 secondes*/
                	}
                	
                	return 0;
                }
                
                void afficherForme(void)
                {
                	char invader[6][15] = /* Forme du space invader */ 
                	{
                	"    @@  @@    ",
                	"  @@@@@@@@@@  ",
                	"  @@()@@  @@  ",
                	"  @@  @@()@@  ",
                	"@@@@@@@@@@@@@@",
                	"@@  @@  @@  @@"
                	};
                	
                	int x, y;
                	int tmp;
                	int i;
                	
                	x = rand() % (MAX + 1); /* On definit l'abscisse */ 
                	tmp = y = rand() % (MAX + 1); /* On definit l'ordonne */ 
                	
                	while(x-- > 0) /* On va a la ligne x */ 
                		printf("\n");
                	
                	for(i = 0; i < 6; i++, tmp = y) /* Pour chaque ligne du space invader */ 
                	{
                		while(tmp-- > 0) /* On va a la bonne colonne */ 
                			printf(" ");
                			
                		printf("%s\n", invader[i]); /* On affiche la ligne i du space invader */ 
                	}
                }
                



                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2013 à 17:25:23

                  Aucun fou n'a essayé en assembleur? :D
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 avril 2013 à 17:42:10

                    corto_maltese a écrit:

                    Aucun fou n'a essayé en assembleur? :D

                    On a déjà eu cette discussion pas plus tard que la page précédente...

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 avril 2013 à 18:12:02

                      lethom a écrit:

                      Ouais fin, après, y a pas moyen de limiter son code à S et utiliser un -D pour que S corresponde au code source, non ? x)

                      main2.c :

                      A

                      A compiler avec : 

                      gcc main2.c -std=c99 -D'A = #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <time.h> #define HAUTEUR_FENETRE 600 #define LARGEUR_FENETRE 1000 #define TAILLE_BLOC 50 #define NB_BLOCS_LARGEUR 7 #define NB_BLOCS_HAUTEUR 6 void sleep(int nombreDeSeconde);   int main ( int argc, char** argv ){SDL_Surface *ecran = NULL, *carre = NULL;int couleur1 = 0, couleur2 = 0, couleur3 = 0, yeux = 0, continuer = 1, i = 0;int tableauY[28] = {0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5};     int tableauX[28] = {2,4,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,0,1,2,3,4,5,6,0,2,4,6};int tableauYeuxGauche[4] = {13, 8, 8, 13};int tableauYeuxDroit[4] = {15, 10, 15, 10};SDL_Rect position, positionBloc;SDL_Init(SDL_INIT_VIDEO);srand(time(NULL));ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE);     SDL_WM_SetCaption("Space Invaders", NULL);carre = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, 32, 0, 0, 0, 0);SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); while(continuer){position.x = rand()%600;position.y = rand()%250;couleur1 = rand()%255;couleur2 = rand()%255;couleur3 = rand()%255;yeux = rand()%3;SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));for (i = 0 ; i < 29 ; i++){positionBloc.x = position.x + (tableauX[i] * 53);positionBloc.y = position.y + (tableauY[i] * 53);if (i == tableauYeuxGauche[yeux] || i == tableauYeuxDroit[yeux]){ SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));}else if (i == 8 || i == 10 || i == 13 || i == 15){SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));} else {SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, couleur1, couleur2, couleur3));} SDL_BlitSurface(carre, NULL, ecran, &positionBloc);}SDL_Flip(ecran);sleep(1);}SDL_FreeSurface(carre);SDL_Quit();return EXIT_SUCCESS; }void sleep(int nombreDeSeconde) {clock_t goal;goal = (nombreDeSeconde * CLOCKS_PER_SEC) + clock();while(goal > clock()){;}}' && ./a.out

                      PS : j'ai pas testé, c'est normal si ça marche pas ... 

                      :lol:

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Je ne visite plus ce site, si ça vous intéresse (ce qui serait très curieux), lisez ma bio.

                        29 avril 2013 à 18:54:48

                        Salut !

                        Voici ma participation écrite en Haxe (avec NME) qui m'a prise une bonne partie de la journée à réaliser :

                        Demo en ligne (Version simple)

                        Sources

                        Haxe est un langage haut-niveau multiplate-forme assez proche de l'ActionScript 3. Avec NME, un projet écrit en Haxe peut être exporté sur un nombre impressionnant de plate-formes, sans changer une seule ligne du code source. J'ai compilé et testé le fond animé sur Flash (AS3), Windows (C++), Android (C++), et Neko. Il serait possible de compiler vers l'HTML5 mais cela ne fonctionne pas chez moi (et je n'ai pas eu le temps de me pencher sur ce problème, donc tant pis pour canvas). Il est également possible de compiler vers Linux (C++), Mac (C++), Blackberry, iOS, WebOS, mais je n'ai pas pu le faire moi-même, si quelqu'un veux essayer, il peut ! ^^ Pour programmer en Haxe, je conseille fortement FlashDevelop sur Windows (le dossier contient un fichier de projet FlashDevelop). Pour installer NME (et Haxe), c'est par ici. :)

                        Un exemple de classe en Haxe :

                        package display;
                        import nme.display.Shape;
                        
                        /**
                         * Dessin rectangulaire.
                         * @author Guillaume CHAU
                         */
                        class Square extends Shape
                        {
                        	/**
                        	 * Couleur du cube.
                        	 */
                        	private var _color:Int;
                        	
                        	/**
                        	 * Largeur du cube.
                        	 */
                        	private var _virtualWidth:Float;
                        	
                        	/**
                        	 * Hauteur du cube.
                        	 */
                        	private var _virtualHeight:Float;
                        	
                        	/**
                        	 * Arrondi des coins du cube.
                        	 */
                        	private var _roundRadius:Float;
                        	
                        	/* ---------- PUBLIQUE ---------- */
                        	
                        	public function new() 
                        	{
                        		super();
                        	}
                        	
                        	public function remove():Void
                        	{
                        		if (parent != null)
                        		{
                        			parent.removeChild(this);
                        		}
                        	}
                        	
                        	/**
                        	 * Modifie la taille du dessin du cube. Recommandé s'il faut modifier la largeur et la hauteur en même temps.
                        	 * @param	width	Largeur (pixels)
                        	 * @param	height	Hauteur (pixels)
                        	 */
                        	public function setSize(virtualWidth:Float, virtualHeight:Float):Void
                        	{
                        		_virtualWidth = virtualWidth;
                        		_virtualHeight = virtualHeight;
                        		
                        		// Mise à jour du dessin
                        		update();
                        	}
                        	
                        	/* ---------- PRIVE ---------- */
                        	
                        	/**
                        	 * Mise à jour du cube
                        	 */
                        	private function update():Void
                        	{
                        		// On efface le dessin
                        		graphics.clear();
                        		
                        		// Remplissage
                        		graphics.beginFill(_color);
                        		
                        		// Dessin du cube
                        		graphics.drawRoundRect( -_virtualWidth * 0.5, -_virtualHeight * 0.5, _virtualWidth, _virtualHeight, _roundRadius, _roundRadius);
                        	}
                        	
                        	/* ---------- GETTERS ---------- */
                        	
                        	private function get_virtualWidth():Float 
                        	{
                        		return _virtualWidth;
                        	}
                        	
                        	private function set_virtualWidth(value:Float):Float 
                        	{
                        		_virtualWidth = value;
                        		
                        		// Mise à jour du dessin
                        		update();
                        		
                        		return _virtualWidth;
                        	}
                        	
                        	/**
                        	 * Largeur virtuelle, servant à dessiner le cube.
                        	 */
                        	public var virtualWidth(get_virtualWidth, set_virtualWidth):Float;
                        	
                        	private function get_virtualHeight():Float 
                        	{
                        		return _virtualHeight;
                        	}
                        	
                        	private function set_virtualHeight(value:Float):Float 
                        	{
                        		_virtualHeight = value;
                        		
                        		// Mise à jour du dessin
                        		update();
                        		
                        		return _virtualHeight;
                        	}
                        	
                        	/**
                        	 * Hauteur virtuelle, seervant à dessiner le cube.
                        	 */
                        	public var virtualHeight(get_virtualHeight, set_virtualHeight):Float;
                        	
                        	private function get_color():Int 
                        	{
                        		return _color;
                        	}
                        	
                        	private function set_color(value:Int):Int 
                        	{
                        		return _color = value;
                        	}
                        	
                        	/**
                        	 * Couleur du cube.
                        	 */
                        	public var color(get_color, set_color):Int;
                        	
                        	private function get_roundRadius():Float 
                        	{
                        		return _roundRadius;
                        	}
                        	
                        	private function set_roundRadius(value:Float):Float 
                        	{
                        		return _roundRadius = value;
                        	}
                        	
                        	/**
                        	 * Arrondi des angles.
                        	 */
                        	public var roundRadius(get_roundRadius, set_roundRadius):Float;
                        	
                        	
                        }

                        Le code source comprend 14 classes, sans compter la librairie d'animation externe Actuate. J'espère remporter le prix de l'inutilement compliqué ! :D

                        Un fichier de configuration xml permet d'ajuster beaucoup de choses. De plus, je me suis amusé à coder plusieurs animations sympa. Avec quelques réglages dans le fichier xml (réglages que j'ai mis dans config-alt.xml), on peut obtenir ceci avec le même code source :

                        Demo alternative (Version animée)

                        Les exécutables que j'ai déjà compilés sont dans le dossier bin (le dossier Windows fait 5 Mo :D ). Pour tester sur Android, il faut de préférence avoir un téléphone Android en mode développeur (avec débogage par USB activé) ou un émulateur et le Android SDK.

                        D'ailleurs, j'ai bien envie de faire un big-tuto sur Haxe et NME. :D

                        V2 : Corrections et ajustements. Amélioration du code des animations. Il est possible d'activer ou désactiver des animations dans le fichier de configuration xml. Il est également possible de déplacer les Invaders en Drag'n Drop ! :)

                        -
                        Edité par Akryum 29 avril 2013 à 23:26:15

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 avril 2013 à 19:15:43

                          @alphadelta: Tu va surtout remporter le prix du résultat le plus classe ...
                          Bravo !


                          Par-contre ... Pourquoi y a  Clyde dans un Atelier sur Space Invader ? o_O

                          -
                          Edité par @che 30 avril 2013 à 10:57:17

                          • Partager sur Facebook
                          • Partager sur Twitter
                          🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                            29 avril 2013 à 20:16:23

                            @alphadelta: C'est vachement jolie ce que tu as fait ! J'adore !! 

                            Bravo !

                            -
                            Edité par DobDob 29 avril 2013 à 20:16:59

                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 avril 2013 à 20:41:56

                              @ alphadelta : c’est génial !! j'ai qu'une envie c’est de me mettre au haxe ( vite, vite , fais ton big tuto !!!!) 

                              • Partager sur Facebook
                              • Partager sur Twitter
                              l´experience est une longue suite de connerie
                                29 avril 2013 à 21:11:07

                                hobi1 a écrit:

                                @ alphadelta : c’est génial !! j'ai qu'une envie c’est de me mettre au haxe ( vite, vite , fais ton big tuto !!!!) 


                                Oui, signons tous une pétition pour la création d'un big-tuto sur Haxe !:D

                                Ce langage a l'air vraiment très intéressant.

                                -
                                Edité par _mrtn 30 avril 2013 à 18:03:00

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Je ne visite plus ce site, si ça vous intéresse (ce qui serait très curieux), lisez ma bio.

                                  29 avril 2013 à 21:34:15

                                  tien j'en profite pour poster ma version en Ti-basic via l'écran normal .... ( je bosse sur la version graphique , ya encore des bugs ...)

                                  :Effecr
                                  :While 1
                                  :entaléat(0,9)->X
                                  :entaléat(1,3)->Y
                                  :Output(Y,X+3,"O O
                                  :Output(Y+1,X+2,"OOOOO
                                  :Output(Y+2,X+2,"O O O 
                                  :Output(Y+3,X+2,"O O O
                                  :Output(Y+4,X+1,"OOOOOOO
                                  :Output(Y+5,X+1,"O O O O
                                  :entaléat(0,1)->V
                                  :Output(Y+V+2,X+3,"0	 // en Ti-Basic , le zero est barré , ca fait un oeuil ..
                                  :entaléat(0,1)->U
                                  :Output(Y+U+2,X+5,"0
                                  :For(Z,1,500):End
                                  :Effecr
                                  :End
                                  :
                                  

                                   le tout pour 192 octets, mais il n'utilise que 4 variable ( 15*4o)  ce qui fais poids total de 282 octets !!

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  l´experience est une longue suite de connerie
                                    29 avril 2013 à 21:53:41

                                    Bonjour à tous les zéros.

                                    Voici ma version. Elle est fait en HTML5 (canvas) et en TypeScript.

                                    Voici le fichier HTML.

                                    <!DOCTYPE html>
                                    <html xmlns="http://www.w3.org/1999/xhtml">
                                    <head>
                                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                                        <title>Space Invaders</title>
                                    </head>
                                    <body>
                                        <canvas id="canvas" height="600" width="800">Space Invaders n'est pas supporté par votre navigateur...
                                        </canvas>
                                    
                                        <script src="DrawableCanvasElement.js"></script>
                                        <script src="SquareUnit.js"></script>
                                        <script src="Eye.js"></script>
                                        <script src="Squeleton.js"></script>
                                    
                                        <script src="mainScript.js"></script>
                                    </body>
                                    </html>
                                    

                                    Et voici les classes TypeScript

                                    DrawableCanvasElement.ts :

                                    class DrawableCanvasElement {
                                        x: number;
                                        y: number;
                                        height: number;
                                        width: number;
                                    
                                        colorR: number;
                                        colorB: number;
                                        colorG: number;
                                    
                                        constructor(x: number, y: number, height: number,
                                            width: number, r : number, g : number, b : number)
                                        {
                                            this.x = x;
                                            this.y = y;
                                            this.height = height;
                                            this.width = width;
                                    
                                            this.colorR = r;
                                            this.colorG = g;
                                            this.colorB = b;
                                        }
                                    
                                        draw(context: CanvasRenderingContext2D)
                                        {
                                            throw new Error("Not implemented");
                                        }
                                    
                                        generateRGB(): string
                                        {
                                            var content = "rgb("+ this.colorR +","+ this.colorG +","+ this.colorB +")";
                                            return content;
                                        }
                                    }


                                    SquareUnit.ts :

                                    ///<reference path="./DrawableCanvasElement.ts" />
                                    
                                    class SquareUnit extends DrawableCanvasElement
                                    {
                                        static size : number = 25;
                                    
                                        constructor(x: number, y: number, r: number,
                                            g: number, b: number)
                                        {
                                            super(x, y, SquareUnit.size, SquareUnit.size, r, g, b);
                                        }
                                    
                                        draw(context: CanvasRenderingContext2D)
                                        {
                                            context.fillStyle = super.generateRGB();
                                    
                                            context.fillRect(this.x, this.y, this.width, this.height);
                                        }
                                    
                                        public static createEmpty(x: number, y: number)
                                        {
                                            return new SquareUnit(x, y, 255, 255, 255);
                                        }
                                    }

                                    Eye.ts :

                                    ///<reference path="./DrawableCanvasElement.ts" />
                                    ///<reference path="./SquareUnit.ts" />
                                    
                                    class Eye extends DrawableCanvasElement {
                                        
                                        private topUnit: SquareUnit;
                                        private bottomUnit: SquareUnit;
                                    
                                        constructor(x: number, y: number, r: number, g: number, b: number) {
                                            super(x, y, 2 * SquareUnit.size, SquareUnit.size, r, g, b);
                                    
                                    
                                            //Création des deux cases qui composent l'oeil.
                                            if (Math.round(Math.random() * 100) % 2 == 0) {     //Une chance sur deux d'avoir un oeil en haut.
                                                this.topUnit = new SquareUnit(x, y, r, g, b);
                                                this.bottomUnit = SquareUnit.createEmpty(x, y + SquareUnit.size);
                                            }
                                            else {
                                                this.topUnit = SquareUnit.createEmpty(x, y);
                                                this.bottomUnit = new SquareUnit(x, y + SquareUnit.size, r, g, b);
                                            }
                                        }
                                    
                                        draw(context: CanvasRenderingContext2D) {
                                            this.topUnit.draw(context);
                                            this.bottomUnit.draw(context);
                                        }
                                    }


                                    Squeleton.ts :

                                    ///<reference path="./DrawableCanvasElement.ts" />
                                    ///<reference path="./SquareUnit.ts" />
                                    ///<reference path="./Eye.ts" />
                                    
                                    class Squeleton extends DrawableCanvasElement {
                                        private static elementsX = 7;
                                        private static elementsY = 6;
                                    
                                        static height = Squeleton.elementsY * SquareUnit.size;
                                        static width = Squeleton.elementsX * SquareUnit.size;
                                    
                                        private components: DrawableCanvasElement[];
                                    
                                        constructor(x: number, y: number, r : number, g : number, b : number, rEye : number, gEye : number, bEye : number) {
                                            super(x, y, Squeleton.elementsY * SquareUnit.size, Squeleton.elementsX * SquareUnit.size, r, g, b);
                                    
                                            this.generateComponents(rEye, gEye, bEye);
                                    
                                            this.width = Squeleton.elementsX * SquareUnit.size;
                                            this.height = Squeleton.elementsY * SquareUnit.size;
                                        }
                                    
                                        private generateComponents(rEye : number, gEye : number, bEye : number)
                                        {
                                    
                                            this.components = new Array(Squeleton.elementsX * Squeleton.elementsY + 2);
                                    
                                            for (var i = 0; i < Squeleton.elementsX; i++) {
                                                var line: number = 0;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, i < 2 || i == 3 || i > 4);
                                                line++;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, i < 1 || i > 5);
                                                line++;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, i % 2 == 0);
                                                line++;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, i % 2 == 0);
                                                line++;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, false);
                                                line++;
                                    
                                                this.components[i + (line * Squeleton.elementsX)] = this.createUnit(i, line, this.colorR, this.colorG, this.colorB, i % 2 == 1);
                                                line++;
                                            }
                                    
                                            this.components[this.components.length - 2] = new Eye(2 * SquareUnit.size + this.x, 2 * SquareUnit.size + this.y, rEye, gEye, bEye);
                                            this.components[this.components.length - 1] = new Eye(4 * SquareUnit.size + this.x, 2 * SquareUnit.size + this.y, rEye, gEye, bEye);
                                        }
                                    
                                        private createUnit(x: number, y: number, r: number, g: number, b: number, empty : bool) : SquareUnit {
                                            var xCoordinate = x * SquareUnit.size + this.x;
                                            var yCoordinate = y * SquareUnit.size + this.y;
                                    
                                            if (empty) {
                                                return SquareUnit.createEmpty(xCoordinate, yCoordinate);
                                            }
                                    
                                            return new SquareUnit(xCoordinate, yCoordinate, r, g, b);
                                        }
                                    
                                        draw(context: CanvasRenderingContext2D) {
                                            for (var i = 0; i < this.components.length; i++) {
                                                this.components[i].draw(context);
                                            }
                                        }
                                    }

                                    mainScript.ts :

                                    ///<reference path="./Squeleton.ts" />
                                    var context: CanvasRenderingContext2D;
                                    
                                    function start()
                                    {
                                        var canvas : HTMLCanvasElement = <HTMLCanvasElement>document.getElementById("canvas");
                                    
                                        context = canvas.getContext("2d");
                                        
                                        redraw();
                                        setInterval(redraw, 2000);
                                    }
                                    
                                    function redraw() {
                                        context.clearRect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);
                                    
                                        var obj = createSqueleton(context.canvas.clientHeight, context.canvas.clientWidth);
                                    
                                        obj.draw(context);
                                    }
                                    
                                    function createSqueleton(maxHeight: number, maxWidth: number) : Squeleton {
                                        var height = Math.random() * (maxHeight - Squeleton.height);
                                        var width = Math.random() * (maxWidth - Squeleton.width);
                                    
                                        var r, b, g;
                                    
                                        do {
                                            r = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                            b = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                            g = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                        } while (r == 255 && b == 255 && g == 255);
                                    
                                        var rEye, bEye, gEye;
                                    
                                        do {
                                            rEye = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                            bEye = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                            gEye = Math.min(Math.round(Math.random() * 255) + 1, 255);
                                        } while (rEye == 255 && bEye == 255 && gEye == 255);
                                    
                                        var sql: Squeleton = new Squeleton(width, height, r, b, g, rEye, bEye, gEye);
                                    
                                        return sql;
                                    }
                                    
                                    start();

                                    Bon, je sais qu'il y a beaucoup de code, mais cette structure permettrait de changer le modèle dessiné relativement simplement.

                                    Bonne chance à tous !




                                    -
                                    Edité par gretro 29 avril 2013 à 22:47:24

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 avril 2013 à 23:04:54

                                      Et moi, je dis, pourquoi ne pas créer une application web avec le magnifique tutoriel de Mateo21 sur NodeJS ? :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      N'oubliez pas de passer votre sujet à résolu ! :) Je ne suis pas omniscient, je suis juste en quête du savoir.
                                        29 avril 2013 à 23:17:44

                                        Odonno a écrit:

                                        Et moi, je dis, pourquoi ne pas créer une application web avec le magnifique tutoriel de Mateo21 sur NodeJS ? :)


                                        Déjà fait par Sandhose ;)
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Retrouvez moi sur mon blog et ma chaine Youtube !

                                          29 avril 2013 à 23:21:18

                                          Eskimon a écrit:

                                          Odonno a écrit:

                                          Et moi, je dis, pourquoi ne pas créer une application web avec le magnifique tutoriel de Mateo21 sur NodeJS ? :)


                                          Déjà fait par Sandhose ;)


                                          Vu, effectivement, je n'avais pas vu, mais c'est très bien fait !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          N'oubliez pas de passer votre sujet à résolu ! :) Je ne suis pas omniscient, je suis juste en quête du savoir.
                                            29 avril 2013 à 23:25:25

                                            Hop ! Une mise à jour de ma contribution ! Un meilleur code et plus de bugs de position et autres. Il est aussi possible de déplacer les Invaders en cliquant dessus :

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              29 avril 2013 à 23:43:51

                                              Ma petite contribution en bash

                                              #!/bin/bash
                                              L=`tput lines`
                                              C=`tput cols`
                                              while [ 1 ]
                                              do
                                              c=$(($RANDOM%($C-7)+1))
                                              l=$(($RANDOM%($L-6)+1))
                                              b=\\033[
                                              t=' # # #'
                                              d=#####
                                              K=${c}H
                                              echo -en "${b}H${b}2J$b$l;$K  # #$b$((++l));$K $d$b$((++l));$K$t$b$((++l));$K$t$b$((++l));$K##$d$b$((++l));$K#$t$b$(($l-3+$RANDOM%2));$(($c+4))H*$b$(($l-3+$RANDOM%2));$(($c+2))H*${b}0;0H"
                                              sleep 1
                                              done

                                              340 octets, difficile de faire plus court avec ce langage :D.

                                              Une version un peu plus classe avec 5 monstres

                                              #!/bin/bash
                                              
                                              eyes=(
                                              	2 4 3 4 2 8 3 8
                                              	2 4 3 4 2 10 3 10
                                              	2 4 3 4 2 10 3 10
                                              	3 6 4 6 3 14 4 14
                                              	3 6 3 8 3 14 3 16
                                              )
                                              
                                              w=(14 16 16 22 24)
                                              h=(6 8 8 8 8)
                                              
                                              function d() {
                                              	i=0
                                              	for s in "$@" ; do
                                              		echo -en "\033[$(($l + $i));${c}H$s"
                                              		((++i));
                                              	done
                                              	e1=$(($r * 8 + ($RANDOM % 2) * 2))
                                              	e1="$(($l + ${eyes[$e1]}));$(($c + ${eyes[$e1+1]}))"
                                              	e2=$(($r * 8 + 4 + ($RANDOM % 2) * 2))
                                              	e2="$(($l + ${eyes[$e2]}));$(($c + ${eyes[$e2+1]}))"
                                              	echo -en "\033[${e1}H◉◉\033[${e2}H◉◉\033[0;0H"
                                              }
                                              
                                              lines=$(tput lines)
                                              columns=$(tput cols)
                                              
                                              while [ 1 ] ; do
                                              	echo -en "\033[H\033[2J"
                                              	r=$(($RANDOM % 5))
                                              	c=$(($RANDOM % ($columns - ${w[r]}) + 1))
                                              	l=$(($RANDOM % ($lines - ${h[r]}) + 1))
                                              	case $r in
                                              	0) d \
                                              	'    ██  ██'\
                                              	'  ██████████'\
                                              	'  ██  ██  ██'\
                                              	'  ██  ██  ██'\
                                              	'██████████████'\
                                              	'██  ██  ██  ██'
                                              	;;
                                              	1) d \
                                              	'      ████'\
                                              	'    ████████'\
                                              	'  ██  ████  ██'\
                                              	'████  ████  ████'\
                                              	'████████████████'\
                                              	'    ██    ██'\
                                              	'  ██  ████  ██'\
                                              	'██  ██    ██  ██'
                                              	;;
                                              	2) d \
                                              	'      ████'\
                                              	'    ████████'\
                                              	'  ██  ████  ██'\
                                              	'████  ████  ████'\
                                              	'████████████████'\
                                              	'  ██  ████  ██'\
                                              	'██            ██'\
                                              	'  ██        ██'
                                              	;;
                                              	3) d \
                                              	'    ██          ██'\
                                              	'      ██      ██'\
                                              	'    ██████████████'\
                                              	'  ████  ██████  ████'\
                                              	'██████  ██████  ██████'\
                                              	'██  ██████████████  ██'\
                                              	'██  ██          ██  ██'\
                                              	'      ████  ████'
                                              	;;
                                              	4) d \
                                              	'        ████████'\
                                              	'  ████████████████████'\
                                              	'████████████████████████'\
                                              	'██████    ████    ██████'\
                                              	'████████████████████████'\
                                              	'      ████    ████'\
                                              	'    ████  ████  ████'\
                                              	'████                ████'
                                              	;;
                                              	esac
                                              
                                              	sleep 1
                                              done
                                              




                                              -
                                              Edité par jo_link_noir 30 avril 2013 à 20:47:59

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                29 avril 2013 à 23:43:59

                                                Bonjour,

                                                Ma contribution ne vise pas de catégorie particulière. J'ai fait le tour des messages et je me rend compte que presque tous les langages on été fait. Bon pour faire un peu original je suis passé sous Android. Le code est donc en Java et il est très basique.

                                                Vous pouvez téléchargez l'apk ici : lien de l'apk

                                                La vidéo de la démo ici : lien de la vidéo

                                                Screenshot

                                                Et le code est le suivant :

                                                package com.sdz.spaceinvaders;
                                                
                                                import java.util.Random;
                                                import java.util.Timer;
                                                import java.util.TimerTask;
                                                
                                                import android.app.Activity;
                                                import android.content.Context;
                                                import android.graphics.Canvas;
                                                import android.graphics.Color;
                                                import android.graphics.Paint;
                                                import android.graphics.Rect;
                                                import android.os.Bundle;
                                                import android.view.Menu;
                                                import android.view.View;
                                                import android.view.Window;
                                                import android.view.WindowManager;
                                                import android.widget.Toast;
                                                
                                                public class MainActivity extends Activity {
                                                
                                                	public RenderView my;
                                                	protected void onCreate(Bundle savedInstanceState) {
                                                		super.onCreate(savedInstanceState);
                                                        my=new RenderView(this);
                                                		setContentView(my);
                                                		
                                                		Timer monTimer=new Timer();
                                                		monTimer.schedule(new TimerTask() {
                                                			public void run() {
                                                				my.postInvalidate();
                                                			}
                                                		},0, 1000);
                                                	}
                                                	
                                                	class RenderView extends View {
                                                
                                                        public RenderView(Context context) {
                                                            super(context);
                                                            
                                                        }
                                                        protected void onDraw(Canvas canvas) {
                                                            canvas.drawRGB(0, 0, 0);
                                                            Paint paint = new Paint();
                                                            int iWidth = canvas.getWidth();
                                                            int iHeight = canvas.getHeight();
                                                            
                                                            Random rand = new Random();
                                                            for (int i=0; i < 10000; i++)
                                                            {
                                                            	paint.setARGB(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
                                                            	canvas.drawPoint(rand.nextInt(iWidth), rand.nextInt(iHeight), paint);
                                                            }
                                                            
                                                            int[][] sp1={{0,0,0,0,1,1},{0,1,1,1,1,0},{1,1,0,2,1,1},{0,1,1,1,1,0},{1,1,0,2,1,1},{0,1,1,1,1,0},{0,0,0,0,1,1}};
                                                            int x,y;
                                                            int l=20,space=5;
                                                            Random r = new Random();
                                                            x=r.nextInt(iWidth-((l+space)*sp1.length));
                                                            y=r.nextInt(iHeight-((l+space)*sp1[0].length));
                                                            
                                                            for(int i=0; i<sp1.length; i++)
                                                            {
                                                            	for(int j=0; j<sp1[i].length; j++) {
                                                            		switch(sp1[i][j]) {
                                                	            		case 0: break;
                                                	            		case 1:
                                                	            			paint.setColor(Color.GREEN);
                                                	            			canvas.drawRect(new Rect(x+(l+space)*i, y+(l+space)*j, x+l+(l+space)*i, y+l+(l+space)*j), paint);
                                                	            			break;
                                                	            		case 2:
                                                	            			paint.setColor(Color.RED);
                                                	            			canvas.drawRect(new Rect(x+(l+space)*i, y+(l+space)*j, x+l+(l+space)*i, y+l+(l+space)*j), paint);
                                                	            			break;
                                                            		}
                                                            	}
                                                            }
                                                        }
                                                    }
                                                }
                                                



                                                -
                                                Edité par willard <3 30 avril 2013 à 9:47:13

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                J'ai tous les badges d'OpenClassrooms.
                                                  29 avril 2013 à 23:50:47

                                                  Désolé willard, je suis passé avant. :)

                                                  Cela dit, tu as fais comment pour filmer ton terminal ? Ca m'intéresserait vraiment beaucoup. ^^

                                                  -
                                                  Edité par Andr0 30 avril 2013 à 0:06:38

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                                    30 avril 2013 à 0:27:34

                                                    Ah mince, je n'avais pas vu que t'étais passé lol. Mais le mien est plus joli :)

                                                    pour filmer l'écran, j'ai utilisé une solution crade. en perf c'est pas magique!

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    J'ai tous les badges d'OpenClassrooms.
                                                      30 avril 2013 à 0:37:30

                                                      Ah mince, je n'avais pas vu que t'étais passé lol. Mais le mien est plus joli :)

                                                      Ouais, mais moi c'est un fond d'écran ! :-°

                                                      pour filmer l'écran, j'ai utilisé une solution crade. en perf c'est pas magique!

                                                      C'est une solution comme une autre. Etant donné qu'il en existe pas des masses. Je prends tout ce que je vois. Merci du lien !

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                                        30 avril 2013 à 0:40:46

                                                        @hobi1 : en Ti-Basic, si tu fais une version en écran graphique, utilise des simili-sprites (un tuto existe sur le SdZ pour ça), c'est plus optimisé que 36 "Pxl-On".

                                                        Pour la version Haxe, sympa, mais j'ai des doutes : un langage très haut niveau qui traduit du code en langage haut niveau qui sera finalement compilé en bas niveau, j'ai un peu peur pour l'optimisation, que ce soit limité en terme de possibilités, de fonctionnalités (libs), de performances et de contrôle sur ce qu'on programme.

                                                        Cependant, pour s'amuser un peu et faire un  programme pas trop exigeant... pourquoi pas ^^

                                                        -
                                                        Edité par mogolecho 30 avril 2013 à 0:43:24

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          30 avril 2013 à 1:10:03

                                                          À bon entendeur, c'est du C, avec de la SDL et OpenGL

                                                          #include <stdlib.h>
                                                          #define RAND_MAXJ 1073741823
                                                          #define h Etat
                                                          #include <windows.h>
                                                          #define fgv (
                                                          #include <sdl/sdl.h>
                                                          #include <GL/gl.h>
                                                          #define LARGEURECRAN 900
                                                          #define $ =
                                                          #define HAUTEURECRAN 900
                                                          #define po 11
                                                          #define b if
                                                          #include <SDL.h>
                                                          #define I ;
                                                          #define olk )
                                                          #define a int
                                                          #define T for
                                                          #include <time.h>
                                                          #define K ETAT
                                                          
                                                          
                                                                                  a space[26][            2]$ {{0,0},{
                                                                                  0,po},{po,po            },{po,2*po},
                                                                                   {po,3*po},{            po,4*po},{2*
                                                                                  po,0},{2*po,            po},{2*po,4*
                                                                                  po},{2*po,5*po},{3*po,po},{3*po,2*po
                                                                      },{3* po,3*po},{3*po,4*po},{ 4*po,0}, {4*po, po},{4*po ,4*po},{4*
                                                                      po,5 *po},{5*po ,po},{5*po,2* po}, {5*po,3*po},{5*po,4*po},{6 *po
                                                                     ,0},{6*po,po},{2* po,2*po},{4*po, 2*po}}I  struct  K{ char Quitter
                                                                       I } h  I static inline  a rand_Ja  fgv a min, a max   olk{return
                                                                      fgv a olk fgv fgv   rand fgv olk*RAND_MAX+rand fgv  olk olk / fgv
                                                                       1.0+RAND_MAXJ olk*fgv  max-min olk+min olk I}void  affichage fgv
                                                                      a pos_x,a             pos_y olk{ a i             I   glClearColor
                                                                       fgv 1.0,            1.0,1.0,0.0 olk             I   glMatrixMode
                                                                      fgv /**/              GL_PROJECTION              /*** ****/ olk I
                                                                      /*******/            glLoadIdentity             fgv  olk I glClear
                                                                      fgv/*****/           GL_COLOR_BUFFER_BIT        olk I glMatrixMode
                                                                      fgv GL_MODELVIEW olk I glEnable fgv GL_BLEND olk I glBlendFunc fgv
                                                                      GL_SRC_ALPHA,  GL_ONE_MINUS_SRC_ALPHA olk I glLoadIdentity fgv olk
                                                                      I glTranslatef fgv -1,-1,0 olk I glScalef fgv 40.0/fgv LARGEURECRAN
                                                                      *4 olk,40.0/fgv HAUTEURECRAN*4 olk,1.0 olk I glPointSize fgv 50 olk
                                                                      I glColor3ub fgv rand_Ja fgv 0,256 olk,rand_Ja fgv 0,256 olk,rand_Ja
                                                          fgv 0,256 olk olk I glBegin fgv GL_POINTS  olk I T fgv i $ 0 I i<24  I i ++olk glVertex2i fgv
                                                          space[i][0]+pos_x,space[i][1]+pos_y olk I glColor3ub fgv 0,0,0 olk I glVertex2i fgv space[24]
                                                          [0]+pos_x,space[24][1]+po*fgv rand_Ja fgv 0,2 olk olk+pos_y olk I glVertex2i fgv space[25][0]
                                                          +pos_x,space[25][1]+po*fgv rand_Ja fgv 0,2 olk olk+pos_y olk I glEnd fgv olk I glFlush fgv olk
                                                           I SDL_GL_SwapBuffers fgv olk I}void MajEtat fgv void olk {SDL_Event Evenement I     while fgv
                                                           SDL_PollEvent fgv &Evenement olk olk   {switch fgv Evenement.type olk{case SDL_QUIT:h.Quitter
                                                          $ 1 I break            I default:             break I}}}void              clavier fgv void olk
                                                          {  MajEtat              fgv olk I             }a main fgv a               argc,char** argv olk{
                                                          SDL_Surface             *ecran I              memset fgv &h               , 0 , sizeof   fgv  h
                                                          olk olk I              /*******/             SDL_WM_SetCaption            fgv"Spaaaaaaaaaaaaace",
                                                          NULL olk I             ecran   $             SDL_SetVideoMode              fgv     LARGEURECRAN,
                                                          HAUTEURECRAN          ,32,/*****/            SDL_OPENGL olk I             srand fgv time fgv NULL
                                                          
                                                          
                                                          olk olk I while fgv !h.Quitter olk{affichage fgv rand_Ja fgv 6,108 olk,rand_Ja fgv 6,119 olk olk I clavier
                                                          fgv olk I Sleep fgv 3000  olk I}SDL_FreeSurface  fgv ecran olk I  SDL_Quit fgv olk I return EXIT_SUCCESS I}
                                                          

                                                          EDIT : Voilà le screen demandé, rien de bien spécial, merci le préprocesseur. (Oui oui, il bouge et change de couleur)

                                                          -
                                                          Edité par BlackFart 30 avril 2013 à 13:02:42

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Anonyme
                                                            30 avril 2013 à 10:29:34

                                                            Je crois qu'on a trouve un gagnant ^^, c'est juste magnifique ! :)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            [Atelier] Fond animé Space Invaders

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown