Se connecter

Informatique

Création de Jeux

Sujet : [SDL].images
1
dynoplasmma
Niveau 9
11 mai 2005 à 18:16:51

Pour tout vous expliquer, je n´arrive pas a rajouter une image apres une image plein ecran, je vais donc mettre le code et si une bonne ame passe par ici, il pourrait rajouter les lignes necessaires avec tout ms remerciments si necessaires. :svp: (sous dev c++)
Voici le truc :

  1. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* firstscreen;
SDL_Event event;

void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}

void waitkey()
{
while(1)
{
while(SDL_PollEvent(&))
{
if ( event.type == SDL_KEYDOWN)
{
if ( event.key.keysym.sym == SDLK_RETURN) return;
}
}
}
}

int main(int argc , char **argv)
{
SDL_Rect rect1;
init_SDL();
firstscreen = SDL_LoadBMP("image.bmp");
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024;
rect1.h = 768;

SDL_BlitSurface(firstscreen,NULL,screen,&1);

SDL_Flip(screen);
waitkey();
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}

:merci: d´avance

A plus

Moule53
Niveau 10
11 mai 2005 à 18:28:37

Pas compris la question . ..

Sinon c´est le code du tuto de JYY sur le sdl ça :)

Vengeur41
Niveau 10
11 mai 2005 à 18:38:44
  1. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* firstscreen;
SDL_Event event;

void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}

void waitkey()
{
while(1)
{
while(SDL_PollEvent(&))
{
if ( event.type == SDL_KEYDOWN)
{
if ( event.key.keysym.sym == SDLK_RETURN) return;
}
}
}
}

int main(int argc , char **argv)
{
SDL_Rect rect1;
init_SDL();
firstscreen = SDL_LoadBMP("image.bmp");

SDL_BlitSurface(firstscreen,NULL,screen,NULL);

SDL_Flip(screen);
waitkey();
SDL_ShowCursor(1);

SDL_FillRect(screen,NULL,0);
firstscreen = SDL_LoadBMP("image2.bmp");

SDL_BlitSurface(firstscreen,NULL,screen,NULL);

SDL_Flip(screen);
waitkey();

SDL_Quit();
return 0;
}

Si j´ai bien compris la question...

Au fait je trouve la fonction waitkey très " porc" ( enfin, dans ma façon de voir les choses), rien que la gestion du clavier par events j´aime pas ca, sortir d´une boucle while infinie ( j´aime pas les while infinies d´abord, na ! ) en " forcant" non plus... Ma fonction waitkey() :

void waitkey()
{
Uint8 *keystate = keystate = SDL_GetKeyState(NULL);
unsigned short i;
bool keypressed=false;
while ( !keypressed)
{
keystate = SDL_GetKeyState(NULL);
for ( i=0;i<256;i++)
{
if ( keystate[i]){keypressed=true; i=256;}
}
eventloop();
}
}

Bon ok mon exemple est ptet laid mais je préfère largement ça... Fin bon, c´est toi qui vois ; )

dynoplasmma
Niveau 9
11 mai 2005 à 18:40:00

Oui, c´est es cours de JYY que je remercie au passage.
En fait, je veux mettre une image en plein ecran comme cela, mais je voudrais rajouter d´autres images que je pourrais mettre n´importe ou avec x et y, mais je ne sais pas comment faire, quelles lignes mettre, a quels endroits ?
Tu comprends ?

dynoplasmma
Niveau 9
11 mai 2005 à 18:47:34

Merci vengeur mais il y a un petit probleme,

J´execute, ca affiche la premiere image

Je fait entré

La deuxieme image s´affiche

Je fait entré

Cela retourne sous windows

Et je voudrais les deux images en meme temps, you understand ?

Vengeur41
Niveau 10
11 mai 2005 à 18:47:35

SDL_Rect rcdst;
SDL_Surface *screen;
SDL_Surface *mesimages[15];
int i;
char nomfichier[40];

