IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[Astuces SDL] Tracer lignes, rectangles vides et rayés


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 8
    Points
    8
    Par défaut [Astuces SDL] Tracer lignes, rectangles vides et rayés
    Bonjour,

    Ceci n'est pas une demande d'aide, mais une proposition
    En fait j'ai telement galéré pour un truc aussi simple en ne trouvant rien sur le net, que je me suis dit que ça serait pas plus mal de mettre à disposition ces petits bouts de code simple mais utiles:

    Dessiner un rectangle plein, fonctione simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void drawFullRect(SDL_Surface * surf,int posX, int posY, int width, int length, int R, int G, int B)
    {
    	SDL_Rect Rect;
    	Rect.x = posX;
    	Rect.y = posY;
    	Rect.w = length-1;
    	Rect.h = width-1;
     
    	SDL_FillRect(surf, &Rect, SDL_MapRGB(surf->format, R, G, B));
    }
    Dessiner un rectangle vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    void drawEmptyRect(SDL_Surface * surf,int posX, int posY, int width, int length, int R, int G, int B)
    {
    	SDL_Rect ligneHaut;
    	ligneHaut.x = posX-1;
    	ligneHaut.y = posY-1;
    	ligneHaut.w = length;
    	ligneHaut.h = 1;
     
    	SDL_FillRect(surf, &ligneHaut, SDL_MapRGB(surf->format, R, G, B));
     
    	SDL_Rect ligneDroite;
    	ligneDroite.x = posX+length-1;
    	ligneDroite.y = posY-1;
    	ligneDroite.w = 1;
    	ligneDroite.h = width;
     
    	SDL_FillRect(surf, &ligneDroite, SDL_MapRGB(surf->format, R, G, B));
     
    	SDL_Rect ligneGauche;
    	ligneGauche.x = posX-1;
    	ligneGauche.y = posY-1;
    	ligneGauche.w = 1;
    	ligneGauche.h = width;
     
    	SDL_FillRect(surf, &ligneGauche, SDL_MapRGB(surf->format, R, G, B));
     
    	SDL_Rect ligneBas;
    	ligneBas.x = posX-1;
    	ligneBas.y = posY+width-1;
    	ligneBas.w = length;
    	ligneBas.h = 1;
     
    	SDL_FillRect(surf, &ligneBas, SDL_MapRGB(surf->format, R, G, B));
    }
    Methode pour tracer une ligne (Convertit une couleur R G B en long, et vient avec une fonction pour tracer un pixel avec cette couleur) - Pour info, il s'agit de l'algorithme de Bresenham :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    unsigned long Color(int R, int G, int B)
    {//Convertit RGB en long
    	return 65536*R + 256*G + B;
    }
     
    void PutPixel(SDL_Surface *surface, int x, int y, unsigned long pixel)
    {
    	int bpp = surface->format->BytesPerPixel;
    	unsigned char *p = (unsigned char *)surface->pixels + y * surface->pitch + x * bpp;
    	if (bpp==4)
    		*(unsigned long*)p = pixel;
    }
     
    void drawLine(SDL_Surface* surf,int x1,int y1, int x2,int y2, int R, int G, int B)  // Bresenham
    {
    	unsigned long couleur = Color(R, G, B);
    	int x,y;
    	int Dx,Dy;
    	int xincr,yincr;
    	int erreur;
    	int i;
     
    	Dx = abs(x2-x1);
    	Dy = abs(y2-y1);
    	if(x1<x2)
    		xincr = 1;
    	else
    		xincr = -1;
    	if(y1<y2)
    		yincr = 1;
    	else			
    		yincr = -1;
     
    	x = x1;
    	y = y1;
    	if(Dx>Dy)
    	{
    		erreur = Dx/2;
    		for(i=0;i<Dx;i++)
    		{
    			x += xincr;
    			erreur += Dy;
    			if(erreur>Dx)
    			{
    				erreur -= Dx;
    				y += yincr;
    			}
    			PutPixel(surf,x, y,couleur);
    		}
    	}
    	else
    	{
    		erreur = Dy/2;
    		for(i=0;i<Dy;i++)
    		{
    			y += yincr;
    			erreur += Dx;
     
    			if(erreur>Dy)
    			{
    				erreur -= Dy;
    				x += xincr;
    			}
    			PutPixel(surf,x, y,couleur);
    		}
    	}
    }
    Enfin, fonction pour tracer et remplir un rectangle avec des rayures.. un rectangle rayé, quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    void drawStrippedRect(SDL_Surface * surf, int posX, int posY, int width, int length, int R, int G, int B)
    {
    	drawEmptyRect(surf, posX+1, posY+1, width-2, length-2, R, G, B);
    	int esp=5, i, j, tmp=esp;
    	unsigned long couleurPixel = Color(R, G, B);
     
    	for(j=posY; j<posY+width-1; j++)
    		for(i=posX+(tmp++%esp); i<posX+length-1; i+=esp)
    			PutPixel(surf, i, j, couleurPixel);
    }



    Voila... C'est tout bête, mais comme je débute et que je dois faire quelque chose de simple ça m'a prit un moment pour tout faire... alors j'espère que ça pourra être utile à un autre boulet comme moi

  2. #2
    tintin22
    Invité(e)
    Par défaut
    kicoe ! merci à toi

  3. #3
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Je n'ai pas regardé en détail, mais il me semble qu'il existe déjà un tuto sur DVP qui montre comment faire tout ça.

    Edit : http://anomaly.developpez.com/tutoriel/sdl/partie2/

    Edit 2 : il n'y a pas exactement les mêmes choses en effet.

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Points : 4
    Points
    4
    Par défaut Antialias
    (Bon, je sais, les messages datent de 2008, mais bon...)
    Ce serait sympa d'anti-aliaser tes lignes.
    Par exemple, pour commencer, tu pourrait faire une fonction pour définir la couleur d'un pixel, sans gestion de la transparence (paramètres = deux entiers et une couleur), une fonction pour récupérer la couleur d'un pixel à l'écran (paramètres = deux entiers, retourne une couleur), une fonction pour définir un pixel à l'écran avec gestion de la transparence (paramètres = deux entiers, une couleur et un entier pour l'alpha) et enfin une fonction pour tracer un point anti-aliasé (paramètres = deux décimaux, une couleur et un entier pour l'alpha). Pour cette dernière fonction, il faut que la couleur du pixel soit en quelque sorte "étalée" sur quatre pixels. Il faut donc définir dans quelle mesure la couleur va aller sur ce pixel, ou sur un autre.
    Ta fonction pour tracer des lignes ferait donc appel à la dernière fonction pour tracer tous les pixels un point antialiasé.

    PS : Si tu le demande, je pourrais te donner mon code (mais pour le moment, cherche un peu...)
    Ne pas s'énerver => pas de problème !!!

Discussions similaires

  1. Réponses: 14
    Dernier message: 22/03/2013, 21h13
  2. [SDL]Rectangle vide
    Par ankou82 dans le forum SDL
    Réponses: 2
    Dernier message: 19/05/2006, 11h27
  3. Tracer Ligne
    Par hbzied dans le forum 2D
    Réponses: 1
    Dernier message: 20/04/2006, 18h29
  4. [FLASH MX2004] Tracer ligne discontinue en AS
    Par thaisno dans le forum Flash
    Réponses: 7
    Dernier message: 23/12/2004, 16h24
  5. [VB.NET] Tracer un rectangle en pointillé
    Par Emcy dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/08/2004, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo