Après avoir installer le compilateur go avec la bibliothèque "Simple DirectMedia Layer" (SDL 2) comme indiqué ici, nous allons décrire les commandes graphiques :
import "fmt" | Pour les sorties consoles : Print(), Println(), Fprintf() | |
import "os" | Pour les commandes systèmes: Exit(), Stderr | |
import "time" | Pour gérer le temps: Sleep() |
import "github.com/veandco/go-sdl2/sdl" | Pour dessiner | |
import "github.com/veandco/go-sdl2/img" | Pour traiter les images jpg et png | |
import "github.com/veandco/go-sdl2/ttf" | Pour insérer du texte dans les graphiques |
Une initialisation ainsi qu'une libération une fois l'utilisation terminée, est necessaire :
var e error | ||
e := sdl.Init(sdl.INIT_EVERYTHING) | Initialise tout. | |
if e != nil { fmt.Fprintf(os.Stderr, "Erreur à l'initialisation sdl: %s\n", e) os.Exit(1) } |
En cas d'échec de l'initialisation, affichez le message d'erreur et arréter le programme. | |
img.Init(img.INIT_JPG | img.INIT_PNG) | Initialise le traitement d'image jpg et png | |
sdl.SetHint(sdl.HINT_RENDER_SCALE_QUALITY, "1") | Fixe une qualité de mise à l'échelle pour les images (de 0 à 2). La valeur par défaut est 0 a.k.a. échantillon de pixels le plus proche. | |
... | ||
img.Quit() | Libère le traitement d'image | |
sdl.Quit() | Libère SDL |
Créer une fenêtre w |
|||
w, e := sdl.CreateWindow(s,x,y,Dx,Dy,m) |
|||
Variable |
Type |
Description |
Exemple |
w |
*sdl.window |
Fenêtre | |
e |
error |
Erreur | |
s |
string |
Titre | "Essai" |
x |
int32 |
Position x | sdl.WINDOWPOS_UNDEFINED |
y |
int32 |
Position y | sdl.WINDOWPOS_UNDEFINED |
Dx |
int32 |
Largeur | 640 |
Dy |
int32 |
Hauteur | 480 |
m |
uint32 |
Mode | sdl.WINDOW_SHOWN |
Libérer la fenêtre w |
|||
w.Destroy() |
Créer une surface s d'une fenêtre w |
||
s, e := w.GetSurface() |
||
Variable |
Type |
Description |
w |
*sdl.Window |
Fenêtre |
e |
error |
Erreur |
s |
*sdl.Surface |
Surface |
Libérer la surface s |
||
s.Free() |
Package sdl
import "github.com/veandco/go-sdl2/sdl"
|
|
Fonction |
Description |
Type du résultat |
e = sdl.Init(m) | Initialise. Choisir pour m la constante sdl.INIT_EVERYTHING. | error |
w, e = sdl.CreateWindow(s, x, y, Dx, Dy, m) | Crée la fenêtre w de titre s de position x,y et de largeur hauteur Dx,Dy avec le mode m. Choisir pour m la constante sdl.WINDOW_SHOWN. |
*sdl.Window, error |
s, e = w.GetSurface() | Crée la surface s de la fenêtre w. | *sdl.Surface, error |
r = sdl.Rect{x,y,Dx,Dy} | Crée un rectancle de position x,y et de largeur hauteur Dx,Dy | sdl.Rect |
c = sdl.MapRGB(s.Format, r, g, b) | Calcule la couleur c selon le format de la surface s et les niveaux r,g,b. | uint32 |
s.FillRect(nil,c) | Efface la surface s avec la couleur c. | |
s.FillRect(&r, c) | Efface le rectancle r avec la couleur c. | |
w.UpdateSurface() | Affiche ce qui a été dessiné sur la surface s. | |
package main | ||
import "fmt" | ||
import "os" | ||
import "time" | ||
import "github.com/veandco/go-sdl2/sdl" | ||
import "github.com/veandco/go-sdl2/img" | ||
import "github.com/veandco/go-sdl2/ttf" | ||
func main() { |
||
e := sdl.Init(sdl.INIT_EVERYTHING) | Initialise tout. | |
if e != nil { fmt.Fprintf(os.Stderr, "Erreur à l'initialisation sdl: %s\n", e) os.Exit(1) } |
En cas d'échec de l'initialisation, affichez le message d'erreur et arréter le programme. | |
w, e := sdl.CreateWindow( | Crée une fenêtre w. | |
"Rectancles fixes", | Titre de la fenêtre. | |
0, | Position x. | |
0, | Position y. | |
640, | Largeur. | |
480, | Hauteur. | |
sdl.WINDOW_SHOWN | Fenêtre visible. | |
) | ||
s, e := w.GetSurface() | Crée une surface s de la fenêtre w. | |
s.FillRect(nil, sdl.MapRGB(s.Format, 255, 0, 0)) |
Si nil est utilisé comme premier argument, la surface entière est coloriée avec la couleur r, g, b. | |
r := sdl.Rect{100, 60, 300, 200} | Crée un rectangle r (position x, position y, Largeur ,Hauteur). | |
s.FillRect(&r, sdl.MapRGB(s.Format, 0, 255, 0)) | Dessine le rectangle r sur la surface s avec la couleur r, g, b. | |
s.FillRect( | Dessine le rectangle (0,0,200,200) avec la couleur (0, 255, 0). | |
&sdl.Rect{0, 0, 150, 120}, | ||
sdl.MapRGB(s.Format, 0, 255, 0) |
||
) | ||
w.UpdateSurface() | Affiche ce qui a été dessiné sur la surface. | |
time.Sleep(time.Second * 5) | Attendre 5 secondes. | |
w.Destroy() | Supprime la fenêtre. | |
sdl.Quit() | Libère SDL2. | |
} |
w2, e := sdl.CreateWindow( | Crée une fenêtre w2. | |
"Dynamique", | Titre de la fenêtre. | |
642, | Position x. | |
0, | Position y. | |
640, | Largeur. | |
480, | Hauteur. | |
sdl.WINDOW_SHOWN | Fenêtre visible. | |
) | ||
r2, e := sdl.CreateRenderer(w2, -1, sdl.RENDERER_ACCELERATED) | Crée le rendu r2 de la fenêtre w2. | |
B := true | ||
var P sdl.Event | ||
var x int32 = 0 | ||
var v int32 = 1 | ||
for B { | Boucle principale. | |
for P = sdl.PollEvent(); P != nil; P = sdl.PollEvent() { | Gère les évènements. La touche d’Echap sort de la boucle. | |
switch t := P.(type) { | ||
case *sdl.QuitEvent: | ||
B = false | ||
case *sdl.KeyboardEvent: | ||
if t.Keysym.Sym == sdl.K_ESCAPE { | ||
B = false | ||
} | ||
} | ||
} | ||
r2.SetDrawColor(0, 0, 0, 255) | Fixe la couleur (rouge, vert, bleu, alpha). | |
r2.Clear() | Efface la fenêtre avec la couleur spécifiée. | |
r2.SetDrawColor(0, 255, 0, 255) | ||
r2.FillRect(&sdl.Rect{0, 0, 200, 200}) | ||
r2.SetDrawColor(0, 0, 255, 255) | ||
x = x + v | ||
if (x+100) >= 640 || x < 0 { | ||
v = -v | ||
} | ||
r2.DrawRect(&sdl.Rect{x, 100, 100, 100}) | ||
r2.Present() | Affiche ce qui a été dessiné sur la surface. | |
time.Sleep(time.Millisecond * 10) | ||
} | ||
r2.Destroy() | ||
w2.Destroy() |
Mettre une image jpg /home/dmabboux/persona.jpg
w3, _ := sdl.CreateWindow( | Crée une fenêtre w3. | |
"Image tournante", | Titre de la fenêtre. | |
0, | Position x. | |
484, | Position y. | |
600, | Largeur. | |
600, | Hauteur. | |
sdl.WINDOW_SHOWN | Fenêtre visible. | |
) | ||
r3, _ := sdl.CreateRenderer(w3, -1, sdl.RENDERER_ACCELERATED) | Crée le rendu r3 de la fenêtre w3. | |
r3.Clear() | Efface le rendu r3. | |
sdl.SetHint(sdl.HINT_RENDER_SCALE_QUALITY, "1") | fixe une qualité de mise à l'échelle pour les images (de 0 à 2). La valeur par défaut est 0 a.k.a. échantillon de pixels le plus proche. | |
I, e := img.Load("/home/dmabboux/persona.jpg") | Charger l’image en mémoire I. | |
if e != nil { fmt.Fprintf(os.Stderr, "Erreur au chargement de l'image jpg: %s\n", e) os.Exit(4) } |
En cas d'échec du chargement de l'image, affichez le message d'erreur et arréter le programme. | |
L := I.W H := I.H |
Largeur L et hauteur H de l'image I. (Une fois I.Free() exécuténous n'avons plus accès à I.W et I.H) | |
tx, _ := r3.CreateTextureFromSurface(I) | Création d'une texture tx avec accélération matérielle (mémoire Ram --> mémoire carte graphique) | |
I.Free() | Libération de la mémoire Ram I. | |
for P = sdl.PollEvent(); P != nil; P = sdl.PollEvent() { } | Vidage de la file des évènements | |
var a float64 = 0.0 | Angle a initialisé à 0.0 | |
B = true | ||
for B { | Boucle principale. | |
for P = sdl.PollEvent(); P != nil; P = sdl.PollEvent() { | Gère les évènements. La touche d’Echap sort de la boucle. | |
switch t := P.(type) { | ||
case *sdl.QuitEvent: | ||
B = false | ||
case *sdl.KeyboardEvent: | ||
fmt.Printf( | ||
"[%d ms] \ttype:%d\tsym:%d %c\tmodifiers:%d\tstate:%d\trepeat:%d\n", | ||
t.Timestamp, | ||
t.Type, | ||
t.Keysym.Sym, | ||
t.Keysym.Sym, | ||
t.Keysym.Mod, | ||
t.State, | ||
t.Repeat | ||
) | ||
if t.Keysym.Sym == sdl.K_ESCAPE { | ||
B = false | ||
} | ||
} | ||
} | ||
r3.SetDrawColor(255, 255, 55, 255) | ||
r3.Clear() | ||
r3.Copy( | Copie d'image. | |
tx, | La texture source. | |
nil, | La partie de la texture à copier, sous forme d'un rectangle. nil indique que toute l'image est à copier. | |
&sdl.Rect{0, 0, 50, 50} | Le lieu ou sera copié cette partie, sous forme d'un rectangle. | |
) | ||
a += 1.0 if a > 360.0 { a = 0 } |
||
r3.CopyEx( | Copie d'image avec davantage d'options, | |
tx, | La texture source. | |
nil, |
La partie de la texture à copier, sous forme d'un rectangle. nil indique que toute l'image est à copier. | |
&sdl.Rect{100, 100, L, H}, | Le lieu ou sera copié cette partie, sous forme d'un rectangle. | |
a, | Angle en degrés d'inclinaison de la partie. | |
nil, | Point autour duquel tourne la partie. nil indique le point centrale de la partie. | |
sdl.FLIP_HORIZONTAL | Inverse droite et gauche (sdl.SDL_FLIP_VERTICAL inverse haut et bas, sdl.FLIP_NONE laisse inchangé). | |
) | ||
r3.Present() | ||
time.Sleep(time.Millisecond * 10) | ||
} | ||
tx.Destroy() | Libère la mémoire de la texture tx | |
img.Quit() | Ferme la librairie sdl_image | |
r3.Destroy() | ||
w3.Destroy() |