Début d'un "paint" en sdl

Description

Ce code permet de blitter des "tampons" (2 actuellement) et de les garder en mémoire grace à un tableau à trois colonne.

Source / Exemple :


/*

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

Codes Sources

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.