begin process at 2012 02 12 08:40:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > DÉBUT D'UN "PAINT" EN SDL

DÉBUT D'UN "PAINT" EN SDL


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Classé sous :sdl, paint, tampon Niveau :Débutant Date de création :19/08/2007 Date de mise à jour :20/08/2007 23:59:56 Vu / téléchargé :4 340 / 135

Auteur : jashnlt

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code permet de blitter des "tampons" (2 actuellement) et de les garder en mémoire grace à un tableau à trois colonne.

Source

  • /*
  • Tampon
  • Par HENAULT Jason
  • Programme qui consiste en une "immitation" du logiciel paint de windows :
  • le but est de créé des dessins grace à plusieur tampon et pouvoir et enregister par la suite.
  • Créé le Vendredi 10 aout 2007.
  • Màj : 20/08/07 + Correction des l'allocation dynamique pour eviter le stackk overflow
  • */
  • /////////////////////////
  • #include <stdlib.h> // Inclusion des headers
  • #include <stdio.h> //
  • #include <SDL/SDL.h> //
  • /////////////////////////
  • #include "main.h" // Inclusion des headers de main.h
  • /////////////////////////
  • int main(int argc, char *argv[])
  • {
  • // Définition des variables
  • SDL_Surface *ecran, *tmp, *pen, *tmpTmp, *penTmp;
  • SDL_Rect postmp, pospen, postmpTmp, pospenTmp;
  • SDL_Event event;
  • int continuer = 1, mouseDown = 0, chxTmp = PEN, nmbTmp = NMBTMP, i = 0, j = 0, clickLeft = 0, e = 0, z = 0;
  • int (*memPos)[NMBTMP][NMBPIXELW][NMBPIXELH] = NULL;
  • memPos = (int (*)[NMBTMP][NMBPIXELW][NMBPIXELH]) malloc((NMBTMP * sizeof(int)) * (NMBPIXELW * sizeof(int)) * (NMBPIXELH* sizeof(int))) ;
  • ///////////////////////////
  • // Initialisation de la fenêtre
  • SDL_Init(SDL_INIT_VIDEO);
  • SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
  • SDL_WM_SetCaption("Tampon - Crayon", NULL);
  • ecran = SDL_SetVideoMode(NMBPIXELWres, NMBPIXELHres, 32, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
  • SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  • ///////////////////////////////
  • // Description des sprites
  • tmp = SDL_LoadBMP("tmp.bmp");
  • SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));
  • tmpTmp = SDL_LoadBMP("tmpTmp.bmp");
  • SDL_SetColorKey(tmpTmp, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));
  • pen = SDL_LoadBMP("pen.bmp");
  • SDL_SetColorKey(pen, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));
  • penTmp = SDL_LoadBMP("penTmp.bmp");
  • //////////////////////////
  • // Chargement du moteur opératif
  • SDL_ShowCursor(SDL_DISABLE);
  • while (continuer)
  • {
  • SDL_WaitEvent (&event);
  • switch (event.type)
  • {
  • case SDL_QUIT: // Si on appuie sur la croix de fermeture
  • exit(EXIT_SUCCESS);
  • break;
  • case SDL_KEYDOWN: // Si une touche est pressé
  • switch (event.key.keysym.sym)
  • {
  • case SDLK_ESCAPE:
  • exit(EXIT_SUCCESS);
  • case SDLK_DELETE:
  • z = 0;
  • e = 0;
  • do
  • {
  • for (z = 0; z < NMBPIXELW; z++)
  • {
  • (*memPos)[PEN][z][e] = 0;
  • }
  • e++;
  • }while(e != NMBPIXELH && z == NMBPIXELW);
  • z = 0;
  • e = 0;
  • do
  • {
  • for (z = 0; z < NMBPIXELW; z++)
  • {
  • (*memPos)[TMP][z][e] = 0;
  • }
  • e++;
  • }while(e != NMBPIXELH && z == NMBPIXELW);
  • break;
  • }
  • break;
  • case SDL_MOUSEMOTION: // Si la souris a été bougée
  • pospen.x = event.motion.x;
  • pospen.y = event.motion.y;
  • postmp.x = event.motion.x;
  • postmp.y = event.motion.y;
  • postmpTmp.x = event.motion.x;
  • postmpTmp.y = event.motion.y;
  • pospenTmp.x = event.motion.x;
  • pospenTmp.y = event.motion.y;
  • break;
  • case SDL_MOUSEBUTTONUP:
  • switch (event.button.button)
  • {
  • case SDL_BUTTON_LEFT:
  • clickLeft = 0;
  • break;
  • }
  • break;
  • case SDL_MOUSEBUTTONDOWN: // Si un bouton de la souris et appyer
  • switch (event.button.button)
  • {
  • case SDL_BUTTON_WHEELUP: // Roulette haut
  • chxTmp++;
  • if (chxTmp != nmbTmp && chxTmp >= 0)
  • {
  • switch (chxTmp)
  • {
  • case PEN:
  • SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
  • SDL_WM_SetCaption("Tampon - Crayon", NULL);
  • break;
  • case TMP:
  • SDL_WM_SetIcon(SDL_LoadBMP("tmp.bmp"), NULL);
  • SDL_WM_SetCaption("Tampon - Point", NULL);
  • break;
  • }
  • }
  • else
  • chxTmp--;
  • break;
  • case SDL_BUTTON_WHEELDOWN: // Roullette bas
  • chxTmp--;
  • if (chxTmp != nmbTmp && chxTmp >= 0)
  • {
  • switch (chxTmp)
  • {
  • case PEN:
  • SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
  • SDL_WM_SetCaption("Tampon - Crayon", NULL);
  • break;
  • case TMP:
  • SDL_WM_SetIcon(SDL_LoadBMP("tmp.bmp"), NULL);
  • SDL_WM_SetCaption("Tampon - Point", NULL);
  • break;
  • }
  • }
  • else
  • chxTmp++;
  • break;
  • case SDL_BUTTON_LEFT: // Boutton gauche
  • clickLeft = 1;
  • break;
  • }
  • break;
  • case SDL_VIDEORESIZE: // Si on modifie la taille de la fenêtre
  • ecran = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, SDL_HWSURFACE| SDL_RESIZABLE);
  • realloc(*memPos, ((NMBPIXELW * sizeof(int)) * (NMBPIXELW * sizeof(int)) * (NMBPIXELH* sizeof(int))));
  • break;
  • }
  • if(clickLeft == 1)
  • {
  • if (chxTmp == PEN)
  • (*memPos)[chxTmp][event.motion.x][event.motion.y + pen->h] = 1;
  • else if (chxTmp == TMP)
  • (*memPos)[chxTmp][event.motion.x + (tmp->w / 2)][event.motion.y + (tmp->h / 2)] = 1;
  • }
  • SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); // Formate l'écran
  • // Moteur de recherche, pixel par pixel, de la position des tampons
  • i = 0; j = 0;
  • do
  • {
  • j++;
  • for(i = 0; i < NMBPIXELW; i++)
  • {
  • if ((*memPos) [PEN][i][j] == 1)
  • {
  • pospenTmp.x = i;
  • pospenTmp.y = j;
  • SDL_BlitSurface(penTmp, NULL, ecran, &pospenTmp);
  • }
  • else if ((*memPos) [TMP][i][j] == 1)
  • {
  • postmpTmp.x = i;
  • postmpTmp.y = j;
  • SDL_BlitSurface(tmpTmp, NULL, ecran, &postmpTmp);
  • }
  • }
  • }while (j != NMBPIXELH && i == NMBPIXELW);
  • //////////////////////////////////////////////////////////////////
  • switch (chxTmp) // On place le curseur
  • {
  • case PEN:
  • SDL_BlitSurface(pen, NULL, ecran, &pospen);
  • break;
  • case TMP:
  • SDL_BlitSurface(tmp, NULL, ecran, &postmp);
  • break;
  • }
  • SDL_Flip(ecran); // Rafraichissement de l'écran
  • }
  • ////////////////////////////////
  • // Liberer la memoire
  • SDL_FreeSurface(tmp);
  • SDL_FreeSurface(tmpTmp);
  • SDL_FreeSurface(pen);
  • SDL_FreeSurface(penTmp);
  • SDL_Quit();
  • free(memPos);
  • /////////////////////
  • // Retourne 1 si réussit
  • return EXIT_SUCCESS;
  • ////////////////////////
  • }
