onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: [Tutoriel] Les surfaces Lun 17 Oct 2011 - 13:50 | |
| Les surfaces
Sommaire
1-Introduction 2-Dessiner dans une surface 3-Agir sur l'écran en temps réel
1-Introduction
Les surfaces sont des textures spéciales. On peut les afficher comme n'importe quel sprite ou background, mais surtout, on peut dessiner dessus comme s'il s’agissait de l'écran. Cela permet de faire de nombreux effets, et est très utile pour faire un programme du style paint ou photoshop (voir Animatoon de Blendman).
Pour ceux qui ont déjà fait de l'OpenGl, c'est l'équivalent des Frame Buffer Objetcs.
2-Dessiner sur une surface
Création d'une surface Tout d'abord il vous faut créer une surface avec la fonction surface_create(largeur, hauteur). Cette fonction retourne l'id de la surface crée.
- Code:
-
surf = surface_create(640, 480)
Indiquer que l'on veux dessiner dans cette surface
Maintenant il faut indiquer que l'on veux dessiner dans cette surface, car par défaut GM dessine sur l'écran. Pour ce faire il faut utiliser la fonction surface_set_target(surface id)
- Code:
-
surface_set_target(surf)
Dessiner sur la surface
Vous pouvez maintenant dessiner dans votre surface, comme s'il s’agissait de l'écran. Toutes les fonctions draw que vous utiliserez dessinerons dans la surface que vous avez choisis comme destination avec surface set target. Pour vider complètement une surface faites un draw_clear_alpha(c_black, 0)
Redessiner sur l'écran
Maintenant que vous avez dessiné dans votre surface, il faut redéfinir l'écran comme cible pour les draw. Pour cela il suffit d'utiliser la fonction surface_reset_target() Vous pouvez maintenant afficher votre surface dans un draw event avec draw_surface(surface id, x, y)
Voici une liste des fonctions qui permettent de dessiner une surface a l'écran : draw_surface(id,x,y) draw_surface_stretched(id,x,y,w,h) draw_surface_tiled(id,x,y) draw_surface_part(id,left,top,width,height,x,y) draw_surface_ext(id,x,y,xscale,yscale,rot,color,alpha) draw_surface_stretched_ext(id,x,y,w,h,color,alpha) draw_surface_tiled_ext(id,x,y,xscale,yscale,color,alpha) draw_surface_part_ext(id,left,top,width,height,x,y,xscale,yscale,color,alpha) draw_surface_general(id,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha)
Libérer la mémoire utilisée par une surface
Pour supprimer une surface et ainsi libérer la mémoire qu'elle utilise, il faut utiliser la fonction suivante : surface_free(surface id)
Exemple
Voici un exemple d'utilisation de surface pour faire un logiciel de painting
Create: - Code:
-
surface_draw = surface_create(640, 480) surface_set_target(surface_draw) draw_clear_alpha(c_white,0) surface_reset_target()
current_x = mouse_x current_y = mouse_y
Step - Code:
-
surface_set_target(surface_draw) if(mouse_check_button(mb_left)) draw_line(current_x, current_y, mouse_x, mouse_y) current_x = mouse_x current_y = mouse_y surface_reset_target()
Draw - Code:
-
draw_surface(surface_draw, 0, 0)
Game End - Code:
-
surface_free(surface_draw)
3-Agir sur l'écran en temps réel
Les surface deviennent très intéressantes dès qu'il s'agit de traiter l'écran en temps réel. Bien que cela puisse devenir couteux en performances, on peut réaliser toutes sortes d'effets comme les effets de flou, de distorsion, etc etc. En fait si vous avez déjà vu un effet dans un jeux GM, il est très probable qu'il utilise les surfaces. D'ailleurs tous les moteurs de lumière de GM utilisent les surfaces (voir Smartlight de Bast, luminaire de GearGod, etc). Couplé au blendmode l'utilisation des surfaces deviens un des outils les plus puissants de GM.
Avant de pouvoir agir sur l'écran, il faut pouvoir récupérer ses données dans une surface.
Ré afficher l'écran
Comme vous l'avez compris, pour récupérer l'écran dans un surface il faut avant tout faire un surface_set_target, afficher l'écran, et faire un surface_reset_target. Le problème c'est qu'en principe, si vous faites ça c'est pour ensuite afficher la surface. Donc on risque de se retrouver avec un effet miroir très moche si on ne fait rien. La solution est toute simple. Il suffit de rendre l'objet qui dessine la surface invisible pendant la réactualisation de l'écran, et le remettre visible ensuite.
Le code auras donc cette forme (dans step) - Code:
-
visible = 0 surface_set_target(surf) screen_redraw() surface_reset_target() visible = 1
Il dessine donc tout l'écran dans notre surface. Par contre quand je dit tout l'écran, c'est tout l'écran visible dans le viewport. Si votre surface fait 64*64 et votre viewport 640*480, ben vous allez vous retrouver avec une miniature de l'écran dans votre surface.
Modifier le viewport
Si vous souhaitez ne traiter qu'une partie de l'écran, il serais intéressant de changer le viewport afin de ne redessiner que ce qui nous intéresse. Si nous avons une surface de 64*64 nous souhaiterons donc avoir un viewport de 64*64 positionné la ou l'on veux.
Pour cela nous allons stocker le viewport actuel dans des variables, le modifier, ré-afficher l'écran dans notre surface, et restaurer l'ancien viewport.
Exemple: - Code:
-
xv_temp = view_xview yv_temp = view_yview wv_temp = view_wview hv_temp = view_hview
visible = 0 surface_set_target(surf)
// on modifie le viewport view_xview = mouse_x // par exemple on choisi les coordonnées de la souris view_yview = mouse_y view_wview = 64 // et on prend la taille de notre surface view_hview = 64
screen_redraw() surface_reset_target() visible = 1
// on restaure le viewport view_xview = xv_temp view_yview = yv_temp view_wview = wv_temp view_hview = hv_temp
Voici un exemple qui utilise le viewport pour faire un effet de loupe. Loupe.zip
Bien sur il aurais été plus simple d'afficher la surface avec un coup de scaling, mais c'est pour bien montrer comment utiliser les viewport avec les surfaces.
Voila, vous connaissez maintenant toutes les astuces pour utiliser les surfaces. J'ajouterais peut être des astuces et exemples avec le temps, mais je pense avoir fait le tour. Si vous avez des questions ou suggestions n’hésitez pas a m'en faire part
Dernière édition par onilink_ le Dim 13 Jan 2013 - 21:13, édité 2 fois |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] Les surfaces Lun 17 Oct 2011 - 14:37 | |
| Voila, tutoriel terminé :p
|
|
Qual Utilisateur confirmé: Rang ****
Messages : 1450 Projet Actuel : Tower Defence
| Sujet: Re: [Tutoriel] Les surfaces Lun 17 Oct 2011 - 16:05 | |
| Pavé César. Ceux qui n'ont pas lu te salut. \ Je lirait ça ce soir :p |
|
Contenu sponsorisé
| Sujet: Re: [Tutoriel] Les surfaces | |
| |
|