A5painting,le paint a la débutant

Contenu du snippet

C'est un logiciel débutant qui a pour but d'aider peut être des gens a une partie ou ils étaient bloqués.
Le logiciel utilise la SDL et est programmé en langage C.
Le code source est facile a écrire et devrait être opérationnel.

Source / Exemple :


Il y a plusieurs fichiers,je vous les donne:
constantes.h:

#ifndef DEF_CONSTANTES_H
#define DEF_CONSTANTES_H

#define TAILLE_BLOC 30
#define NB_BLOC_LARGEUR 15
#define NB_BLOC_HAUTEUR 15
#define LARGEUR NB_BLOC_LARGEUR*TAILLE_BLOC
#define HAUTEUR NB_BLOC_HAUTEUR*TAILLE_BLOC

enum{VIDE,POINT};

#endif

main.c

#include<stdio.h>
#include<stdlib.h>
#include<SDL/SDL.h>
#include<SDL/SDL_image.h>
#include"dessiner.h"
#include"constantes.h"

int main(int argc,char* argv[])
{
	//Declaration des variables et pointeurs de base
	SDL_Surface *ecran = NULL, *menu = NULL;
	SDL_Rect position;
	SDL_Event evente;
	int continuer = 1;

	//Initiallisation de SDL
	SDL_Init(SDL_INIT_VIDEO);

	//Initialisation des variables
	ecran = SDL_SetVideoMode(LARGEUR,HAUTEUR,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
	SDL_WM_SetCaption("A5Painting",NULL);
	menu = IMG_Load("menu.bmp");
	position.x = 0;
	position.y = 0;

	//Blitage du menu
	SDL_BlitSurface(menu,NULL,ecran,&position);
	SDL_Flip(ecran);

	//Boucle événementielle
	while(continuer)
	{
		SDL_WaitEvent(&evente);
		switch(evente.type)
		{
		case SDL_QUIT:
			continuer = 0;
			break;
		case SDL_KEYDOWN:
			switch(evente.key.keysym.sym)
			{
			case SDLK_e:
				pinceau(ecran);
				break;
			default:
				continuer = 0;
				break;
			}
			break;
		}
	SDL_Flip(ecran);
	}
	SDL_FreeSurface(menu);
	SDL_Quit();
	return 0;
}

dessin.c et .h

#ifndef DEF_DESSINER_H
#define DEF_DESSINER_H

void pinceau(SDL_Surface* ecran);

#endif

dessin.c

#include<stdio.h>
#include<stdlib.h>
#include<SDL/SDL.h>
#include<SDL/SDL_image.h>
#include"constantes.h"

void pinceau(SDL_Surface* ecran)
{
	//Déclaration des variables et pointeur de base
	SDL_Surface* pinceau = NULL;
	SDL_Surface* point = NULL;
	SDL_Surface* vide = NULL;
	SDL_Surface* erreur = NULL;
	SDL_Rect position;
	SDL_Event evente;
	int c = 1,ClicEnCour = 0;
	int draw[NB_BLOC_LARGEUR][NB_BLOC_HAUTEUR] = {0};
	int i = 0,j = 0;

	//Initialisation des variables et pointeur
	pinceau = IMG_Load("pinceau.bmp");
	point = IMG_Load("point.bmp");
	vide = IMG_Load("vide.bmp");
	erreur = IMG_Load("erreur.bmp");
	SDL_EnableKeyRepeat(10,10);

	//Chargement de draw
	load(draw);
	if(load(draw) == NULL || load(draw) == 0)//Si draw n'a pas pu être chargé et que load renvoit NULL ou 0 on affiche ERREUR
	{
		position.x = 0;position.y = 0;
		SDL_BlitSurface(erreur,NULL,ecran,&position);
	}

     //Remplie draw
	for(i = 0;i < NB_BLOC_LARGEUR;i++)
	{
		for(j = 0;j < NB_BLOC_HAUTEUR;i++)
		{
			position.x = i*TAILLE_BLOC;
			position.y = j*TAILLE_BLOC;
			switch(draw[i][j])
			{
			case VIDE:
				SDL_BlitSurface(vide,NULL,ecran,&position);
				break;
			case POINT:
				SDL_BlitSurface(point,NULL,ecran,&position);
				break;
			}
		}
	}

	//Boucle événementielle
	while(c)
	{
		SDL_WaitEvent(&evente);
		switch(evente.type)
		{
		case SDL_QUIT:
			c = 0;
			break;
		case SDL_MOUSEMOTION:
			position.x = evente.motion.x - (pinceau ->w /2);
			position.y = evente.motion.y - (pinceau ->h /2);
			break;
		case SDL_KEYDOWN:
			switch(evente.key.keysym.sym)
			{
			case SDLK_RIGHT:
				position.x++;
				SDL_BlitSurface(point,NULL,ecran,&position);
				break;
			case SDLK_LEFT:
				position.x--;
				SDL_BlitSurface(point,NULL,ecran,&position);
				break;
			case SDLK_UP:
				position.y--;
				SDL_BlitSurface(point,NULL,ecran,&position);
				break;
			case SDLK_DOWN:
				position.y++;
				SDL_BlitSurface(point,NULL,ecran,&position);
				break;
			case SDLK_s:
				c = 0;
				break;
			case SDLK_n:
				SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
				break;
			case SDLK_a:
				save(draw);
				break;
			}
			break;
		case SDL_MOUSEBUTTONDOWN:
			if(evente.button.button == SDL_BUTTON_LEFT)
			{
				ClicEnCour = 1;
			}
			break;
		case SDL_MOUSEBUTTONUP:
			ClicEnCour = 0;
			break;
		}
		switch(ClicEnCour)
		{
		case 1:
			SDL_BlitSurface(point,NULL,ecran,&position);
			break;
		}
		
		SDL_Flip(ecran);
	}

	

	SDL_Flip(ecran);

	SDL_FreeSurface(point);
	SDL_FreeSurface(pinceau);
	SDL_FreeSurface(vide);
	SDL_FreeSurface(erreur);
	SDL_Quit();
}

fichier.c 

#include<stdio.h>
#include<stdlib.h>
#include<SDL/SDL.h>
#include<SDL/SDL_image.h>
#include"constantes.h"

int load(int draw[][NB_BLOC_HAUTEUR])
{
	FILE* fichier = NULL;
	char ligneFichier[NB_BLOC_LARGEUR * NB_BLOC_HAUTEUR + 1] = {0};
    int i = 0, j = 0;

    fichier = fopen("save.cd", "r");
    if (fichier == NULL)
    return 0;
	fgets(ligneFichier,NB_BLOC_LARGEUR*NB_BLOC_HAUTEUR +1,fichier);
	for(i = 0;i < NB_BLOC_LARGEUR;i++)
	{
		for(j = 0;j < NB_BLOC_HAUTEUR;j++)
		{
			switch(ligneFichier[(i * NB_BLOC_LARGEUR) + j])
			{
			case '0':
				draw[i][j] = 0;
				break;
			case '1':
				draw[i][j] = 1;
				break;
			}

		}
	}
	fclose(fichier);
	return 1;
}

int save(int draw[][NB_BLOC_HAUTEUR])
{
	FILE* fichier = NULL;
	int i = 0,j = 0;

	fichier = fopen("save.cd","w");
	if (fichier == NULL)
        return 0;
	for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOC_HAUTEUR ; j++)
        {
            fprintf(fichier, "%d", draw[j][i]);
        }
    }

    fclose(fichier);
    return 1;
}

fichier.h

#ifndef DEF_FICHIER_H
#define DEF_FICHIER_H

int load(int draw[][NB_BLOC_HAUTEUR]);
int save(int draw[][NB_BLOC_HAUTEUR]);

#endif

Conclusion :


Voila,si vous comprenez ce code,vous êtes tout a fait capable de reproduire un Paint ou pourquoi pas un Gimp (avec beaucoup de patience ^^).

A la prochaine !

PS: cette version est une version instable,elle est donc intestée et par conséquent elle contient quelques bugs :( !!
Ne m'en tenez pas rigeure mais je garde les sources stables pour le moment car elles sont encore en dévellopement,surtout la partie des boutons,elle est vraiment longue et chiante ^^

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.