for ( i=0;i<15;i++)
{
sprintf(nomfichier,"image%d.bmp",i+1);
mesimages[i] = SDL_LoadBMP(nomfichier);
rcdst.x = rand()%(640-150);
rcdst.y = rand()%(480-150);

SDL_BlitSurface(mesimages[i],NULL,screen,&);

}
SDL_Flip(screen);
waitkey();

Voilà, met ca dans ton code après l´init de SDL ( tu as dja screen je pense). Crée 15 images que tu nomme image1.bmp à image15.bmp de 150x150 et observe le résultat.

JeanYvesYves
Niveau 10
11 mai 2005 à 18:50:40

boah, ma fonction waitkeyr, elle est pratique :)
mais je ne m´en sers plus des le chapitre 1.4 ou je fais une fonction UpdateEvent qui masque toute la pile d´event de SDL !

Apres, pour faire un waitkey ( pour return), il suffit de faire :

while(!Key(SDLK_RETURN))
{
UpdateEvents();
}

voila :)

Moule53
Niveau 10
11 mai 2005 à 18:51:28

Ah ouais je vois,bon je vais faire de mon mieux :)
On créer un nouveau SDL_Surface en haut avec les autres qui portera le nom que tu veux.
On déclare un nouveau Rect que l´on va nommer rect2 qui aura des coordonnés différentes du rect1,là,c´est toi qui choisis la position :-)
Ensuite, " Loader" les images correspondantes pour tes nouvelles surfaces ( au début du int main avec les autres SDL_Loadimage)
Et finalement,placer a la suite les fonctions de Blit et de Flip de l´autre qui fait apparaitre image1.bmp :ok:
Bon je procède comme ça,je trouve ça sale,donc je vais me faire tout petit et laisser les experts montrer une méthode simple et propre :-p

Vengeur41
Niveau 10
11 mai 2005 à 19:03:17

Déclarer des rects différents ? Pourquoi faire ? Une fois l´image blittée, le rect sert plus à rien, tu le ré-utilise ! Et voilà t´as un code tout propre...

JeanYvesYves
Niveau 10
11 mai 2005 à 19:06:00

de meme - pub pour mon futils commencé - si tu regardes mon jeu de promenade, j´ai programmé une fonction " Blit" qui gere en interne des Rect, mais cependant, des que la fonction est faite, tu n´as plus du tout a créer des rect et tout :)

tu mets :

Blit(source, x1,y1,x2,y2 , dest, x3,y3)

et pan, ça marche !

dynoplasmma
Niveau 9
11 mai 2005 à 19:06:18

J´ai fait ca mais il n´y a que l´image 2 qui s´affiche :

  1. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* firstscreen;
SDL_Event event;

void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}

void waitkey()
{
while(1)
{
while(SDL_PollEvent(&))
{
if ( event.type == SDL_KEYDOWN)
{
if ( event.key.keysym.sym == SDLK_RETURN) return;
}
}
}
}

int main(int argc , char **argv)
{
SDL_Rect rect1;
init_SDL();
firstscreen = SDL_LoadBMP("image1.bmp");
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024;
rect1.h = 768;

SDL_BlitSurface(firstscreen,NULL,screen,&1);

SDL_Flip(screen);

SDL_Rect rect2;
init_SDL();
firstscreen = SDL_LoadBMP("image2.bmp");
rect1.x = 10;
rect1.y = 13;
rect1.w = 640;
rect1.h = 780;

SDL_BlitSurface(firstscreen,NULL,screen,&1);

SDL_Flip(screen);

waitkey();
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}

Et pour le truc de JYY, j´ai pas pigé ? ??

JeanYvesYves
Niveau 10
11 mai 2005 à 19:06:56

de meme - pub pour mon futils commencé - si tu regardes mon jeu de promenade, j´ai programmé une fonction " Blit" qui gere en interne des Rect, mais cependant, des que la fonction est faite, tu n´as plus du tout a créer des rect et tout :)

tu mets :

Blit(source, x1,y1,x2,y2 , dest, x3,y3)

et pan, ça marche !

j´ai pas encore mis en ligne la fonction surchargée ( ou plutot sous chargée)

Blit(source,dest,x,y);

plus simlpe, et permet de blitter une image entiere, et plus besoin de SDL_Rect...