/*

Tampon

Par HENAULT Jason

Programme qui consiste en une "immitation" du logiciel paint de windows : 
le but est de créé des dessins grace à plusieur tampon et pouvoir et enregister par la suite.

Créé le Vendredi 10 aout 2007.

Màj : 20/08/07              + Correction des l'allocation dynamique pour eviter le stackk overflow

*/


/////////////////////////
#include <stdlib.h>    // Inclusion des headers
#include <stdio.h>     //
#include <SDL/SDL.h>   //
/////////////////////////
#include "main.h"      // Inclusion des headers de main.h
/////////////////////////

int main(int argc, char *argv[])
{
	// Définition des variables
	SDL_Surface *ecran, *tmp, *pen, *tmpTmp, *penTmp;
	SDL_Rect postmp, pospen, postmpTmp, pospenTmp;
	SDL_Event event;

	int continuer = 1, mouseDown = 0, chxTmp = PEN, nmbTmp = NMBTMP, i = 0, j = 0, clickLeft = 0, e = 0, z = 0;

	int (*memPos)[NMBTMP][NMBPIXELW][NMBPIXELH] = NULL;
	memPos = (int (*)[NMBTMP][NMBPIXELW][NMBPIXELH]) malloc((NMBTMP * sizeof(int)) * (NMBPIXELW * sizeof(int)) * (NMBPIXELH* sizeof(int))) ;
	///////////////////////////


	// Initialisation de la fenêtre	
	SDL_Init(SDL_INIT_VIDEO);
	SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
	SDL_WM_SetCaption("Tampon - Crayon", NULL);
    ecran = SDL_SetVideoMode(NMBPIXELWres, NMBPIXELHres, 32, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
	///////////////////////////////


	// Description des sprites
	tmp = SDL_LoadBMP("tmp.bmp");
	SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));
	
	tmpTmp = SDL_LoadBMP("tmpTmp.bmp");
	SDL_SetColorKey(tmpTmp, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));

	pen = SDL_LoadBMP("pen.bmp");
	SDL_SetColorKey(pen, SDL_SRCCOLORKEY, SDL_MapRGB(ecran ->format, 255, 255, 255));

	penTmp = SDL_LoadBMP("penTmp.bmp");
	//////////////////////////


	// Chargement du moteur opératif
	SDL_ShowCursor(SDL_DISABLE);
	while (continuer)
	{
		SDL_WaitEvent (&event);

		switch (event.type)
		{
		case SDL_QUIT:  // Si on appuie sur la croix de fermeture
			exit(EXIT_SUCCESS);
			break;
		
		case SDL_KEYDOWN:  // Si une touche est pressé
			switch (event.key.keysym.sym)
			{
			case SDLK_ESCAPE:
				exit(EXIT_SUCCESS);

			case SDLK_DELETE:
				z = 0;
				e = 0;

				do
				{
				for (z = 0; z < NMBPIXELW; z++)
				{
				(*memPos)[PEN][z][e] = 0;
				}
				e++;
				}while(e != NMBPIXELH && z == NMBPIXELW);

				z = 0;
				e = 0;

				do
				{
				for (z = 0; z < NMBPIXELW; z++)
				{
				(*memPos)[TMP][z][e] = 0;
				}
				e++;
				}while(e != NMBPIXELH && z == NMBPIXELW);
				
				break;
			}
			break;

		case SDL_MOUSEMOTION:  // Si la souris a été bougée
				pospen.x = event.motion.x;
				pospen.y = event.motion.y;
				postmp.x = event.motion.x;
				postmp.y = event.motion.y;
				postmpTmp.x = event.motion.x;
				postmpTmp.y = event.motion.y;
				pospenTmp.x = event.motion.x;
				pospenTmp.y = event.motion.y;
				break;

		case SDL_MOUSEBUTTONUP:
			switch (event.button.button)
			{
			case SDL_BUTTON_LEFT:
				clickLeft = 0;
				break;
			}
			break;

		case SDL_MOUSEBUTTONDOWN:  // Si un bouton de la souris et appyer
			switch (event.button.button)
			{
			case SDL_BUTTON_WHEELUP:  // Roulette haut
				chxTmp++;
				if (chxTmp != nmbTmp && chxTmp >= 0)
				{
				switch (chxTmp)
				{
				case PEN:
					SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
				    SDL_WM_SetCaption("Tampon - Crayon", NULL);
					break;

				case TMP:
					SDL_WM_SetIcon(SDL_LoadBMP("tmp.bmp"), NULL);
				    SDL_WM_SetCaption("Tampon - Point", NULL);
				break;
				}
				}
				else
					chxTmp--;
				break;

			case SDL_BUTTON_WHEELDOWN:  // Roullette bas
				chxTmp--;
				if (chxTmp != nmbTmp && chxTmp >= 0)
				{
				switch (chxTmp)
				{
				case PEN:
					SDL_WM_SetIcon(SDL_LoadBMP("pen.bmp"), NULL);
				    SDL_WM_SetCaption("Tampon - Crayon", NULL);
					break;

				case TMP:
					SDL_WM_SetIcon(SDL_LoadBMP("tmp.bmp"), NULL);
				    SDL_WM_SetCaption("Tampon - Point", NULL);
				break;
				}
				}
				else
					chxTmp++;
				break;

			case SDL_BUTTON_LEFT:  // Boutton gauche
				clickLeft = 1;
			    break;
			}
			break;

		

		case SDL_VIDEORESIZE:  // Si on modifie la taille de la fenêtre
			ecran = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, SDL_HWSURFACE| SDL_RESIZABLE);
			realloc(*memPos, ((NMBPIXELW * sizeof(int)) * (NMBPIXELW * sizeof(int)) * (NMBPIXELH* sizeof(int))));
			break;

		}
		
		if(clickLeft == 1)
		{
			if (chxTmp == PEN)
				(*memPos)[chxTmp][event.motion.x][event.motion.y + pen->h] = 1;
			else if (chxTmp == TMP)
				(*memPos)[chxTmp][event.motion.x + (tmp->w / 2)][event.motion.y + (tmp->h / 2)] = 1;
		}

		SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));  // Formate l'écran


        // Moteur de recherche, pixel par pixel, de la position des tampons
		i = 0; j = 0;
		do
		{
			j++;
			for(i = 0; i < NMBPIXELW; i++)
		{
			if ((*memPos) [PEN][i][j] == 1)
			{
				pospenTmp.x = i;
				pospenTmp.y = j;
				SDL_BlitSurface(penTmp, NULL, ecran, &pospenTmp);
			}
			
			else if ((*memPos) [TMP][i][j] == 1)
			{
				postmpTmp.x = i;
				postmpTmp.y = j;
				SDL_BlitSurface(tmpTmp, NULL, ecran, &postmpTmp);
			}
		}
		}while (j != NMBPIXELH && i == NMBPIXELW);
		//////////////////////////////////////////////////////////////////


		switch (chxTmp)  // On place le curseur
		{
		case PEN:
			SDL_BlitSurface(pen, NULL, ecran, &pospen);
			break;

		case TMP:
			SDL_BlitSurface(tmp, NULL, ecran, &postmp);
			break;
		}

	    SDL_Flip(ecran);  // Rafraichissement de l'écran

	}
	////////////////////////////////



	// Liberer la memoire
	SDL_FreeSurface(tmp);
	SDL_FreeSurface(tmpTmp);
	SDL_FreeSurface(pen);
	SDL_FreeSurface(penTmp);
    SDL_Quit();
	free(memPos);
	/////////////////////


	// Retourne 1 si réussit
    return EXIT_SUCCESS;
	////////////////////////
}

 Conclusion

Le problème de ce code est le redimmensionnement de la fênetre a cause des indices du pointeur. C'est le premier code que je met ici :) (= soyer indulgent S.V.P.).

Hotkeys:
Bouton souris gauche => dessinner
Scroll => choix tampon

Echap =>fermer
Delete => efface l'écran

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

20 août 2007 23:59:56 :
Correction de la declaration de memPos pour éviter les stack overflow (allocation dynamique au lieu de static).

 Sources de la même categorie

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi
Source avec Zip Source avec une capture XCOUPE : COUPE 2D par pop70

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture JEUX SERPENT par antho974
Source avec Zip Source avec une capture PENDU EN SDL par Damsou91
CASSE BRIQUE SDL MODIFICATION par Vardosh
A5PAINTING,LE PAINT A LA DÉBUTANT par Chiheb2010
Source avec Zip [TPE] MINI LOGICIEL DE MODIFICATION D'IMAGES AVEC SDL par CChargy

Commentaires et avis

Commentaire de juju12 le 19/08/2007 17:32:33

Pour accéder à une zone de mémoire importante il ne faut PAS déclarer sur la pile (c'est pas fait pour) mais allouer la mémoire dynamiquement.

Commentaire de jashnlt le 19/08/2007 18:35:01

Oui mais voila j'ai essayer mais le code n'a pas compiler (il faut faire memPos = malloc((NMBTMP * sizeof(int)) * (NMBPIXELW * sizeof(int)) * (NMBPIXELH * sizeof(int)) ?

En tous cas merci pour la reponse :)

A oui et aussi, si sa ne stock pas sur la pile, où sa stock ? (Ok, question de débutant maison est dans cette dernièr section non ? ;) )

Commentaire de juju12 le 19/08/2007 23:53:35

Oui, tu fais int* mempos=(int*)malloc(taille_voulue_en_octets); par contre attention l'écriture mempos[a][b][c] ne fonctionnera plus.
La mémoire allouée de cette façon est stockée sur le tas (heap) qui est une manière de gérer la mémoire virtuelle. En fait la pile est une zone particulière attribuée au programme qui sert principalement à son déroulement : adresses retours des fonctions, passage d'arguments, variables locales de petite taille...

Commentaire de jashnlt le 20/08/2007 13:59:41

Bonjour,
Merci juju12 pour ta reponse, je vais essayer de modifier mon code pour avoir (enfin) une résolution convenable. :)

