adrezo >
les codes restent les meme bien sur
tu fais :
et puis tu as un nouveau des nouveaux types, tout comme int et double, tu as :
SDL_Surface* qui stocke une image
tu as des fonctions pour charger les images
tu as des fonctions pour " blitter" ton image, c´est a dire la poser a n´importe quel endroit de ton écran !
c´est du " collage"
" ça donne bien ou pas"
--> tu peux choisir ta résolution, donc mettre du 1024*768, voir du 1600*1200 si ton ordi le peut, avec 32 bits de couleurs si ça te chante
donc réponse oui.
tiens, je te conseille, si tu veux voir la théorie de " comment marche une lib 2D ( et 3D)"
http://www.fvirtman.fr.st
rubrique info/culture/theorie de l´image
et si tu veux un début de tuto sur SDL :
toujours mon site
rubrique info/progs/tuto C++, § 2.
oki ! Merci bcp JY², en fait, la SDL, n´est rien d´autre qu´une partie de C++, comme les instructions " cin" et " cout" avec iostream c´est ca non ?
je vais aller voir le site, et des que j´arrive a faire quelque chose de bien, je le mettrai sur le forum
merci encore ![]()
JY², on ne voit pas les pages blache qui font " pile la taille de notre ecran" ![]()
si tu pouvais y remettre !
Voila, c´est remis, tu peux allez voir
" en fait, la SDL, n´est rien d´autre qu´une partie de C++, comme les instructions " cin" et " cout" avec iostream c´est ca non ? "
--> Oui et non :
NON : parce qu´en réalité, tous les compilos contiennent iostream, cependant, ton compilo ne contiendra surement pas sdl a la base.
C´est pour cela que je te propose sur ma page de télécharger la lib SDL, afin de la greffer a ton compilateur ( c´est expliqué comment faire)
OUI : parce qu´une fois greffée, tu fais #include < SDL/SDL.h> et ça marche comme iostream, stdio, stdlib, etc... mais pour faire du graphique
c´est ça le C : tu installes de nouvelles lib, de nouvelles fonctionnalités, tu peux en créer toi meme, etc ! ! et apres, tu te fais plaisir ![]()
aaaah au s´crous, je galere ! le tutoriel montre comment afficher une image, mais moi, je voudrai que ca affiche l´image d´un de, suivant la valaur de " de" . .. mais moi, ca affiche que 1 un, voici mon programme :
SDL_Surface* screen; // l´ecran principale
SDL_Surface* firstscreen; / / tampon temporaire
SDL_Event event; // gestion d´evenement
void init_SDL() // initialise SDL
{
SDL_Init(SDL_INIT_VIDEO); // preapare SDL
screen = SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN); / / mode graphique
SDL_ShowCursor(0); / / eneleve la souris
}
void waitkey() // attend qu´on appuie sur RETURN
{
while(1) // boucle
{
while(SDL_PollEvent(&)) // aquisition d´evenement
{
if ( event.type == SDL_KEYDOWN) / / on appuie sur une touche ?
{
if ( event.key.keysym.sym == SDLK_RETURN) return; / / c´est " RETURN" ?
}
}
}
}
int main(int argc , char **argv)
{
/ /declarer variable
int de;
/ /calculer de
srand(time(NULL));
de = ( rand ( ) %6+1);
/ /afficher le de
debut:;
if ( de = 1)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_1.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
}
else if ( de = 2)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_2.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
}
else if ( de = 3)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_3.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
}
else if ( de = 4)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_4.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
}
else if ( de = 5)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_5.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
}
else if ( de = 6)
{
SDL_Rect rect1; // structure rectangle
init_SDL(); // initialise ( plus haut)
firstscreen = SDL_LoadBMP("de_6.bmp"); // charge l´image
/ / on dessine
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; // défini le rectangle
rect1.h = 768;
SDL_BlitSurface(firstscreen,NULL,screen,&1);
SDL_Flip(screen);
} // colle l´image sur l´écran, NULL car on affiche TOUTE l´image
// affiche la prochaine frame
waitkey();
goto debut; // attends qu´on appuie sur Return ( plus haut)
SDL_ShowCursor(1); // reactive la souris
SDL_Quit(); // quitte SDL
return 0; // quitte le programme
}
quelqu´un peut me dir comment faire pour que ca marche . .. @++
![]()
salut
ou je pourrai trouver un site ou apprendre le c et c++ de A à Z
ben ça n´existe pas une ressource ULTIME pour TOUT savoir du C++ :/
il faut combiner : sites, publications, docs en ligne, bouquins, etc.
par ex. pour qqun de déjà bien avancé, le C++ Performance/C++ Standards/C++ Draft ( docs PDF), associés à la doc en ligne de son compilo, plus qq bouquins " phares" comme More Effective C++ ou encore Modern C++ Design, ça fait une bonne panoplie. Mais faut pas non plus oublier la méthodologie : refactoring, conception, analyse, OOP, UML, design patterns, etc. Ce n´est pas une partie de du langage, mais plutot des éléments de démarches à adopter.
adrezo >
essaie donc de mettre == au lieu de mettre = dans tes if ![]()
tu verras ça passe mieux !
sinon, a l´occas, je t´expliquerai comment faire pour avoir un code + compact, sans avoir 50 copier/coller comme ça
tu imagines si tu avais le choix entre 1000 images ? ![]()
en tout cas, je suis content, visiblement tu n´as pas accroché pour installer SDL, tu arrives a y faire marcher
alors ça fait quelle impression de faire de la prog graphique ? ; -p
t t t, moi je suis sûr qu´il a fait exprés, en procédant ainsi il économise toute la gestion de pile d´éventuel appels de fonction : c´est du code op-ti-mi-sé.. plus qu´à faire un peu de " loop unrolling" et c´est nickel LOOOOL
( ou comment défendre son code douteux durant un code review avec le lead ; ) )
lol ! !
Tiens a ce propos, ça me rappelle une anecdote LGV :
a la fac, j´ai eu un prof : une tete comme tu n´en fais plus : le gars qui masterise a mort.
Lui, il prone l´appel de fonctions massif : ainsi, code tres compact. Et je lui ai dit : " pour gagner le temps de la gestion des CALL, on peut mettre " inline" devant vos fonctions"
--> tu écris le code compact, et a la compile, ça devient un code de copier/coller, et ça évite la gestion de pile !
Et il m´a répondu un truc auquel j´avais jamais pensé :
" ET NON ! !! car si ton code est tres petit, alors un gros pourcentage, voir tout, tiendra dans la mémoire cache, et ton programme sera plus rapide : car meme si il gere la pile, il n´aura pas a swapper entre la RAM et la cache ! "
Et ainsi, meme point de vue rapidité, il vaut mieux avoir un code plein de petites fonctions appelées dans tous les sens, et compact, plutot qu´un code énorme ( écrit en hard, ou alors plein de " inline")
c´est clair, l´utilisation du inline n´est pas aussi triviale qu´on pourrait le penser ; maintenant avant de savoir si tel bout de code tiens ou pas dans le cache... c´est plus facile à voir en assembleur. Imagine, tu fais une boucle super importante pour ton soft, tu fais tout pour que ce soit petit, mais pas bol une fonction appelée fait péter le cache et une autre génère des prediction fault :/ . ..
Au final, moi je dirais surtout il faut que le code soit clair avant tout ( en gros, y´a que 10 à 20% du code qui nécessite des attentions particulières : gratter 10 ms sur une init, tout le monde s´en fout, gratter 1 ms dans une boucle cruciale, ça c´est interessant). Et pour maitriser le cache, il faut faire des boucles dans lequel on n´appelle rien d´externe. Ahhh, c´est ça toutes les joies de la programmation ![]()
oui, mais avec un code petit, tu as + de chances qu´une grande partie tienne en cache ![]()
a ce jour, les algos de prédiction de cache sont encore tous secrets et il n´y en a pas d´universel : d´un ordi a un autre, ça marche pas pareil, mais C transparent pour l´utilisateur ![]()
d´où l´intéret pour le coder de connaitre 1) son langage 2) son compilo 3) sa plate-forme ; je crois qu´on est tous d´accord là-dessus ( ça répond d´ailleurs à une interrogation d´un autre topic : non il n´y a PAS de ressource ultime pour tout savoir et devenir un coder de génie : un bouquin qui parle d´archi machine ne parlera que peu de prog, et inversement. Vive les expérimentations...
oki, merci JY, pour l´instalation de la SDL, non, ce n´est pas tres compliqué donc, j´ai pu y arriver sans trop d eprobleme, et puis mon pgrm n´est pas si mal que ca, ac un pote kan on la fait on a di : on garde, ca en fera criser plus d´un, en effet, on doit mettre " tab + windows" pour quitter, l´ecran clignote, puis faut mettre " ctrl+alt+F4"
enifn bon,
je vais aller essay de mettre des ==
![]()
merci !
Le problème de ton programme est qu´il est très difficile à modifier.
Imaginons que tu veuilles générer un dé à 8 faces au lieu des six que tu as ici. Tu seras obligé de recommencer à copier/coller à répétition. Si tu désires faire un dé à 10, 12 ou 20 faces, ça va devenir très lourd.
Il est possible de modifier ton programme en utilisant des tableaux et en créant une seule image qui serait un alignement de toutes les images de chiffres. Ca réduirait énormément la taille de ton programme, et il serait beaucoup plus simple de le modifier pour créer le dé que tu désires.
Tu peux même faire en sorte que l´utilisateur décide lui-même le nombre de faces du dé, afin qu´il ne soit pas nécessaire de recompiler le programme pour chaque type de dé.
ce que tu veux dir c´est que en fait, seule l´image changerait ? ?
j´ai pas tout compris, tu peux me reexpliquer stp ![]()
Ce que je veux dire, c´est que tu peux réécrire ton programme de façon beaucoup plus propre et beaucoup plus courte. Là, tu as eu recours à des copier/coller à répétition, et c´est en général la preuve que tu as mal conçu ton programme.
Pour chacune des valeurs possibles de ton dé, tu charges une image différente ( de_1.bmp, de_2.bmp, etc...) et tu la copies sur la surface principale.
Ce que tu peux faire à la place, c´est créer une image qui soit l´alignement des six images de chiffres. Par exemple, un premier carré de 32*32 qui correspond au 1, un second de 32*32 qui correspond au 2, etc... Tu auras ainsi une image de.bmp qui mesurera 32 en hauteur et 32*6 en largeur.
Ensuite, il suffira, selon la valeur du dé, de choisir une partie de cette image " de.bmp", celle qui correspondra à la valeur du dé, et de copier uniquement cette partie-là dans ta fonction SDL_BlitSurface.
Tu auras donc quelque chose qui ressemblera à ça:
de = ( rand ( ) %6+1);
SDL_Rect rect1; / / rectangle de la fenêtre principale
SDL_Rect rect2; / / rectangle correspondant à la partie de l´image que tu vas copier
init_SDL(); / / initialise ( plus haut)
firstscreen = SDL_LoadBMP("de.bmp"); / / charge l´image contenant les images de tous les dés accolés
rect1.x = 0;
rect1.y = 0;
rect1.w = 1024; / / défini le rectangle
rect1.h = 768;
rect2.x = ( de-1)*32; / / sélectionne le bon chiffre
rect2.y = 0
rect2.w =32;
rect2.h=32;
SDL_BlitSurface(firstscreen,&2,screen,&1);
SDL_Flip(screen);
Et là, tu n´es plus obligé d´avoir recours à une succession de if, else, etc..., ce qui raccourcit considérablement le code.
De plus, si jamais tu veux que les valeurs affichées soient plus grandes, il suffit de créer un fichier de.bmp qui comprendra par exemple 8 valeurs, et de changer
de = ( rand ( ) %6+1);
en
de = ( rand ( ) %8+1);
sans rajouter de code.
J´espère avoir été plus clair
J´ai choisi la valeur 32 au hasard. Tu dois la remplacer dans ton propre code par la longueur du côté de l´image représentant ton chiffre.
Et si tu ne preferes pas accoler les images : rien ne t´empeche, par exemple, de faire :
char*
nom_image[6]={"de1.bmp","de2.bmp","de3.bmp","de4.b
mp","de5.bmp","de6.bmp"};
int de = rand()%6;
firstscreen = SDL_LoadBMP(nom_image[de]);
etc ! ! et meme plus besoin de if ![]()
ou encore:
char nom_image[8];
char value[2];
strcpy(nom_image, " de");
itoa(de, value, 10);
strcat(nom_image, value);
strcat(nom_image, " .bmp");
de= rand()%6;
firstscreen = SDL_LoadBMP(nom_image[de]);
C´est un peu plus complexe que ce qu´a écrit JYY, mais c´est plus facile à réutiliser.