Moule53
Niveau 10
11 mai 2005 à 19:07:13

Et bien on en apprends beaucoup sur ce forum :)
Je m´endormirais moins abruti ce soir :lol:

Vengeur41
Niveau 10
11 mai 2005 à 19:08:57

C´est normal :

  1. include < SDL/SDL.h>

SDL_Surface* screen;
SDL_Surface* firstscreen;
SDL_Event event;

void init_SDL()
{
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
SDL_ShowCursor(0);
}

void waitkey()
{
while(1)
{
while(SDL_PollEvent(&))
{
if ( event.type == SDL_KEYDOWN)
{
if ( event.key.keysym.sym == SDLK_RETURN) return;
}
}
}
}

int main(int argc , char **argv)
{
SDL_Rect rect1;
init_SDL();
firstscreen = SDL_LoadBMP("image1.bmp");
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024;
rect1.h = 768;

SDL_BlitSurface(firstscreen,NULL,screen,&1);

firstscreen = SDL_LoadBMP("image2.bmp");
rect1.x = 10;
rect1.y = 13;
rect1.w = 640;
rect1.h = 780;

SDL_BlitSurface(firstscreen,NULL,screen,&1);

SDL_Flip(screen);

waitkey();
SDL_ShowCursor(1);
SDL_Quit();
return 0;
}

Là ca doit marcher.
Et on initialise pas 2 fois la SDL !

Moule53
Niveau 10
11 mai 2005 à 19:10:02

Regarde ton code, image2 est sur rect1 au lieu de rect2,pareil quand tu définis rect2 :)

Mais bon jvais me taire pour éviter de t´induire dans l´erreur . ..

Vengeur41
Niveau 10
11 mai 2005 à 19:15:12

Moule > Vaut mieux...

dynoplasmma
Niveau 9
11 mai 2005 à 21:56:17

:merci: enormelent vengeur41, cela fonctionne, et je pourrais continuer ce que je faisait.
Sympa a vous, bon vent, et bonne nuit . ..

PS : j´ai scholl demain, vendredi : journee pedagogique : pas school, samedi dimanche : week end: pas school, lundi de pentecote, normalement ecole, mais j´y vais pas : pas school :

= WEEK END DE 4 JOURS
HOURRA, c´est la liberation des ecoles ! !!!!!!!!!!!!!!!!!!!!!!!!!
Nous sommes libres ! !!!!!!!!

Bon, sur ce, je vous dit ; A plus, et merci pour tout ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

:content:
:oui:
:cool:
:merci:
:by:

Moule53
Niveau 10
11 mai 2005 à 22:02:43

Le lundi de pentecote n´a pas été supprimé ?

Moule53
Niveau 10
11 mai 2005 à 22:03:14

Ah sorry j´avais mal lu

dynoplasmma
Niveau 9
12 mai 2005 à 18:52:21

Encore un truc que je n´arrive pas et que je pensais que j´allais reussir ; virer la couleur pour la rendre invisible.

Dans ce bout de code :

firstscreen = SDL_LoadBMP("image.bmp");
rect1.x = 0;
rect1.y = 332.5;
rect1.w = 1024;
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);

Il faut rajouter la ligne :
SDL_SetAlpha(image,SDL_SRCALPHA,128);

Mais ou la mettre, j´ai essayé a plains d´endroits, tell que :

firstscreen = SDL_LoadBMP("image.bmp");
rect1.x = 0;
rect1.y = 332.5;
rect1.w = 1024;
rect1.h = 768;
SDL_SetAlpha(image,SDL_SRCALPHA,128);
SDL_BlitSurface(firstscreen,NULL,screen,&1);

Cela ne marche pas.

Ou alors :

firstscreen = SDL_LoadBMP("image.bmp");
SDL_SetAlpha(image,SDL_SRCALPHA,128);
rect1.x = 0;
rect1.y = 332.5;
rect1.w = 1024;
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);

Aucun resultats, qui aurais la sympathie de m´indiquer la voie de la verité :svp: ?

1
Sujet : [SDL].images
   Retour haut de page
Consulter la version web de cette page