AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -28%
-28% Machine à café avec broyeur ...
Voir le deal
229.99 €

 

 [Tutoriel] Les surfaces

Aller en bas 
2 participants
AuteurMessage
onilink_
Modérateur
onilink_


Messages : 9183
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[Tutoriel] Les surfaces Empty
MessageSujet: [Tutoriel] Les surfaces   [Tutoriel] Les surfaces EmptyLun 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 Wink

albinoblacksheep albinoblacksheep albinoblacksheep



Dernière édition par onilink_ le Dim 13 Jan 2013 - 21:13, édité 2 fois
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9183
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[Tutoriel] Les surfaces Empty
MessageSujet: Re: [Tutoriel] Les surfaces   [Tutoriel] Les surfaces EmptyLun 17 Oct 2011 - 14:37

Voila, tutoriel terminé :p
Revenir en haut Aller en bas
Qual
Utilisateur confirmé: Rang ****
Qual


Messages : 1450
Projet Actuel : Tower Defence

[Tutoriel] Les surfaces Empty
MessageSujet: Re: [Tutoriel] Les surfaces   [Tutoriel] Les surfaces EmptyLun 17 Oct 2011 - 16:05

Pavé César. Ceux qui n'ont pas lu te salut. \mrgreen2

Je lirait ça ce soir :p
Revenir en haut Aller en bas
http://www.brainwizz.fr
Contenu sponsorisé





[Tutoriel] Les surfaces Empty
MessageSujet: Re: [Tutoriel] Les surfaces   [Tutoriel] Les surfaces Empty

Revenir en haut Aller en bas
 
[Tutoriel] Les surfaces
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Surfaces de M**** !!!!!
» [FAQ] Surfaces
» Les surfaces
» Surfaces
» Problème de surfaces

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Game Maker-
Sauter vers: