|
| Atelier GML 3 - Trigonométrie, utilisation des lengthdir | |
| | Auteur | Message |
---|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Sam 1 Juin 2013 - 12:20 | |
| Atelier GML 3 Trigonométrie, utilisation des lengthdir Bonjour, voici l'atelier GML 3, qui cette fois sera spécialisé autour d'une notion mathématique très utilisée en jeu vidéo, j'ai nommé la trigonométrie! TrigonométrieUn peu de théorieSi l'on regarde wikipédia, il nous dit que la trigonométrie est... - Citation :
- ...une branche des mathématiques qui traite des relations entre distances et angles dans les triangles et des fonctions trigonométriques telles que sinus, cosinus et tangente.
Il y a deux mots importants dans cette phrase: -distances -angles Si la trigonométrie traite des relations dans un triangle, mais elle nous servira surtout a obtenir une position en fonction d'une distance et d'un angle. Représenter des coordonnées par un angle et une distance s'appelle un système de coordonnées polaires. Il est donc possible de noter tout point p en fonction d'un angle 'a' et une distance 'r'. Pour passer de coordonnées polaires a des coordonnées cartésiennes (donc x et y) il faut utiliser des fonction trigonométriques: cosinus et sinus. x = cos(a) * r y = sin(a) * r Attention cependant, cos et sin sont des fonctions qui attendent un angle en radiant, soit un angle qui part de 0, jusqu'a 2pi (périmètre d'un cercle de rayon 1). Une manière de convertir un angle en radiants et de faire: a*pi/180. Sous GameMaker il y a donc plusieurs solutions, de la plus compliquée a la plus simple: - Code:
-
x = cos(a*pi/180)*r y = sin(a*pi/180)*r - Code:
-
x = cos(degtorad(a))*r y = sin(degtorad(a))*r - Code:
-
x = lengthdir_x(r, a) y = lengthdir_y(r, a) La première notation est vraiment lourde a écrire. La seconde plus claire mais tout de même assez longue. La troisième est très simple, et surtout très intuitive, on associe a x le lengthdir_x et a y le lengthdir_y; impossible de confondre! Niveau optimisation, la troisième solution est bien plus rapide, par conséquent, si vous avez besoin de trigo, utilisez les lengthdir. Note: Attention cependant, le 3 ième code donné ci dessus n'est pas totalement égal aux 1 et 2. En réalité la fonction lengthdir fonctionne dans un repère à Y descendant, alors que cos/sin dans un repère à Y montant. Donc pour lengthdir 90° c'est en haut (valeur négative) et pour sinus en bas (valeur positive). Une raison de plus pour utiliser le lengthdir dans GM, car cela est plus adapté au monde du jeu vidéo. En pratiqueTout cela peut paraître compliqué au premier abord mais c'est en réalité très simple. Imaginons que nous avons une objet, et que nous voulons chaque step le bouger de 5 pixels a 30 degrés? Et bien il suffit d'utiliser les coordonnées polaires (code a mettre dans step): - Code:
-
x += lengthdir_x(5, 30) y += lengthdir_y(5, 30) Il n'y a donc pas grand chose a dire de plus, ces fonctions lengthdir sont très simple a utiliser, et très utiles. Donc ne vous en privez surtout pas! Exercices Merci de poster vos réponses aux exercices en spoiler 1 - Suivre la sourisFaites en code en 2 ou 3 lignes pour que votre objet suive la souris a la vitesse de 3 pixels par step. 2 - Cercle point a pointA l'aide de la fonction draw_point et de la trigonométrie, faites un code a mettre dans draw qui dessine 360 points et forme un cercle de rayon 80 pixels. 3 - Ellipse point a pointDe la même manière, faites une ellipse (alignée aux axes, donc sans rotation) de largeur 110 et de hauteur 80 pixels. 4 - Personnage de fpsFaites des déplacements style fps vu de dessus, avec possibilité de tourner, avancer, reculer, esquiver sur les cotés. 5 - Menu rotatifFaites un menu comme dans Sword of Mana avec un nombre variable d'éléments, positionnés de manière circulaire. Si vous appuyez sur gauche, le menu tourne d'un élément, pareil pour droite. L'élément du haut est l'élément sélectionné, et doit être un peu agrandis. 6 - SpiraleCréez une fonction spirale qui dessine une spirale avec les paramètres suivants: x et y la position d'affichage turns le nombre de tours que doit faire la spirale add l’incrémentation du rayon a chaque degres p la précision d'affichage 7 - SpirographePlus difficile cette fois, écrivez une fonction spirographe qui prend les paramètres suivant et dessine un spirographe: x et y la position d'affichage r1 le rayon du grand cercle (celui ou l'on place le rouage pour dessiner r2 le rayon du petit cercle (rouage ou l'ont place le crayon dans un trou pour dessiner) r3 le rayon ou se trouve trou dans le petit cercle p la precision de dessin - Spoiler:
Indices et solutionsDisponibles d'ici au maximum quelques jours. Indice 1 - Suivre la souris - Spoiler:
Pour récupérer l'angle entre l'objet et la souris, utilisez point_direction.
Indice 2 - Cercle point a point - Spoiler:
Utilisez une boucle for
Indice 3 - Ellipse point a point - Spoiler:
Utilisez deux rayons, un pour lengthdir_x et un autre pour lengthdir_y.
Indice 4 - Personnage de fps - Spoiler:
Pour les cotés, il suffit d'utiliser la direction courante + ou - 90 degrés.
Indice 5 - Menu rotatif - Spoiler:
Affichez vos objets tous les 360/nombreObjets degrés.
Indice 6 - Spirale - Spoiler:
Utilisez des primitives pour vous faciliter la vie, et faites comme pour le dessin de cercle mais incrémentez le rayon a chaque fois que vous tournez.
Correction 1 - Spoiler:
- Code:
-
a = point_direction(x, y, mouse_x, mouse_y) x += lengthdir_x(3, a) y += lengthdir_y(3, a)
Correction 2 - Spoiler:
- Code:
-
r = 80 for(a=0; a<360; a+=1) draw_point(x + lengthdir_x(r, a), y + lengthdir_y(r, a))
Correction 3 - Spoiler:
- Code:
-
r1 = 110 r2 = 80 for(a=0; a<360; a+=1) draw_point(x + lengthdir_x(r1, a), y + lengthdir_y(r2, a))
Correction 4 - Spoiler:
#Create - Code:
-
spd = 3 dir = 90 #Step - Code:
-
if(keyboard_check(vk_up)) { x += lengthdir_x(spd, dir) y += lengthdir_y(spd, dir) } if(keyboard_check(vk_down)) { x -= lengthdir_x(spd, dir) y -= lengthdir_y(spd, dir) } if(keyboard_check(vk_left)) dir += 5 if(keyboard_check(vk_right)) dir -= 5
if(keyboard_check(ord('A'))) { x += lengthdir_x(spd, dir+90) y += lengthdir_y(spd, dir+90) } if(keyboard_check(ord('Z'))) { x += lengthdir_x(spd, dir-90) y += lengthdir_y(spd, dir-90) }
Correction 6 - Spoiler:
- Code:
-
//spirale(x, y, tours, ajoutRayon, precision) var i, turns, add, r; turns = argument2 add = argument3 r = 0
draw_primitive_begin(pr_linestrip) for(i=0; i<=360 * turns; i+=argument4) { draw_vertex(argument0 + lengthdir_x(r, i), argument1 + lengthdir_y(r, i)) r += add*argument4 } draw_primitive_end()
Dernière édition par onilink_ le Sam 1 Juin 2013 - 15:12, édité 1 fois |
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Sam 1 Juin 2013 - 14:51 | |
| Une erreur cher onilink_ : lengthdir et sin/cos fonctionnent toutes dans le sens direct (sens inverse des aiguilles d'une montre). La différence est que les fonctions sinus et cosinus sont des fonctions mathématiques, définies dans un repère à Y montant (origine en bas à gauche). Or en informatique, on utilise principalement le Y descendant (origine en haut à gauche), d'où lengthdir_y qui s'occupe d'inverser l'axe. Une exception notable est OpenGL qui par défaut utilise un repère à Y montant. |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Sam 1 Juin 2013 - 15:10 | |
| Ah okey, je savais pas que ça portais ce nom la, merci pour la remarque :b |
| | | Mobi Utilisateur confirmé: Rang ****
Messages : 1256 Localisation : Dijon
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Sam 1 Juin 2013 - 17:08 | |
| Je ne comprend pas l'exo 3... Z Q S D pour se déplacer et A E pour tourner ? |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Sam 1 Juin 2013 - 20:59 | |
| Les touches que tu veux, a vrai dire c'est pas vraiment la chose importante dans l'exercice x) |
| | | Invité Invité
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Dim 2 Juin 2013 - 0:30 | |
| Ma solution pour l'exercice 7 : - Spoiler:
- Code:
-
for (i=360/argument6; i<=360*argument5; i+=360/argument6) { draw_line_color(argument0+lengthdir_x(argument2-(argument3*2),(i-360/argument6)/argument5)+lengthdir_x(argument3+argument4,(i-360/argument6)/argument5)+lengthdir_x(argument4,((i-360/argument6)/argument5)*(argument5+1)),argument1+lengthdir_y(argument2-(argument3*2),(i-360/argument6)/argument5)+lengthdir_y(argument3+argument4,(i-360/argument6)/argument5)+lengthdir_y(argument4,((i-360/argument6)/argument5)*(argument5+1)), argument0+lengthdir_x(argument2-(argument3*2),i/argument5)+lengthdir_x(argument3+argument4,i/argument5)+lengthdir_x(argument4,(i/argument5)*(argument5+1)),argument1+lengthdir_y(argument2-(argument3*2),i/argument5)+lengthdir_y(argument3+argument4,i/argument5)+lengthdir_y(argument4,(i/argument5)*(argument5+1)),argument7,argument7);} draw_spirograph(x,y,r1,r2,r3,nombreDeCycles,p,couleur); c'est pas très optimisé par contre...
|
| | | marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Dim 2 Juin 2013 - 13:14 | |
| salut,nice cet atelier! exo 1: - Spoiler:
mouse_dir=point_direction(x,y,mouse_x,mouse_y)
x+=lengthdir_x(3,mouse_dir) y+=lengthdir_y(3,mouse_dir)
comment penser à utiliser ce genre de fonction pour faire bouger un perso? avec tout les fonction qui existe déjà move to ,speed et compagnie ! ps: tu a une astuce simple pour que le perso ne tremble pas quand il est a la souris? exo 2: - Spoiler:
for(a=1;a<=360;a+=1){
x2=x+lengthdir_x(80,a) y2=y+lengthdir_y(80,a) draw_point(x2,y2) }
exo3: - Spoiler:
for(a=1;a<=360;a+=1){
x2=x+lengthdir_x(110,a) y2=y+lengthdir_y(80,a) draw_point(x2,y2) }
exo4: - Spoiler:
mouse_dir=(point_direction(x,y,mouse_x,mouse_y))
if(keyboard_check(ord("Z"))){ x+=lengthdir_x(6,mouse_dir) y+=lengthdir_y(6,mouse_dir) } if(keyboard_check(ord("S"))){ x+=lengthdir_x(6,mouse_dir+180) y+=lengthdir_y(6,mouse_dir+180) } if(keyboard_check(ord("Q"))){ x+=lengthdir_x(6,mouse_dir+90) y+=lengthdir_y(6,mouse_dir+90) } if(keyboard_check(ord("D"))){ x+=lengthdir_x(6,mouse_dir-90) y+=lengthdir_y(6,mouse_dir-90) }
exo 6 et 7 d'ici quelques années thx pour ton atelier! |
| | | Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Dim 2 Juin 2013 - 16:14 | |
| Cool, j'ai compris l'utilisation des lengthdir que récemment mais qu'est ce que c'est pratique En plus grace à toi je viens de capter comment faire un arc de cercle Marty pour pas que ca tremble suffit de rajouter un if avec un point_distance Je posterai demain un exemple de viseur pour fusil de chasse (qui tire 3 balles avec un angle différent) que j'utilise pour mon jeu |
| | | marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Dim 2 Juin 2013 - 18:54 | |
| (me suis dit qu'il utilisait peut être un autre code,vu comment il fait bouger les objets !)
requête:
à quand un atelier "game making" qui passerait en revu les différents style de jeu! casse_brique, tower défense,jeu de course,plateforme (déjà survoler précédemment),jeu de lettre ..
du plus simple au plus compliquer.svp.
|
| | | Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Dim 2 Juin 2013 - 21:10 | |
| - marty a écrit:
- à quand un atelier "game making" qui passerait en revu les différents style de jeu!
casse_brique, tower défense,jeu de course,plateforme (déjà survoler précédemment),jeu de lettre ..
du plus simple au plus compliquer.svp. Je plussoie, ca pourrait etre très utile pour tous les nouveaux qui savent pas comment faire, ni meme par ou commencer Moi je veux bien en faire un, je vais avoir du temps libre ces vacances edit : pour le viseur : - Code:
-
dist=point_distance(heros.x,heros.y,mouse_x,mouse_y); dir=point_direction(heros.x,heros.y,mouse_x,mouse_y); draw_line(heros.x+lengthdir_x(dist-16,dir),heros.y+lengthdir_y(dist-16,dir),heros.x+lengthdir_x(dist,dir),heros.y+lengthdir_y(dist,dir)); draw_line(heros.x+lengthdir_x(dist-16,dir-3),heros.y+lengthdir_y(dist-16,dir-3),heros.x+lengthdir_x(dist,dir-3),heros.y+lengthdir_y(dist,dir-3)); draw_line(heros.x+lengthdir_x(dist-16,dir+3),heros.y+lengthdir_y(dist-16,dir+3),heros.x+lengthdir_x(dist,dir+3),heros.y+lengthdir_y(dist,dir+3)); Ca dessine les trois lignes où passerons les 3 balles tirées avec pour direction celle entre le héros et la souris, telle quelle, incrémentée de 3° ou diminué de 3° (je sais pas si c'est très clair ), en fonction de la distance entre le héros et la souris. |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Lun 3 Juin 2013 - 16:13 | |
| marty> Nickel tes codes, pour la saccade yep un point_distance et c'est bon Quand aux ateliers dont tu parles je comptais les faire a la sortie d'onidev. Je pense arrêter de faire du contenu pour GM car vu la tournure que prennent les choses, c'est plus trop la peine... Pour ce qui est des lengthdir c'est surtout une notion mathématique a saisir, d'ou l'atelier. |
| | | marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Lun 3 Juin 2013 - 21:58 | |
| - Citation :
- Quand aux ateliers dont tu parles je comptais les faire a la sortie d'onidev. Je pense arrêter de faire du contenu pour GM car vu la tournure que prennent les choses, c'est plus trop la peine...
me doute que tu perd ton temps avec GM. (c'est plus ce que c'était ,à savoir un petit soft pas cher (voir gratuit) ,bien foutu (tout en un) ,accessible qui permettait à tout à chacun, avec un tout petit peu d'effort de faire des jeux variés ,mais pas seulement il introduisait au monde de la programmation avec des fonctions facilement compréhensible ,et était fédérateur ,car modulable par ses utilisateurs...tout une philosophie ...)merci de ton investissement sur ce forum (j'en profite largement) ,et serait t'il possible de regrouper tes tutoriels et autres dans un fichier d'aide chm? (mais je me répète je crois ) enfin, si on peux t'aider à te faire avancer dans onidev (dans la mesure de nos capacités hein !) n'hésite pas, t'a un fan club ici! d'ailleurs peux tu donner même approximativement une échéance de sortie ? |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Mar 4 Juin 2013 - 16:28 | |
| Pour le fichier chm j'ai pas vraiment le temps de le faire, et pour la sortie d'onidev je peut pas prévoir malheureusement :/ Mais d'ici la fin des grandes vacances (donc vers septembre) je devrait sortir un version utilisable.
|
| | | marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir Mar 4 Juin 2013 - 22:10 | |
| nop ! début septembre la pression qu'on va te mettre alors, d'ici là! |
| | | 3nder Débutant
Messages : 13 Projet Actuel : tank
| Sujet: re utilisation des lengthdir Mer 5 Juin 2013 - 1:36 | |
| EURÉKA |
| | | Contenu sponsorisé
| Sujet: Re: Atelier GML 3 - Trigonométrie, utilisation des lengthdir | |
| |
| | | | Atelier GML 3 - Trigonométrie, utilisation des lengthdir | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |