Ouvrir dans une nouvelle fenêtre
Tutorial d’utilisation de la 3D dans Game Maker.

Auteur : TheDarkTiger


I introduction

II fonctions de base

III fonctions avancées : création d'un pong3D


I introduction

Bien le bonjour ^^, je vais vous expliquer en quelques minutes, le fonctionnement de la 3D dans Game Maker.

Dans un premier temps voici quelques précisions pour utiliser la 3D dans Game Maker :

- Il faut l'initialiser la 3D au début, bien entendu, (ici on peut donc paramétrer le lisage des textures, les lumières ...)
- Toutes les actions de dessin se feront dans l'Évent "DRAW".
- Game Maker n'est pas spécialisé dans la 3D, il s'agit juste d'un "option" (bien que l'on puisse faire des choses magnifiques avec)

Le moteur 3D de game maker permet de faire des jeux du niveau de la nintendo 64 (enfin au niveau des polygones car il peut faire  mieux grâces aux fonctions avancées de dessin, tel les lumières dynamiques, les rendus additifs ou soustractifs... enfin plein de choses compliquées^^)

Dernière précision, il faut être enregistré pour accéder aux fonctions 3D de Game Maker.

II fonctions de base

Bien, comme je l'ai énoncé plus haut, il faut initialiser le moteur 3D pour pouvoir afficher des polygones.

l'initialisation:

Pour initialiser la 3D, il faut taper les lignes de code indiquant ...que la 3D commence!
Comme nous le verrons, il existe moult paramètres pouvant être ajoutés après l'initialisation, comme le brouillard, ou les effets de lumières.

Voici donc une initialisation assez courante :

d3d_start();
d3d_set_fog(true,c_white,1000,1200);
d3d_set_shading(true);
d3d_set_lighting(true);
d3d_set_hidden(true);
d3d_set_perspective(true);
draw_set_color(c_white);

Bien on commence l'explication.

d3d_start(); Initialisation de la 3D, appartir du moment ou cette ligne est exécutée, Game Maker réagiras pour les fonctions 3D (les fonctions 2D seront donc exécutées bizarrement, pour ne pas dire non exécutées)

d3d_set_fog(true,c_white,1000,1200); Initialisation du brouillard . Bha vi on peut faire du brouillard. Au début, on met true pour indiquer que le brouillard sera affiché, le c_white indique la couleur (ici blanc), 1000 indique où le brouillard commence et 1200 où il finit.

d3d_set_shading(true); y aurat-il des ombres? (true / false)

d3d_set_lighting(true); les lumières seront elles activées ?

d3d_set_hidden(true); dessine t-on les polygones cachés ?

d3d_set_perspective(true); dessine t-on en perspective cavalière ?

draw_set_color(c_white);  couleur de "lumière globale" on pourrait la nommer de la sorte, bien qu'en réalité, il ne s'agisse pas d'une lumière.

Bien nous venons de faire le premier pas dans la 3D sous Game maker . Ca vous à plu ?
Bon tout ca c'est bien gentil mais ça affiche rien ... On vas donc afficher notre premier objet qui sera un cube.

Liste des choses à avoir sous la main:

- 5 Minutes
- une image dont les dimensions sont des puissances de 2 (2-4-8-16-32-64-128-256-512-1024-2048-4096-...)
- Game maker 6 enregistré

1) On charge son image en tant que background (nommé "Image" pour que l'on puisse s'y retrouver)

2) On créé un piti objet (pas besoin de sprite ^^)

    - dans l'évent création => exécuter un code :

 

{
d3d_start
();
draw_set_color(c_white);
angle=0;
}

Rien de compliqué n'est ce pas? 

     - dans l'évent draw => exécuter un code :

{
d3d_set_projection(4*sin(degtorad(angle)),4*cos(degtorad(angle)),4,0,0,0,0,0,1);
d3d_draw_block(-1,-1,0,1,1,2,background_get_texture(Image
),1,1);
angle+=5;
}

Ha alors là ya une difficultée.

d3d_set_projection(4*sin(degtorad(angle)),4*cos(degtorad(angle)),4,0,0,0,0,0,1);

d3d_set_projection(position X, position Y, position Z, pointe en X, pointe en Y, pointe en Z, rotation X, rotation Y, rotation Z) : on place la camera

Il est nécessaire de place la camera AVANT de dessiner ses objets 3D .

d3d_draw_block(position X départ, position Y départ, position Z départ, position X arrivée, position Y arrivée, position Z arrivée, Texture, répétition horizontale, répétition verticale) : et voila comment on dessine un bloc facile non?

Ici , le point bleu représente les coordonnées de "départ" et le point rouge les coordonnées "d'arrivée".

Mais pourquoi diable ai-je mis des nombres négatifs? Juste pour que le cube soit centré ^^

 

3) On créé une pièce (Room) dans laquelle on place l'objet (en un exemplaire)

à ce stade, vous devriez avoir ceci:

 

4) On lance le programme et on regarde ^^


Hooo que c'est beau!

 

Vindiou! comme vous avez pu le remarquer, on utilise la commande d3d_draw_block pour créer un bloque. alors pour créer un mur, on fera quoi?
Oui exactement!
d3d_draw_wall(position X départ, position Y départ, position Z départ, position X arrivée, position Y arrivée, position Z arrivée, Texture, répétition horizontale, répétition verticale)   c'est le même mais en différent ^^

Comment ça vous ne me croyez pas ? Alors premier exercice : changer "block" par "wall" et lancer le programme. Tien pi même après, deuxième exercice : changer "block" par "floor" et lancer le programme.

Et voila ça marche non ?

- M'sieu M'sieu 
- Oui qui à t-il?
- Et pour faire une sphère? ou un cylindre
- Heu... C'est pas de ton age fille!

Bon trêve de plaisanterie pour les sphères et les cylindres, il n'y a que deux paramètres optionnels:

- closed [Cylindres]: Votre figure sera-t-elle fermée ou pourras-t-on voir l'intérieur? (true (vrai) ou false (faux))
- steps [Cylindres et spheres]: Combien de côtés votre objet aura-t-il ? (de 3 à autant que vous voulez, mais en général, on met 15 et Mark Overmars nous conseille 24)

Ce qui donne:

d3d_draw_ellipsoid(position X départ, position Y départ, position Z départ, position X arrivée, position Y arrivée, position Z arrivée, Texture, répétition horizontale, répétition verticale, fermé?,nb de côtés) 

d3d_draw_cylinder(position X départ, position Y départ, position Z départ, position X arrivée, position Y arrivée, position Z arrivée, Texture, répétition horizontale, répétition verticale, fermé?,nb de côtés) 

Donc ,en code GM, cela nous donne pour avoir une sphere :

{
d3d_set_projection(4*sin(degtorad(angle)),4*cos(degtorad(angle)),4,0,0,0,0,0,1);
d3d_draw_ellipsoid(-1,-1,0,1,1,2,background_get_texture(Image
),1,1,20);
angle+=5;
}

Et pour avoir un cylindre :

{
d3d_set_projection(4*sin(degtorad(angle)),4*cos(degtorad(angle)),4,0,0,0,0,0,1);
d3d_draw_cylinder(-1,-1,0,1,1,2,background_get_texture(Image
),1,1,true,20);
angle+=5;
}

Voila ^^ . Maintenant, vous savez les bases de la 3D dans Game Maker

III fonctions avancées : création d'un pong3D

Bon on vas se faire un piti exemple d'application : un pong en 3D
Comment ça c'est nul? Si vous ne savez pas faire ce genre de petits trucs, vous ne mettrez jamais en application les choses simple de la 3D et ne vous attendez pas à refaire Half Life en 2 semaines!

Bon commençons. Notre jeu contiendra:

SPRITES

- 4 textures sous forme de sprite (tex_sol; tex_balle; tex_plaque; tex_mur)
    ¤ ces textures selon de votre cru (donc ce que vous voulez), du moment qu'elles soit des puissances de 2 (voir tout en haut ^^)
    ¤ Si vous le souhaitez, je vous expliquerais comment animer la texture du sol (mais vous pourrez l'appliquer sur l'objet de votre choix)
- 5 icones:
    ¤ ico_mur, ico balle, ico_perdu, ico_sol en 16*16
    ¤ ico_plaque en 16*32

Bref, 9 sprite (respectez les noms, sinon, vous devrez remplacer par les votre dans toute la suite du tuto )

OBJETS

5 objets :

- balle :[ icône : ico_balle ]

Je vous montre ma configuration:

dans l'évent create :
- Execute a pice of code :

{

d3d_start();

draw_set_color(c_white);

}

Bref l'initialisation classique en 3D .

- Set dirrection and speed :

Bha vi faut bien que la balle bouge ^^

dans l'évent collision avec mur et collision avec plaque :

dans l'évent collision avec perdu :
Recomencer la pièce (restart current room)

dans l'event draw, c'est écrit sur l'image plus haut ^^

- MUR [ icône : ico_mur; SOLIDE ]

 

- PERDU [ icône : ico_perdu; SOLIDE ] (rien à mettre dedant)

- PLAQUE [ icône : ico_plaque; SOLIDE]

 

event <Left> : modifier variable : [ X=X-5 ]

event <Right> : modifier variable : [ X=X+5 ]

bha vi faut bien déplacer la plaque ^^

- SOL [icône : ico_sol; PAS SOLIDE ]

 

event Create : changer variable : [ img = 0 ]

event draw : c'est sur l'image ^^

Dans cet exemple, le sol est animé, si vous ne voulez pas l'animer, virrez l'évent créate et et remplacez le code par celui-ci :

{

d3d_draw_floor(x,y,0,x+16,y+16,0,sprite_get_texture(tex_sol,0),1,1);

}

Donc 5 objets au total.

ROOM

on à besoin que d'une room:

 

Ici, IL FAUT METTRE EN PREMIER LA BALLE car, c'est elle qui contient la camera .
Vous pouvez sans problème mettre du sol sur la plaque et la balle, mais je n'es ais pas mis pou vous permettre de voir où était la balle.

Il vous suffit de lancer et ... Magique ca marche! (enfin normalement^^)

 

voilà je vous conseille pour vous entraîner de changer des paramètre, par exemple, faite en sorte que la texture de la balle ne se répète pas ( je vous ai dit comment faire dans le cours) ou encore jouer avec un cylindre au lieu d'une balle ' là encore c'est dans le cours ^^)

Voila en vous espérant que ce cours vous à été utile ^^
Je vous quitte pour l'instant, mais je reviendrais peut être avec d'autres tutos ^^
En attendant, si vous avez des question, n'hésitez pas et contactez moi ^^

Bonne chance à tous pour vos projets actuels !

TheDarkTiger

Fichiers GM6 du Tutoriel:
- Fonctions de base
- Pong3D