Programmer sur Script (partie 9)

Voir le sujet précédent Voir le sujet suivant Aller en bas

Tutoriel Programmer sur Script (partie 9)

Message par Morgan9195 le Dim 30 Juin - 15:39

Programmer sur Script (partie 9)
Les formes 3D



Maintenant que vous connaissez les quelques fonctions de camera 3D, je vous propose qu'on commence à les mettre en pratique.
Créez un nouveau projet Script vierge, et placez y ces codes:
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);
Ce code place une camera 3D dans un espace totalement vide.
Vous pouvez personnaliser la camera en modifiant ces variables si vous le souhaitez:
start.script:

x=0;
y=0;
z=10; // hauteur du joueur
direction=45; // angle horizontal de la camera
zdir=0; // angle vertical de la camera
Si vous testez le code maintenant, vous serez déçu de ne rien voir en 3D, et c'est normal car la camera est encore seule dans l'espace entièrement vide. Nous allons donc ajouter des formes pour voir l'effet de cette camera.
Avant de vous apprendre les différentes formes 3D, je vais d'abord vous montrer comment réagissent les formes 2D lorsqu'elles sont utilisées en 3D.
Ajoutons quelques lignes à la fin de ce code pour y faire apparaitre une forme 2D:
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);

draw_set_color(c_blue);
draw_rectangle(10,10,20,20,true);

Voici le résultat que vous pourrez observer:

(Si vous ne voyez pas les lignes bleu au sol, bougez la souris afin de faire pivoter la camera. Vous finirez par voir la même chose que moi)

Comme vous pouvez le voir, la forme 2D a fonctionné en 3D, c'est parce que je n'ai pas utilisé la ligne draw_2D(); pour revenir en mode dessin 2D. Elle s'est donc dessinée à plat sur le sol en 3D. Elle ne prend pas en compte la hauteur z, elle a une hauteur z=0.
Ceci fonctionne avec toutes les fonctions de dessin 2D.
Nous reviendrons plus tard sur ces fonctions 2D utilisables en 3D pour les déplacer et les pivoter dans l'espace.

Le ciel que vous voyez sur cette illustration est tout blanc. Si vous souhaitez changez sa couleur, il suffit de modifier la couleur du background, car en 3D le background est aussi la couleur d'arrière plan de la fenêtre. Voici la ligne pour modifier cette couleur:
start.script:

background_color=c_aqua;
On reviendra plus tard sur la couleur du ciel pour lui appliquer une texture.

Maintenant que j'ai abordé un peu les formes 2D dans un espace 3D, je vous invite à faire quelques tests de fonctions 2D en 3D.

Passons maintenant aux vraies formes 3D: les cubes, les sphères, les cylindres, les cônes et autres.
Commençons par la fonction d3d_draw_block(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat); qui comme son nom l'indique, dessine un cube en 3D.
Tout comme la fonction draw_rectangle(x1,y1,x2,y2,outline); , la fonction d3d_draw_block(...); dessine un cube définit par la position de ses 2 sommets opposés. x1, y1 et z1 sont dont les coordonnées du premier coin du cube, et x2, y2 et z2 les coordonnées du sommet opposé (Il est conseillé de respecter ceci: x1<x2, y1<y2, z1<z2 mais c'est facultatif).
La texture doit être un background, pas un sprite. Un sprite est une texture réservée pour la 2D. Un background est une texture réservée pour la 3D.
Vous savez importer un sprite mais vous ne savez pas encore importer un background dans le jeu. Ne vous inquiétez pas, ce n'est pas très différent.
Voici la fonction pour importer un sprite, suivie de la fonction pour importer un background, vous pourrez ainsi comparer les deux.
Code:

spr_logo=import_sprite("res/spr/logo.png");
back_sol=import_background("res\spr\wood.png");
C'est juste quasi identique, vous n'avez donc rien de compliqué ici.
Revenons un peu à cette fonction d3d_draw_block(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat);
hrepeat est la répétition de la texture horizontalement, et vrepeat est la répétition de la texture verticalement. C'est à dire que sur une même face d'un cube, on peut répéter plusieurs fois la même texture.

Mettons cette fonction en pratique.
Pour cela, reprenons le code du mini jeu 3D que nous avons commencé au début de cette page:
start.script:

z=10;
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);

draw_set_color(c_blue);
draw_rectangle(10,10,20,20,true);
Nous allons y ajouter une ligne qui importe la texture du cube.
start.script:

z=10;
back_bois=import_background("res\spr\wood.png");
Puis une ligne qui dessine un cube au centre du rectangle dessiné au sol.
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);

draw_set_color(c_blue);
draw_rectangle(10,10,20,20,true);

d3d_draw_block(12,12,0,18,18,6,back_bois,1,1);
Rendu:

Mais que ce passe t'il? Le cube possède bien la bonne texture, mais semble teinté en bleu.
C'est une erreur classique que vous pourrez rencontrer et c'est pourquoi je vous en parle maintenant (et oui, j'ai fais exprès de provoquer cette erreur What a Face ).
Retournons dans le code qui dessine ce cube:
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);

draw_set_color(c_blue);
draw_rectangle(10,10,20,20,true);

d3d_draw_block(12,12,0,18,18,6,back_bois,1,1);
Concentrez vous sur les 3 dernières lignes.
draw_set_color(c_blue); ---> Sélectionne la couleur bleu.
draw_rectangle(10,10,20,20,true); ---> Dessine un rectangle en 3D avec la couleur précédemment choisi.
d3d_draw_block(12,12,0,18,18,6,back_bois,1,1); ---> Dessine un cube avec la couleur précédemment choisi.

La fonction draw_set_color(c_blue); agit comme un filtre lumineux sur les textures, et ne laisse passer que la couleur bleu. Mettez une autre couleur et vous vous en apercevrez Smile

Pour afficher une texture normale au cube, il faut donc sélectionner la couleur blanche laissant passer toutes les couleurs.
script0.script:

draw_3D();
light(false);

draw_set_color(c_white);
camera_3D_fps(true);

draw_set_color(c_blue);
draw_rectangle(10,10,20,20,true);
draw_set_color(c_white);
d3d_draw_block(12,12,0,18,18,6,back_bois,1,1);
Voici le résultat:


Mais les jeux ne sont pas fais uniquement avec des cubes, vous aurez besoin d'autres formes. En voici quelques unes qui pourraient vous satisfaire:
Cylindre: d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat,closed,steps);
closed: true si on doit fermer le dessus et le dessous du cylindre. Sinon false.
steps: Le nombre d'étapes de rotations. Valeur typique: 24. Plus on augmente ce nombre, plus la qualité est élevée, mais le jeu commencera à laguer.
Cône: d3d_draw_cone(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat,closed,steps);
Sphère: d3d_draw_ellipsoid(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat,steps);
Mur vertical: d3d_draw_wall(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat);
Sol, plat ou incliné: d3d_draw_floor(x1,y1,z1,x2,y2,z2,texture,hrepeat,vrepeat);

Je vous donnerais d'autres formes plus complexes plus tard, mais pour le moment contentez-vous de celles-ci.

Astuce: Plusieurs formes les unes dans les autres peuvent donner une forme différente.
avatar
Morgan9195
Fondateur
Fondateur

Messages : 168
Date d'inscription : 11/02/2013
Age : 22
Localisation : Entre le fauteuil et le clavier

Projet(s)
Niveau de connaissances dans Script: Professionnel
Spécialité: Programmeur

Voir le profil de l'utilisateur http://morgan9195.olympe.in/devblog/

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum