-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathsdl.c.txt
231 lines (207 loc) · 13.8 KB
/
sdl.c.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
┏━━━━━━━━━┓
┃ SDL ┃
┗━━━━━━━━━┛
PAQUETS, HEADERS ET #Le paquet principal est libsdl1.2-dev. Les extensions
LINKING ==> #principales sont libsdl-gfx1.2-dev, libsdl-image1.2-
#dev, libsdl-mixer1.2-dev, libsdl-net1.2-dev et libsdl-
#sound1.2-dev.
#Les headers et le linking font référence respectivement
#à ces paquets, soit :
# - <SDL/SDL.h>, <SDL/SDL_image.h>, <SDL/SDL_mixer.h>,
# etc. pour les headers
# - les libraries sont libSDL.so, libSDL_image.so,
# libSDL_mixer.so, etc. pour les libraries, et
# il faut utiliser les options de compilation -lSDL,
# -lSDL_image, -lSDL_mixer, etc.
┌───────────────────┐
│ SDL PRINCIPAL │
└───────────────────┘
SDL_INIT* FLAGS ==> #Désignent les modules SDL, chargés par SDL_Init()
SDL_INIT_VIDEO #
SDL_INIT_AUDIO #
SDL_INIT_CDROM #
SDL_INIT_JOYSTICK #
SDL_INIT_TIMER #
SDL_INIT_EVERYTHING #Tous les flags (à éviter si l'on veut juste quelques
#uns des flags)
SDL_Init(SDL_FLAG...) #Initialise les modules désignés par les SDL_INIT* FLAGS
#or'd.
----| 0 si succès, -1 sinon
SDL_Quit() #A faire à la fin du programme, pour free() les
#ressources allouées par SDL_Init()
SDL_GetError() ----# Renvoie une STR décrivant la dernière erreur, ou une
| null string si pas d'erreur.
MODE_FLAGS ==> #Options utilisées par SDL_SetVideo()
SDL_HWSURFACE #La SDL_Surface utilise la mémoire de la carte
#graphique : plus rapide, mais plus petite.
SDL_SWSURFACE #La SDL_Surface utilise la RAM, plus lente, mais plus
#grande.
SDL_NOFRAME #La fenêtre n'a pas de contour ni de barre de titre.
SDL_FULLSCREEN #Mode plein écran. Implique SDL_NOFRAME.
SDL_RESIZABLE #La fenêtre peut être redimensionnée.
SDL_DOUBLEBUF #Active le double-buffering, ce qui signifie que la
#SDL_SURFACE prépare dans un frame buffer le prochain
#écran, mis à jour avec SDL_Flip().
SDL_SetVideo(INT_VAL1, #Ouvre une fenêtre avec INT_VAL1 pixels de longueur,
INT_VAL2, INT_VAL3, #INT_VAL2 de largeur et INT_VAL3 bits/pixels. Si
MODE_FLAGS) #INT_VAL3 est 0, la définition actuelle est utilisée.
#32 bits/pixels = 16,7 millions de couleurs.
#Les MODE_FLAGS sont or'd pour désigner des options.
----| Le SDL_SURFACE_ADR créé, ou NULL si erreur.
SDL_WM_SetCaption(STR1, #Le titre de la fenêtre devient STR1, et le titre de
STR2) #l'icône (et non son chemin) devient STR2.
SDL_WM_SetIcon #Utilise l'icône SDL_SURFACE pour la fenêtre. Doit être
(SDL_SURFACE_ADR, #appelé avant SDL_SetVideo(). Sera redimensionnée à la
UINT8_VAL) #taille de l'icône.
#UINT8_VAL est pour la transparence, que je ne comprends
#pas encore (0 si pas de transparence).
EVENT FLAGS ==> #Désigne des événéments :
SDL_QUIT #Interruption (par tout SIGINT, SIGKILL, etc. possible)
SDL_KEYDOWN #Une touche clavier est pressée
SDL_KEYUP #Une touche clavier est relâchée.
SDL_VIDEORESIZE #Redimensionnement de la fenêtre (dont fermeture).
SDL_Event #Union désignant un événément. Un événément peut etre :
#tout mouvement de souris au-dessus de la fenêtre,
#cliquer/décliquer, touche clavier, etc. (le tout si la
#fenêtre est active)
SDL_EVENT.type #EVENT_FLAG associé à SDL_EVENT.
SDL_WaitEvent #Attend le prochain événément, et le stocke dans
(SDL_EVENT_ADR) #SDL_EVENT. Il faut faire une boucle avec cette fonction
#pour attraper les événéments, par exemple une boucle
#while(SDL_WaitEvent(...)) suivi d'un switch(SDL_EVENT.
#type) (qui doit contenir la possibilité de fermeture
#et faire alors un exit() ; par ailleurs sortir de la
#boucle while signifie qu'il y a eu une erreur).
#S'il y a déjà plusieurs événéments, retire le premier
#de la file d'attente (FIFO)
----| 0 si succès, -1 sinon.
SDL.PollEvent #Comme SDL_WaitEvent(), sauf qu'il n'est pas bloquant.
(SDL_EVENT_ADR) #A mettre donc dans un while ( true ), mais pas
#directement comme d'une boucle, mais plutôt inclus dans
#les opérations répétées par la boucle.
#S'il y a un événément dans la file d'attente, celui-ci
#est stocké dans SDL_EVENT, retiré de la file d'attente,
#et 1 est renvoyé ; sinon, 0 est renvoyé, et SDL_EVENT
#est inchangé.
#Utilise donc 100% dans une boucle (et non presque 0%
#comme SDL_WaitEvent()). Cependant, c'est utile par
#exemple si le jeu doit continuer à mettre à jour quoi
#que ce soit même si aucun événément ne survient : par
#exemple un timer, etc.
SDL_EnableKeyRepeat #Si INT_VAL1 == 0, désactive la répétition des touches
(INT_VAL1, INT_VAL2) #(désactivée par défaut).
#Sinon, une fois qu'une touche a été maintenue INT_VAL1
#millisecondes, un événément SDL_KEYDOWN de cette touche
#est généré toutes les INT_VAL2 millisecondes tant
#qu'elle est maintenue.
SDL_DEFAULT_REPEAT_DELAY#Constante convenable pour l'INT_VAL1 de
#SDL_EnableKeyRepeat()
SDL_DEFAULT_REPEAT_INTER#
VAL #Même chose, mais pour l'INT_VAL2
SDL_Surface #Struct désignant une surface, c'est-à-dire un rectangle
#pouvant accueillir une image ou une couleur.
#SDL_SetVideo() place la SDL_SURFACE principale ;
#ensuite, les autres SDL_SURFACE doivent être :
# - crées, par exemple via SDL_CreateRGBSurface() ou
# SDL_LoadBMP()
# - puis ajoutées ("blittées") sur une autre
# SDL_SURFACE via par exemple SDL_BlitSurface().
# - la SDL_SURFACE créée doit être freed finalement via
# SDL_FreeSurface() (cela ne supprime pas son
# affichage)
#Par exemple, faire un degradé : faire un boucle avec
#blittage de lignes de couleurs différentes
SDL_SURFACE.format #Renvoie le SDL_PIXELFORMAT_ADR associé à SDL_SURFACE
#(read-only)
SDL_FreeSurface #
(SDL_SURFACE_ADR) #Free SDL_SURFACE_ADR.
SDL_Rect #Struct désignant un rectangle.
SDL_RECT.x #Position (x) du coin supérieur gauche, sous forme de
#SINT16_VAL, par rapport au SDL_SURFACE l'englobant.
SDL_RECT.y #Position (y) du coin supérieur gauche, sous forme de
#SINT16_VAL, par rapport au SDL_SURFACE l'englobant.
SDL_RECT.w #Largeur du rectangle, sous forme d'UINT16_VAL.
SDL_RECT.h #Hauteur du rectangle, sous forme d'UINT16_VAL.
SDL_BlitSurface(SDL_ #Blitte (superpose) SDL_SURFACE2 sur SDL_SURFACE. Seul
SURFACE_ADR, SDL_RECT_ #le SDL_RECT et le SDL_RECT2 de chacune des surfaces est
ADR, SDL_SURFACE2_ADR, #utilisé lors de la superposition (agissant donc comme
SDL_RECT2_ADR) #des clip masks)
#La SDL_SURFACE2 superposée est dessinée une seule fois
#La modifier ne modifie pas son précédent blittage.
#On ne peut en fait plus la modifier ou la supprimer
#après affichage (sauf nouvelle superposition dessus),
#et elle n'est plus liée à sa SDL_SURFACE originelle.
#Elle peut être blitté plusieurs fois, à plusieurs
#endroits sur une même SDL_SURFACE, sans que cela
#modifie les précédents blittages.
#Il semble que SDL_RECT2.w et .h ne soient pas utilisés,
#mais seulement .x et .y...
#Même chose pour SDL_RECT.x et .y... (inversement)
SDL_Flip(SDL_SURFAC_ADR)#Met à jour SDL_SURFACE :
# - en cas de double-buffering, remplace l'écran actuel
# avec l'écran bufferisé
# - sinon, met seulement à jour l'écran, mais des
# scintillements peuvent apparaître.
#Dans tous les cas, sans mise à jour, toute modification
#sur un SDL_SURFACE ne sera pas affichée.
SDL_CreateRGBSurface #Crée et renvoie une SDL_SURFACE_ADR avec :
(MODE_FLAGS, INT_VAL1, # - les options MODE_FLAGS (seuls SDL_HWSURFACE et
INT_VAL2, INT_VAL3, # SDL_SWSURFACE sont possibles)
UINT32_VAL1, UINT32_VL2,# - INT_VAL1 de largeur et INT_VAL2 de hauteur (pixels)
UINT32_VAL3, UINT32_VL4)# - INT_VAL3 bits/pixels
# - les UINT32_VAL sont des masques que je ne comprends
# pas encore...
#SDL_SetVideo() doit avoir été déjà invoqué.
SDL_LoadBMP(STR) ----# Crée et renvoie une SDL_SURFACE_ADR aux dimensions et
| remplie avec l'image .bmp dont le chemin est STR, ou
| renvoie NULL si erreur.
SDL_MapRGB #Renvoie la couleur associée à une quantité d'UINT8_VAL1
(SDL_PIXELFORMAT_ADR, #pour le rouge (0 à 255), UINT8_VAL2 pour le vert,
UINT8_VAL1, UINT8_VAL2, #UINT8_VAL3 pour le bleu, le tout en fonction de
UINT8_VAL3) #SDL_PIXELFORMAT_ADR, et le renvoie sous forme
#d'UINT32_VAL
SDL_FillRect #Colorie avec la couleur UINT32_VAL (telle que renvoyée
(SDL_SURFACE_ADR, #par SDL_MapRGB() ou similaire) la SDL_SURFACE, plus
SDL_RECT_ADR, #précisément son SDL_RECT (ou toute la SDL_SURFACE si
UINT32_VAL) #SDL_RECT_ADR == NULL)
----| 0 si succès, -1 sinon.
SDL_PixelFormat #Struct désignant les informations de couleur d'une
#SDL_Surface.
SDL_PIXELFORMAT.
BitsPerPixel #Nombre de bits/pixels, sous forme d'UINT8_VAL.
SDL_PIXELFORMAT.
BytesPerPixel #Nombre d'octets/pixels, sous forme d'UINT8_VAL.
SDL_SetColorKey #Si FLAGS (suite de flags or'd) contient SDL_SRCCOLORKEY
(SDL_SURFACE_ADR, #alors UINT32_VAL (couleur obtenue par exemple via
FLAGS, UINT32_VAL) #SDL_MapRGB()) devient la couleur de transparence sur
#SDL_SURFACE : toutes les prochaines fois où SDL_SURFACE
#sera blittée sur une autre surface, ses pixels ayant
#cette couleur deviendront 100% transparents.
#Sinon (notamment si FLAGS == 0), SDL_SURFACE n'a plus
#de couleur de transparence (la supprime).
#Enfin, si FLAGS contient SDL_RLEACCEL, l'accélération
#RLE a lieu, ce qui augmente les performances en cas de
#nombreux pixels transparents successifs.
----| 0 si succès, -1 sinon.
SDL_SetAlpha #Comme SDL_SetColorKey(), sauf que cette fois, UINT8_VAL
(SDL_SURFACE_ADR, #désigne un degré de transparence pour l'ensemble des
FLAGS, UINT8_VAL) #pixels de SDL_SURFACE (de 0, ou SDL_:).
#FLAGS peut aussi être SDL_RLEACCEL, mais ne peut pas
#être SDL_SRCCOLORKEY, mais SDL_SRCALPHA, qui signifie
#que la transparence UINT8_VAL est utilisée, et non
#réinitialisée à 255 sinon.
#128 est une valeur spéciale, car optimisée (gain de
#vitesse)
SDL_ALPHA_TRANSPARENT #Constante pour SDL_SetAlpha() valant 0, soit
#transparence totale.
SDL_ALPHA_OPAQUE #Constante pour SDL_SetAlpha() valant 255, soit
#opacité totale.
┌───────────────┐
│ SDL_IMAGE │
└───────────────┘
IMG_Load(STR) ----# Renvoie un SDL_SURFACE_ADR lié à l'image dont le
| chemin est STR. Types supportés : JPEG, PNG, TGA,
| TIFF, GIF, ICO, CUR, BMP, PNM, PPM, XPM, LBM, PCX, XV
| Les transparences sont directement bien gérées (même
| les contours) et intégrées dans le SDL_SURFACE_ADR
| renvoyé, sans avoir à faire quoi que ce soit de plus.