CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Petite question sur le C/C++

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 13:08:36

adrezo >
les codes restent les meme bien sur :)

tu fais :

  1. include < sdl.h> / * la tu reconnais */

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.

Adrezo
Adrezo
Niveau 9
11 juin 2004 à 15:04:50

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 :-)

Adrezo
Adrezo
Niveau 9
11 juin 2004 à 15:07:17

JY², on ne voit pas les pages blache qui font " pile la taille de notre ecran" :-)
si tu pouvais y remettre !

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 15:37:13

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 :)

Adrezo
Adrezo
Niveau 9
11 juin 2004 à 17:36:21

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 :

  1. include < stdio.h>
  2. include < SDL.h>
  3. include < iostream.h>
  4. include < stdlib.h>
  5. include < time.h >

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 . .. @++
:)

0deepthroat0
0deepthroat0
Niveau 10
11 juin 2004 à 17:42:39

salut

ou je pourrai trouver un site ou apprendre le c et c++ de A à Z

LGV
LGV
Niveau 28
11 juin 2004 à 18:24:10

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.

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 18:40:57

adrezo >
essaie donc de mettre == au lieu de mettre = dans tes if :)
tu verras ça passe mieux ! :lol:

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 ? :lol:

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 18:42:00

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

LGV
LGV
Niveau 28
11 juin 2004 à 18:45:36

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 ; ) )

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 19:15:53

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")

LGV
LGV
Niveau 28
11 juin 2004 à 19:23:08

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 :)

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 19:28:41

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 :)

LGV
LGV
Niveau 28
11 juin 2004 à 19:38:39

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

Adrezo
Adrezo
Niveau 9
11 juin 2004 à 21:00:41

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 !

Mathrim
Mathrim
Niveau 8
11 juin 2004 à 21:10:10

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

Adrezo
Adrezo
Niveau 9
11 juin 2004 à 21:15:28

ce que tu veux dir c´est que en fait, seule l´image changerait ? ?
j´ai pas tout compris, tu peux me reexpliquer stp :-d

Mathrim
Mathrim
Niveau 8
11 juin 2004 à 21:49:47

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.

JeanYvesYves
JeanYvesYves
Niveau 10
11 juin 2004 à 21:55:11

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 :)

Mathrim
Mathrim
Niveau 8
11 juin 2004 à 22:11:59

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.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment