mvc open pdf in new tab : How to extract text from pdf image file software SDK cloud windows winforms wpf class c30-part895

303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 301 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Une fois que c'est fait, on peut fermer le fichier et renvoyer 1 pour dire que tout s'est bien passé : 
Code : C
fclose(fichier);
return 1;
Résumé de la fonction chargerFichier 
Code : C
int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
int i = 0, j = 0;
fichier = fopen("niveaux.lvl""r");
if (fichier == NULL)
return 0;
fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
{
switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
{
case '0':
niveau[j][i] = 0;
break;
case '1':
niveau[j][i] = 1;
break;
case '2':
niveau[j][i] = 2;
break;
case '3':
niveau[j][i] = 3;
break;
case '4':
niveau[j][i] = 4;
break;
}
}
}
fclose(fichier);
return 1;
}
Ca reste assez simple, le seul piège à éviter c'était de bien penser à convertir la valeur ASCII '0' en un nombre 0 (et de même pour 1, 2,
3, 4...). 
sauvegarderNiveau
Cette fonction est là encore simple : 
Code : C
int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
int i = 0, j = 0;
fichier = fopen("niveaux.lvl""w");
if (fichier == NULL)
return 0;
for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
How to extract text from pdf image file - Select, copy, paste PDF images in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document
extract image from pdf java; pdf image extractor
How to extract text from pdf image file - VB.NET PDF Image Extract Library: Select, copy, paste PDF images in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document
extract images from pdf c#; extract jpg pdf
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 302 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
{
fprintf(fichier, "%d", niveau[j][i]);
}
}
fclose(fichier);
return 1;
}
J'utilise fprintf pour "traduire" les nombres du tableau niveau en caractères ASCII. 
C'était là encore la seule difficulté, il ne faut pas écrire 0 mais '0' 
L'éditeur de niveaux
L'éditeur de niveau est plus facile à créer qu'on ne pourrait l'imaginer. 
En plus c'est une fonctionnalité qui va considérablement allonger la durée de vie de notre jeu, alors pourquoi s'en priver 
Voilà comment l'éditeur va fonctionner : 
On utilise la souris pour placer les blocs qu'on veut sur l'écran.
Un clic droit efface le bloc sur lequel se trouve la souris.
Un clic gauche place un objet. Cet objet est mémorisé : par défaut, on pose des murs avec le clic gauche. On peut changer
l'objet en cours en appuyant sur les touches du pavé numérique : 
1 : mur
2 : caisse
3 : objectif
4 : départ du joueur Mario
En appuyant sur S, le niveau sera sauvegardé.
On peut revenir au menu principal en appuyant sur Echap.
Edition d'un niveau avec l'éditeur
Initialisations
C# PDF Text Extract Library: extract text content from PDF file in
PDF file. Ability to extract highlighted text out of PDF document. Supports text extraction from scanned PDF by using XDoc.PDF for .NET Pro. Image text extraction
extract pdf images; extract image from pdf using
VB.NET PDF Text Extract Library: extract text content from PDF
Extract and get partial and all text content from PDF file. Extract highlighted text out of PDF document. Image text extraction control provides text extraction
extract jpg from pdf; extract color image from pdf in c#
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 303 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Initialisations
Globalement, la fonction ressemble à celle du jeu. J'ai d'ailleurs commencé à la créer en faisant un simple copier-coller de la fonction
de jeu, puis en enlevant ce qui ne servait plus et en ajoutant de nouvelles fonctionnalités. 
Le début y ressemble pas mal déjà : 
Code : C
void editeur(SDL_Surface* ecran)
{
SDL_Surface *mur = NULL, *caisse = NULL, *objectif = NULL, *mario = NULL;
SDL_Rect position;
SDL_Event event;
int continuer = 1, clicGaucheEnCours = 0, clicDroitEnCours = 0;
int objetActuel = MUR, i = 0, j = 0;
int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
// Chargement des objets et du niveau
mur = IMG_Load("mur.jpg");
caisse = IMG_Load("caisse.jpg");
objectif = IMG_Load("objectif.png");
mario = IMG_Load("mario_bas.gif");
if (!chargerNiveau(carte))
exit(EXIT_FAILURE);
Là, vous avez les définitions de variables et les initialisations. 
Vous remarquerez que je ne charge qu'un Mario (celui dirigé vers le bas). En effet, on ne va pas diriger Mario au clavier là, on a juste
besoin d'un sprite représentant la position de départ de Mario. 
La variable objetActuel retient l'objet actuellement sélectionné par l'utilisateur. Par défaut, c'est un MUR. Le clic gauche créera donc un
mur au départ, mais cela pourra être changé par l'utilisateur en appuyant sur 1, 2, 3 ou 4. 
Très important : les booléens clicGaucheEnCours et clicDroitEnCours qui, comme leur nom l'indique, permettent de mémoriser si un clic
est en cours (si le bouton de la souris est enfoncé). Cela nous permettra de poser des objets à l'écran en laissant le bouton de la souris
enfoncé (sinon on est obligés de cliquer frénétiquement avec la souris pour placer plusieurs fois le même objet à différents endroits). 
Je vous expliquerai le principe un peu plus loin. 
Enfin, la carte actuellement sauvegardée dans niveaux.lvl est chargée. Ce sera notre point de départ. 
La gestion des évènements
Cette fois, on va devoir gérer un nombre important d'évènements différents. 
Allons-y, un par un 
SDL_QUIT 
Code : C
case SDL_QUIT:
continuer = 0;
break;
Si on clique sur la croix la boucle s'arrête et on revient au menu principal. 
Notez que ce n'est pas pratique pour l'utilisateur ça : lui il s'attend à ce que le programme s'arrête quand on clique sur la
croix, or ce n'est pas ce qu'il se passe ici. Il faudrait peut-être trouver un moyen d'arrêter le programme en renvoyant une
valeur spéciale à la fonction main par exemple (je vous laisse réfléchir à une solution 
)
SDL_MOUSEBUTTONDOWN 
Code : C
case SDL_MOUSEBUTTONDOWN:
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Create high resolution PDF file without image quality losing in ASP.NET application. Add multiple images to multipage PDF document in .NET WinForms.
extract image from pdf file; extract vector image from pdf
VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
Reduce image resources: Since images are usually or large size, images size reducing can help to reduce PDF file size effectively.
extract images from pdf; pdf image extractor online
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 304 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
if (event.button.button == SDL_BUTTON_LEFT)
{
// On met l'objet actuellement choisi (mur, caisse...) à l'endroit du clic
carte[event.button.x / TAILLE_BLOC][event.button.y / TAILLE_BLOC] = objetActuel;
clicGaucheEnCours = 1// On active un booléen pour retenir qu'un bouton est enfoncé
}
else if (event.button.button == SDL_BUTTON_RIGHT) // Le clic droit sert à effacer
{
carte[event.button.x / TAILLE_BLOC][event.button.y /TAILLE_BLOC] = VIDE;
clicDroitEnCours = 1;
}
break;
On commence par tester le bouton qui est enfoncé (on vérifie si c'est le clic gauche ou le clic droit) : 
Si c'est un clic gauche, on place l'objetActuel sur la carte à la position de la souris.
Si c'est un clic droit, on efface ce qu'il y a à cet endroit sur la carte (on met VIDE comme je vous avais dit).
Comment on sait sur quelle "case" de la carte on se trouve ? 
Ca se trouve par un petit calcul. Il suffit de prendre les coordonnées de la souris (event.button.x par exemple) et de diviser cette valeur
par la taille d'un bloc (TAILLE_BLOC). 
C'est une 
division de nombre entiers. Comme en C une division de nombre entiers donne un nombre entier, on est sûrs d'avoir une valeur
qui corresponde à une des cases de la carte. 
Exemple : si je suis au 75ème pixel sur la carte (sur l'axe des abscisses x), je divise ce nombre par TAILLE_BLOC qui vaut ici 34. 
75 / 34 = 2 
N'oubliez pas que le reste est ignoré. On ne garde que la partie entière de la division en C car il s'agit d'une divison de nombre entiers. 
On sait donc qu'on se trouve sur la case n°2 (c'est-à-dire la 3ème case, car un tableau commence à 0 souvenez vous). 
Autre exemple : si je suis au 10ème pixel (c'est-à-dire très proche du bord), ça va donner le calcul suivant : 
10 / 34 = 0 
On est donc à la case n°0 ! 
C'est comme ça qu'un simple petit calcul nous permet de savoir sur quelle case de la carte on se situe 
Code : C
carte[event.button.x / TAILLE_BLOC][event.button.y / TAILLE_BLOC] = objetActuel;
Autre chose très importante : on met un booléen clicGaucheEnCours (ou clicDroit selon le cas) à 1. Cela nous permettra de savoir lors
d'un évènement MOUSEMOTION si un bouton de la souris est enfoncé pendant le déplacement ! 
SDL_MOUSEBUTTONUP 
Code : C
case SDL_MOUSEBUTTONUP: // On désactive le booléen qui disait qu'un bouton était enfoncé
if (event.button.button == SDL_BUTTON_LEFT)
clicGaucheEnCours = 0;
else if (event.button.button == SDL_BUTTON_RIGHT)
clicDroitEnCours = 0;
break;
L'évènement MOUSEBUTTONUP sert simplement à remettre le booléen à 0. On sait que le clic est terminé et donc qu'il n'y a plus de "clic
en cours". 
VB.NET PDF insert image library: insert images into PDF in vb.net
VB.NET code to add an image to the inputFilePath As String = Program.RootPath + "\\" 1.pdf" Dim doc New PDFDocument(inputFilePath) ' Get a text manager from
extract image from pdf c#; extract text from image pdf file
C# PDF File Split Library: Split, seperate PDF into multiple files
Application. Best and professional adobe PDF file splitting SDK for Visual Studio .NET. outputOps); Divide PDF File into Two Using C#.
extract images from pdf file; how to extract images from pdf files
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 305 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
SDL_MOUSEMOTION 
Code : C
case SDL_MOUSEMOTION:
if (clicGaucheEnCours) // Si on déplace la souris et que le bouton gauche de la souris
est enfoncé
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = objetActuel;
}
else if (clicDroitEnCours) // Pareil pour le bouton droit de la souris
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = VIDE;
}
break;
C'est là que nos booléens prennent toute leur importance. On vérifie quand on bouge la souris si un clic est en cours. Si tel est le cas, on
place sur la carte un objet (ou du vide si c'est un clic droit). 
Cela nous permet donc de placer plusieurs objets du même type d'affilée sans avoir à cliquer plusieurs fois. On a juste à déplacer la
souris en maintenant le bouton de la souris enfoncé ! 
En clair, à chaque fois qu'on bouge la souris (ne serait-ce que d'un pixel), on vérifie si un des booléens est activé. Si tel est le cas, alors
on pose un objet sur la carte. Sinon, on ne fait rien. 
Résumé : je résume la technique, car vous vous en servirez certainement dans d'autres programmes. 
Cette technique permet de savoir si un bouton de la souris est enfoncé lorsqu'on la déplace. On peut s'en servir pour coder un glisser /
déplacer. 
1.  Lors d'un MOUSEBUTTONDOWN : on met un booléen clicEnCours à 1.
2.  Lors d'un MOUSEMOTION : on teste si le booléen clicEnCours vaut vrai. S'il vaut vrai, on sait qu'on est en train de faire une sorte
de glisser / déplacer avec la souris.
3.  Lors d'un MOUSEBUTTONUP : on remet le booléen clicEnCours à 0, car le clic est terminé (relâchement du bouton de la souris).
SDL_KEYDOWN 
Les touches du clavier permettent de charger / sauvgarder le niveau ainsi que de changer l'objet actuellement sélectionné pour le clic
gauche de la souris. 
Code : C
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_s:
sauvegarderNiveau(carte);
break;
case SDLK_c:
chargerNiveau(carte);
break;
case SDLK_KP1:
objetActuel = MUR;
break;
case SDLK_KP2:
objetActuel = CAISSE;
break;
case SDLK_KP3:
objetActuel = OBJECTIF;
break;
case SDLK_KP4:
objetActuel = MARIO;
break;
}
break;
Ce code est très simple. On change l'objetActuel si on appuie sur une des touches numériques, on enregistre le niveau si on appuie sur S,
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Reduce image resources: Since images are usually or large size, images size reducing can help to reduce PDF file size effectively.
how to extract text from pdf image file; how to extract images from pdf
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
When you have downloaded the RasterEdge Image SDK for also provided you with detailed PDF processing demo Imaging.Demo directory with the file name RasterEdge
pdf image text extractor; extract images from pdf files without using copy and paste
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 306 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
ou on charge le dernier niveau enregistré si on appuie sur C. 
Blit time !
Voilà, on a passé en revue tous les évènements. 
Maintenant on n'a plus qu'à blitter chacun des éléments de la carte à l'aide d'une double boucle. C'est 
quasiment le même code que celui
de la fonction de jeu. Je vous le redonne, mais pas la peine de vous le réexpliquer 
Code : C
// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255255));
// Placement des objets à l'écran
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
position.x = i * TAILLE_BLOC;
position.y = j * TAILLE_BLOC;
switch(carte[i][j])
{
case MUR:
SDL_BlitSurface(mur, NULL, ecran, &position);
break;
case CAISSE:
SDL_BlitSurface(caisse, NULL, ecran, &position);
break;
case OBJECTIF:
SDL_BlitSurface(objectif, NULL, ecran, &position);
break;
case MARIO:
SDL_BlitSurface(mario, NULL, ecran, &position);
break;
}
}
}
// Mise à jour de l'écran
SDL_Flip(ecran);
Il ne faut pas oublier après la boucle principale de faire les SDL_FreeSurface qui s'imposent : 
Code : C
SDL_FreeSurface(mur);
SDL_FreeSurface(caisse);
SDL_FreeSurface(objectif);
SDL_FreeSurface(mario);
C'est touuuut 
Résumé et améliorations
Bien, on a vu assez de code je crois (en fait on a 
tout vu 
L'heure est au résumé. 
Alors résumons !
Et quel meilleur résumé pourrait-on imaginer que le code source complet du programme avec les commentaires ? 
C'est gratuit, c'est cadeau, c'est offert par le Site du Zér0 
(faut vraiment que j'arrête les rimes stupides...) 
Télécharger le programme + les sources (436 Ko)
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 307 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Ce fichier zip contient : 
L'exécutable pour Windows (si vous êtes sous un autre OS, il suffira de recompiler 
)
Les DLL de la SDL et de SDL_Image
Toutes les images dont a besoin le programme (je vous les ai fait télécharger plus tôt dans le pack "sprites").
Les sources complètes du programme
Le fichier .cbp de projet Code::Blocks (oui j'ai fait ça sous Code::Blocks). Si vous voulez ouvrir le projet sous un autre IDE, créez
un nouveau projet de type SDL (configurez-le correctement pour la SDL) et ajoutez-y manuellement tous les fichiers .c et .h. Ce
n'est pas bien compliqué vous verrez.
Vous noterez que le projet contient, en plus des .c et des .h, un fichier ressources.rc. 
C'est un fichier qui peut être ajouté au projet (uniquement sous Windows) permettant d'intégrer des fichiers dans l'exécutable. Ici, je me
sers du fichiers de ressources pour intégrer une icône dans l'exécutable. Cela aura pour effet de donner une icône à l'exécutable, visible
dans l'explorateur Windows : 
Avouez que c'est quand même plus sympa que d'avoir l'icône par défaut de Windows pour les exécutables 
Vous trouverez plus d'infos sur cette technique dans l'annexe Créer une icône pour son programme. 
Je vous rappelle que 
cela ne concerne que Windows.
Améliorez !
Ce programme n'est pas parfait, loin de là ! 
Vous voulez des idées pour l'améliorer ? J'en ai plein ! 
Il manque un mode d'emploi. Affichez un écran d'explications juste avant le lancement d'une partie et avant le lancement de
l'éditeur. Indiquez en particulier les touches à utiliser.
Dans l'éditeur de niveaux, on ne sait pas quel est l'objet actuellement sélectionné. Ce qui serait bien, c'est qu'on ait l'objet
actuellement sélectionné qui suive le curseur de la souris. Comme ça, l'utilisateur verrait ce qu'il s'apprête à mettre sur la carte.
C'est facile à faire : on a déjà fait un Zozor qui suit le curseur de la souris dans le chapitre précédent !
Dans l'éditeur de niveaux, il serait bien qu'on puisse choisir l'objet CAISSE_OK (une caisse bien placée sur un objectif dès le
départ). En effet, je me suis rendu compte par la suite qu'il y a de nombreux niveaux qui commencent avec des caisses bien
placées dès le départ (ça ne veut pas dire que le niveau est plus facile, loin de là 
Dans l'éditeur toujours, il faudrait empêcher que l'on puisse placer plus d'un départ de joueur sur une même carte !
Lorsqu'on réussit un niveau, on retourne immédiatement au menu. C'est un peu brut. Que diriez-vous d'afficher un message
"Bravo" au centre de l'écran quand on gagné ? 
Enfin, il serait bien que le programme puisse gérer plus d'un niveau à la fois. Il faudrait que l'on puisse créer une véritable petite
aventure d'une vingtaine de niveaux par exemple. C'est un petit peu plus compliqué à coder mais faisable. Il faudra adapter le
jeu et l'éditeur de niveaux en conséquence. 
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 308 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Je vous suggère de mettre un niveau par ligne dans niveaux.lvl
Comme promis, pour vous prouver que c'est faisable... je l'ai fait 
Je ne vous donne pas le code source en revanche (je crois que je vous en ai déjà assez donné jusqu'ici !), mais je vous donne le
programme complet pour Windows. 
Le programme comporte une aventure de 20 niveaux (de très très facile... à super difficile). 
Pour la plupart de ces niveaux, je me suis servi sur le site d'un passionné de Sokoban. Certains niveaux sont vraiment tordus, je ne suis
pas capable de créer des trucs aussi compliqués, donc merci à l'auteur pour tous les niveaux qu'il propose 
Puisque j'y suis, comme c'est un "vrai" programme, je me suis permis de créer une installation. C'est un véritable programme
d'installation qui va vous demander où vous voulez mettre le programme et si vous voulez l'exécuter à la fin. Il mettra même des
raccourcis dans le menu démarrer ou sur le bureau si vous le souhaitez 
Téléchargez l'installation du Mario Sokoban amélioré (665 Ko)
Ou bien : Téléchargez la version compilée pour linux au format .tar.gz (64 Ko)
Pour créer l'installation, je me suis servi de l'excellent programme de création d'installations Inno Setup. Il est entièrement gratuit et
très puissant. 
Si vous voulez apprendre à créer des installations de ce type vous aussi, je vous invite à lire l'annexe Créer une installation . C'est facile,
rapide, professionnel et rudement efficace vous verrez ! 
Pfiou ! 
Sacré boulot hein ? Tout ça pour coder un jeu de Sokoban 
Remarquez, le jeu est bien complet (surtout dans sa version améliorée) et peut facilement être distribué à vos amis (ou même vendu).
Bon les Sokoban c'est un marché saturé depuis un moment, c'est pas ce qui manque, donc n'espérez pas faire fortune avec ça 
Comme vous pouvez le constater, programmer un jeu c'est faisable mais... ça demande du travail ! Vous n'imaginiez peut-être pas en
commençant le cours que ça serait autant de travail, mais c'est pourtant la réalité : 
il faut tout dire à l'ordinateur (sinon il sait pas faire
!). 
Ne soyez pas impressionnés par la quantité de code source et ne vous laissez pas submerger. Moi aussi, comme vous, j'ai du mal à
"rentrer" dans le code source de quelqu'un d'autre. Le mieux est certainement de créer vous-même votre code source de A à Z.
L'expérience vient en pratiquant, je crois que je l'ai déjà dit pas mal de fois 
Bon codage les Zér0s !
Maîtrisez le temps !
Ce chapitre est d'une importance capitale : il va vous apprendre à gérer le temps en SDL. 
Maîtriser le temps est quasiment indispensable... j'ai bien dit quasiment car, comme vous l'avez vu dans le TP Mario Sokoban, on peut
très bien faire un jeu sans manipuler le temps. 
Mais c'est rare. Pour un nombre pratiquement incalculable de jeux, la gestion du temps est fondamentale. 
Tenez par exemple, comment coderiez-vous un Tetris ou un Snake (jeu du serpent) ? Il faut bien que les blocs bougent toutes les X
secondes, et ça vous ne savez pas faire. Du moins, vous ne savez pas 
encore le faire 
Le Delay et les Ticks
Dans un premier temps, nous allons apprendre à utiliser 2 fonctions très simples : 
SDL_Delay : permet de mettre en pause le programme un certain nombre de millisecondes.
SDL_GetTicks : retourne le nombre de millisecondes écoulées depuis le lancement du programme.
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 309 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
Ces 2 fonctions sont peut-être super simples comme nous allons le voir, mais bien savoir les utiliser n'est pas évident... alors ouvrez
grand vos oreilles
yeux 
SDL_Delay
Comme je l'ai précédemment dit, cette fonction effectue une pause sur le programme durant un certain temps. Pendant que le
programme est en pause, on dit qu'il dort ("sleep" en anglais) : il n'utilise pas le processeur. 
SDL_Delay peut donc être utile pour réduire l'utilisation du processeur. Notez que j'abrègerai processeur par CPU désormais, ce qui
signifie Central Processing Unit, soit "Unité centrale de calcul". 
Grâce à SDL_Delay, vous pourrez rendre votre programme moins gourmand en ressources processeur. Il fera donc moins "ramer" votre PC
si SDL_Delay est utilisée intelligemment. 
Tout dépend du programme que vous faites : parfois on aimerait bien que notre programme utilise le moins de CPU
possible pour que l'utilisateur puisse faire autre chose en même temps, comme c'est le cas pour un lecteur MP3 qui tourne en
fond pendant que vous naviguez sur Internet. 
Mais... d'autres fois on se moque complètement que notre programme utilise tout le temps 100% de CPU. C'est le cas de la
quasi-totalité des jeux. En effet : quand vous jouez, en théorie vous ne faites que ça, donc on peut se permettre d'utiliser tout
le temps le CPU. Quand vous jouez à Far Cry ou Half-Life 2, votre PC travaille donc à 100% tout le temps ! 
Bien, revenons à la fonction qui nous intéresse. Son prototype est d'une simplicité affligeante : 
Code : C
void SDL_Delay(Uint32 ms);
En clair, vous envoyez à la fonction le nombre de millisecondes pendant lesquelles votre programme doit "dormir". C'est une simple mise
en pause. 
Par exemple, si vous voulez que votre programme se mette en pause 1 seconde, vous devrez taper : 
Code : C
SDL_Delay(1000);
N'oubliez pas que ce sont des millisecondes : 
1000 millisecondes = 1 seconde 
500 millisecondes = 1/2 seconde 
250 millisecondes = 1/4 seconde 
etc etc. 
Attention : vous ne pouvez rien faire dans votre programme pendant qu'il est en pause ! Un programme qui "dort" ne peut rien faire
puisqu'il n'est pas actif pour l'ordinateur. 
Le problème de la granularité du temps 
Non rassurez-vous, je ne vais pas vous faire un traité de physique quantique au beau milieu d'un chapitre SDL 
Toutefois, il y a quelque chose que j'estime que vous devez savoir : SDL_Delay n'est pas une fonction "parfaite". Et ce n'est pas sa faute,
c'est la faute à votre OS (comme Windows). 
Qu'est-ce que vient faire l'OS là-dedans ?
Oh mais l'OS a tout à faire là-dedans : 
c'est lui qui contrôle les programmes qui tournent ! 
Votre programme va donc dire à l'OS : "Je dors, réveille-moi dans 1 seconde". Mais l'OS ne va pas forcément le réveiller au bout d'une
seconde exactement. 
En effet, il aura peut-être un peu de retard (un retard de 10ms en moyenne environ, ça dépend des PC). Pourquoi ? Parce que votre CPU
ne peut travailler que sur un programme à la fois. Le rôle de l'OS est de dire au CPU ce sur quoi il doit travailler : "Alors, pendant 40ms
tu vas travailler sur firefox.exe, puis pendant 110ms tu vas travailler sur explorer.exe, et ensuite pendant 80ms tu vas travailler sur
programme_sdl.exe, puis tu vas retravailler sur firefox.exe pendant 65ms" etc etc... 
303/10/Monday 21h34
Apprenez à programmer en C / C++ ! - Le Site du Zéro
Page 310 sur 377
http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c-c.html
L'OS est le véritable chef d'orchestre de l'ordinateur ! 
Maintenant, imaginez qu'au bout d'une seconde un autre programme soit encore en train de travailler : il faudra qu'il ait fini de travailler
pour que votre programme puisse "reprendre la main" comme on dit, c'est-à-dire être traité à nouveau par le CPU. 
Tout ça pour dire quoi ? 
Ooops, excusez-moi j'étais en train de dériver 
En gros, j'essayais de vous expliquer que votre CPU ne pouvait pas gérer plus d'un programme à la fois. Pour donner l'impression que l'on
peut faire tourner plusieurs programmes en même temps sur un ordinateur, l'OS "découpe" le temps et autorise les programmes à
travailler au tour par tour. 
Or, cette gestion des programmes est très complexe et on ne peut donc pas avoir la garantie que notre programme sera réveillé au bout
d'une seconde exactement. 
Toutefois, ça dépend des PC comme je vous l'ai dit plus haut. Chez moi, la fonction SDL_Delay est assez précise. 
A cause de ce problème de "granularité du temps", vous ne pouvez donc pas mettre en pause votre programme pendant un
temps trop court. Par exemple, si vous faites : 
Code : C
SDL_Delay(1);
Vous pouvez être sûrs que votre programme ne sera pas mis en pause 1ms mais un peu plus (peut-être 9-10ms).
En résumé : SDL_Delay c'est cool, mais ne lui faites pas trop confiance. Elle ne mettra pas en pause votre programme pendant le temps
exact que vous indiquez. 
Ce n'est pas parce que la fonction est mal codée, c'est parce que le fonctionnement d'un ordinateur est très complexe et ne permet pas
d'être très précis à ce niveau. 
SDL_GetTicks
Cette fonction renvoie le nombre de millisecondes écoulées depuis le lancement du programme. 
Hein ? Mais on s'en fout de savoir ça 
Au contraire, c'est un indicateur de temps indispensable. Cela vous permet de vous repérer dans le temps, vous allez voir ! 
Voici le prototype : 
Code : C
Uint32 SDL_GetTicks(void);
La fonction n'attend aucun paramètre, elle renvoie juste le nombre de millisecondes écoulées. 
Ce nombre augmente au fur et à mesure du temps, inlassablement. Pour info, la doc de la SDL indique que le nombre atteint son
maximum et est réinitialisé au bout de 49 jours ! A priori votre programme SDL devrait tourner moins longtemps que ça, donc pas de
souci de ce côté-là 
Utiliser SDL_GetTicks pour gérer le temps
Si SDL_Delay est assez facile à comprendre et à utiliser, ce n'est pas le cas de SDL_GetTicks. Il est temps d'apprendre à bien s'en servir...
Voici un exemple ! Nous allons reprendre notre bon vieux programme avec la fenêtre affichant Zozor à l'écran. Souvenez-vous : 
Documents you may be interested
Documents you may be interested