A oui aussi, est-il possible d'avoir un trai plein (par exemple quand je dessine avec le crayon) et non des pointillés ?

Commentaire de jashnlt le 21/08/2007 00:01:44

Qqn pour m'aider à résoudre mon problème d'indice et de redimmension de fenêtre ???

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

débutant MFC : pb avec editbox multiline [ par robby ] bonjour,J'aimerais savoir comment faire pour rajouter des lignes dans une editbox multiline sans récupérer à chaque fois l'ancien contenu parce que mo problème SDL [ par Synhok ] J'ai essayer le tut sur la librairie SDL et quand je compile avec DevC++, le linker me marque :C:\...\BIN\ld.exe: cannot open -lSDLmain: No such file les tampons d'OpenGL! [ par pepet ] Comment faire pour specifier a OpenGL que si il doit creer un pixel noir (0,0,0) lors de la création du nouveau tampon chromatique, il ne le mette pas Texte & SDL en mode Video [ par Gaelle ] Bonjour à tous,Je suis en train d'interfacer une application C à l'aide de SDL. Pour ce qui est de la gestion vidéo et évènements souris aucun problèm librairie SDL et coonio.h [ par gloom ] salut peuple svp qq1 opurrait t'il m'aider voila je cherche a afficher une photo sous console DOS pour cela je sait qu'il ¸faute une librairie SDL mai RichEdit Paint [ par crocejf2000 ] Salut a tous,--&gt;OS Win98, Borland C++ 5Je suis toujours avec mon compilateur maison, et j'ai un petit probleme d'affichage de ma RichEdit -&gt; c'e SDL [ par sabinus ] SabinusBonjour tout le monde.Je recherche la description en français de toutes les instructions et paramétres de la SDL (Windows xp). Lib SDL -> probleme d'images [ par zmc ] bonjour, je debute plus ou moins en SDL, et je n'ai pas réussi a afficher un sprites (animé ou non) sur une image de fond. Selon la méthode que j'empl Nom d'utilisateur [ par gibozsec ] Je cherche a récupérer le nom de l'utilisateur qui a lancé le programme. J utilise le code suivant avec MS Visual Studio 6.0 et XP home :LPTSTR tampon la librairie SDL pour dev-c++? [ par mioche ] Bonjour,G trouver des sources interessantes concernant la librairie SDL, moins puissante mais beaucoup plus simple que directx.Cependant, je cherche t


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,153 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales