Pb de transparence sous sdl
toko_yagi59
-
SofEvans -
SofEvans -
bonjour, voilà je voulais créer un petit jeu avec une grenouille qui saute sur des nuages mais je suis débutante et je ne connais que les bases du langage C.
J'étais toute contente en parvenant à animer mon personnage à l'écran mais je n'arrive pas à rendre le sprite transparent. J'ai utilisé une feuille de sprites avec un fond rose (255, 0, 128) et je pensais pouvoir faire disparaitre cette couleur avec SetColorKey mais depuis que j'ai ajouté cette fonction dans mon code, non seulement il reste un tour rose à mon personnage, mais en plus les étapes du sprites se supperposent sur l'écran lorsque je compile.
Voici mon code qui doit forcément contenir une erreur :
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *background = NULL, *image = NULL;
SDL_Rect sdlSrcSprite;
SDL_Rect positionFond;
SDL_Rect positionImage;
sdlSrcSprite.x = 0;
sdlSrcSprite.y = 0;
sdlSrcSprite.w = 90;
sdlSrcSprite.h = 113;
positionFond.x = 0;
positionFond.y = 0;
positionImage.x = 50;
positionImage.y = 50;
int etapeEnCours = 0;
int currentTime;
int nextUpdateTime;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
ecran = SDL_SetVideoMode(500, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("le jeu de la grenouille", NULL);
background = SDL_LoadBMP("background1.bmp");
SDL_BlitSurface(background, NULL, ecran, &positionFond);
image = SDL_LoadBMP("sprite sheet grenouille.bmp");
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 128));
currentTime = nextUpdateTime = SDL_GetTicks();
while(continuer)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
case SDL_QUIT:
continuer = 0;
break;
}
sdlSrcSprite.x = etapeEnCours*90;
SDL_BlitSurface(image, &sdlSrcSprite, ecran, &positionImage);
currentTime = SDL_GetTicks();
if(currentTime>nextUpdateTime)
{
etapeEnCours++;
if(etapeEnCours>2)
{
etapeEnCours = 0;
}
nextUpdateTime = currentTime + 500;
}
SDL_Flip(ecran);
}
SDL_FreeSurface(background);
SDL_FreeSurface(image);
SDL_Quit();
return EXIT_SUCCESS;
}
Voilà j'espère que quelqu'un pourra m'aider, si vous avez besoin de plus de renseignements n'hésitez pas à me les demander.
Je compte sur votre indulgence, je n'suis qu'une débutante qui s'est lancée dans la programmation il y a peu de temps, s'il vous plait ne me cassez pas comme certains ont l'habitude de le faire sur les forums :(
merci d'avance
J'étais toute contente en parvenant à animer mon personnage à l'écran mais je n'arrive pas à rendre le sprite transparent. J'ai utilisé une feuille de sprites avec un fond rose (255, 0, 128) et je pensais pouvoir faire disparaitre cette couleur avec SetColorKey mais depuis que j'ai ajouté cette fonction dans mon code, non seulement il reste un tour rose à mon personnage, mais en plus les étapes du sprites se supperposent sur l'écran lorsque je compile.
Voici mon code qui doit forcément contenir une erreur :
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *background = NULL, *image = NULL;
SDL_Rect sdlSrcSprite;
SDL_Rect positionFond;
SDL_Rect positionImage;
sdlSrcSprite.x = 0;
sdlSrcSprite.y = 0;
sdlSrcSprite.w = 90;
sdlSrcSprite.h = 113;
positionFond.x = 0;
positionFond.y = 0;
positionImage.x = 50;
positionImage.y = 50;
int etapeEnCours = 0;
int currentTime;
int nextUpdateTime;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
ecran = SDL_SetVideoMode(500, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("le jeu de la grenouille", NULL);
background = SDL_LoadBMP("background1.bmp");
SDL_BlitSurface(background, NULL, ecran, &positionFond);
image = SDL_LoadBMP("sprite sheet grenouille.bmp");
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 128));
currentTime = nextUpdateTime = SDL_GetTicks();
while(continuer)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
case SDL_QUIT:
continuer = 0;
break;
}
sdlSrcSprite.x = etapeEnCours*90;
SDL_BlitSurface(image, &sdlSrcSprite, ecran, &positionImage);
currentTime = SDL_GetTicks();
if(currentTime>nextUpdateTime)
{
etapeEnCours++;
if(etapeEnCours>2)
{
etapeEnCours = 0;
}
nextUpdateTime = currentTime + 500;
}
SDL_Flip(ecran);
}
SDL_FreeSurface(background);
SDL_FreeSurface(image);
SDL_Quit();
return EXIT_SUCCESS;
}
Voilà j'espère que quelqu'un pourra m'aider, si vous avez besoin de plus de renseignements n'hésitez pas à me les demander.
Je compte sur votre indulgence, je n'suis qu'une débutante qui s'est lancée dans la programmation il y a peu de temps, s'il vous plait ne me cassez pas comme certains ont l'habitude de le faire sur les forums :(
merci d'avance
A voir également:
- Pb de transparence sous sdl
- Paint.net transparence ✓ - Forum Graphisme
- Transparence image arrière plan open office ✓ - Forum LibreOffice / OpenOffice
- Superposer deux images transparence - Forum Graphisme
- Comment on opacite une image Sur Paint.net? ✓ - Forum Logiciels
- Mettre une image en transparence word - Guide
2 réponses
En retravaillant un peu mon code je suis parvenue à résoudre le problème de superposition des sprites, mais il reste toujours celui de la transparence. En effet, mon personnage est entouré en partie de rose (couleur de fond de ma feuille de sprite) bien que j'ai utilisé la fonction SetColorKey.
Voici donc mon nouveau code, avec une modification au niveau de l'emplacement des blits ainsi que l'ajout d'un FillRect :
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *background = NULL, *image = NULL;
SDL_Rect sdlSrcSprite;
SDL_Rect positionFond;
SDL_Rect positionImage;
sdlSrcSprite.x = 0;
sdlSrcSprite.y = 0;
sdlSrcSprite.w = 90;
sdlSrcSprite.h = 113;
positionFond.x = 0;
positionFond.y = 0;
positionImage.x = 50;
positionImage.y = 50;
int etapeEnCours = 0;
int currentTime;
int nextUpdateTime;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
ecran = SDL_SetVideoMode(500, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("le jeu de la grenouille", NULL);
background = SDL_LoadBMP("background1.bmp");
image = SDL_LoadBMP("sprite sheet grenouille.bmp");
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 128));
currentTime = nextUpdateTime = SDL_GetTicks();
while(continuer)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
case SDL_QUIT:
continuer = 0;
break;
}
sdlSrcSprite.x = etapeEnCours*90;
currentTime = SDL_GetTicks();
if(currentTime>nextUpdateTime)
{
etapeEnCours++;
if(etapeEnCours>2)
{
etapeEnCours = 0;
}
nextUpdateTime = currentTime + 500;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
SDL_BlitSurface(background, NULL, ecran, &positionFond);
SDL_BlitSurface(image, &sdlSrcSprite, ecran, &positionImage);
SDL_Flip(ecran);
}
SDL_FreeSurface(background);
SDL_FreeSurface(image);
SDL_Quit();
return EXIT_SUCCESS;
}
Voici donc mon nouveau code, avec une modification au niveau de l'emplacement des blits ainsi que l'ajout d'un FillRect :
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *background = NULL, *image = NULL;
SDL_Rect sdlSrcSprite;
SDL_Rect positionFond;
SDL_Rect positionImage;
sdlSrcSprite.x = 0;
sdlSrcSprite.y = 0;
sdlSrcSprite.w = 90;
sdlSrcSprite.h = 113;
positionFond.x = 0;
positionFond.y = 0;
positionImage.x = 50;
positionImage.y = 50;
int etapeEnCours = 0;
int currentTime;
int nextUpdateTime;
int continuer = 1;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
ecran = SDL_SetVideoMode(500, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("le jeu de la grenouille", NULL);
background = SDL_LoadBMP("background1.bmp");
image = SDL_LoadBMP("sprite sheet grenouille.bmp");
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 128));
currentTime = nextUpdateTime = SDL_GetTicks();
while(continuer)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
case SDL_QUIT:
continuer = 0;
break;
}
sdlSrcSprite.x = etapeEnCours*90;
currentTime = SDL_GetTicks();
if(currentTime>nextUpdateTime)
{
etapeEnCours++;
if(etapeEnCours>2)
{
etapeEnCours = 0;
}
nextUpdateTime = currentTime + 500;
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
SDL_BlitSurface(background, NULL, ecran, &positionFond);
SDL_BlitSurface(image, &sdlSrcSprite, ecran, &positionImage);
SDL_Flip(ecran);
}
SDL_FreeSurface(background);
SDL_FreeSurface(image);
SDL_Quit();
return EXIT_SUCCESS;
}
Désolé pour le retard.
C'est a cause de tes sprite.
En fait, lorsque tu défini ta transparence avec 255/0/128, les pixel ayant exactement ce code seront rendue transparent.
Or, ton sprite doit être sans doute "lisser", ce qui fait que le rose que tu vois, et que tu vois uniforme, n'est pas uniforme en réalité.
Au voisinage de ta grenouille, ta couleur doit valeur 225/4/130 (exemple), ce qui , pour ton oeil, est exactement le rose que tu veux supprimer. Mais pour le PC, c'est pas la bonne couleur.
C'est pour ca que ta grenouille semble posséder une "aura" ou un "halo" rose ^^
C'est a cause de tes sprite.
En fait, lorsque tu défini ta transparence avec 255/0/128, les pixel ayant exactement ce code seront rendue transparent.
Or, ton sprite doit être sans doute "lisser", ce qui fait que le rose que tu vois, et que tu vois uniforme, n'est pas uniforme en réalité.
Au voisinage de ta grenouille, ta couleur doit valeur 225/4/130 (exemple), ce qui , pour ton oeil, est exactement le rose que tu veux supprimer. Mais pour le PC, c'est pas la bonne couleur.
C'est pour ca que ta grenouille semble posséder une "aura" ou un "halo" rose ^^