Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉBUT D'UN "PAINT" EN SDL


Information sur la source

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é: 2 975 / 113

Note :
Aucune note

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

Pour les "Membres Club", vous pouvez 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).

Commentaires et avis

signaler à un administrateur
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.

signaler à un administrateur
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 ? ;) )

signaler à un administrateur
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...

signaler à un administrateur
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 ?

signaler à un administrateur
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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.