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
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.