| draw_losange | |
|
|
Auteur | Message |
---|
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: draw_losange Dim 2 Oct 2011 - 2:03 | |
| Bonsoir, Il s'agit juste d'un petit script tout simple. Il permet de réaliser un losange. Il s'utilise de la même manière que draw_rectanle(). Son point d'origine est le sommet du haut. Version zoulie: - Spoiler:
- Code:
-
//draw_losange(x,y,size,outline);
var X, Y, D, O; X = argument0; Y = argument1; D = argument2; O = argument3; switch (O) begin
case true: draw_primitive_begin(pr_linestrip); draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y); draw_primitive_end(); break; case false: draw_primitive_begin(pr_trianglestrip); draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_primitive_end(); break;
default: return false; break;
end;
Version optimisé: - Code:
-
//draw_losange(x,y,size,outline); draw_primitive_begin(argument3*pr_linestrip + (!argument3)*pr_trianglestrip); draw_vertex(argument0, argument1); draw_vertex(argument0+(argument2/2), argument1+(argument2/2)); if (argument3) draw_vertex(argument0, argument1+argument2); draw_vertex(argument0-(argument2/2), argument1+(argument2/2)); if (argument3) draw_vertex(argument0, argument1); else draw_vertex(argument0, argument1+argument2); draw_primitive_end(); Example dans ev_draw: - Code:
-
draw_losange(32,16,48,true); draw_losange(100,16,48,false);
Dernière édition par Caly le Dim 2 Oct 2011 - 18:16, édité 2 fois |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 3:05 | |
| À ta place je mettrais un if à la place du switch, et tu peux factoriser les instructions draw_... en-dehors dudit if |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 9:13 | |
| Bonjour D-z, - Citation :
- À ta place je mettrais un if à la place du switch, et tu peux factoriser les instructions draw_... en-dehors dudit if
Je n'est pas compris... En fait je ne comprend pas ce qu'un if m'apporterais de plus qu'un switch. Je suis un grand fan des switch, je trouve ça propre et clair. |
|
| |
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 12:46 | |
| Voilà ce que te propose de faire D-z : - Code:
-
//draw_losange(x,y,size,outline);
var X, Y, D, O; X = argument0; Y = argument1; D = argument2; O = argument3; if (O) { draw_primitive_begin(pr_linestrip); draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y); draw_primitive_end(); } else { draw_primitive_begin(pr_trianglestrip); draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_primitive_end(); }
Lorsqu'on utilise un booléen, un if sera toujours plus intéressant à utiliser qu'un switch étant donné qu'il est justement là pour tester des conditions booléennes |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 12:58 | |
| Et même : - Code:
-
//draw_losange(x,y,size,outline);
var X, Y, D, O; X = argument0; Y = argument1; D = argument2; O = argument3; if (O) draw_primitive_begin(pr_linestrip); else draw_primitive_begin(pr_trianglestrip);
draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y); draw_primitive_end(); |
|
| |
Mass *Excellent utilisateur*
Messages : 3351 Localisation : Dans une canonnière wookie. Projet Actuel : Monter des trucs et des machins
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 13:48 | |
| Y'a une utilité réelle d'associer chaque argument à une variable ou c'est juste par confort/condensation du script ? |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 13:59 | |
| - D-z a écrit:
- Et même :
- Code:
-
//draw_losange(x,y,size,outline);
var X, Y, D, O; X = argument0; Y = argument1; D = argument2; O = argument3; if (O) draw_primitive_begin(pr_linestrip); else draw_primitive_begin(pr_trianglestrip);
draw_vertex(X, Y); draw_vertex(X+(D/2), Y+(D/2)); draw_vertex(X, Y+D); draw_vertex(X-(D/2), Y+(D/2)); draw_vertex(X, Y); draw_primitive_end(); et même draw_primitive_begin(O*pr_linestrip + (!O)*pr_trianglestrip); |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 14:12 | |
| J'étais pas sûr de pouvoir le mettre :p |
|
| |
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 15:56 | |
| D-z : Ouais, mais à trop réduire, on fait un draw_vertex() en trop dans un des deux cas, hein. Ce sont ne sont pas exactement les mêmes qui sont utilisés les deux fois^^"
Et puis bon, onilink_, c'est cool, mais niveau lisibilité, c'est pas tout à fait ça non plus x) |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 16:10 | |
| Fin l'important c'est pas les begin et les end, c'est ce qu'il y a au milieu. Sinon Mass normalement ça sert a rien ouai, on perd même des perfs avec création/destructions de variables locales au script supplémentaires. |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 16:31 | |
| Bonjour à tous. - Citation :
- Lorsqu'on utilise un booléen, un if sera toujours plus intéressant à utiliser qu'un switch
On gagne des performances sur un if au lieu d'un switch? Car personnellement j'utilise plus souvent des switch que des IF, je trouve ça plus clair. - Citation :
- [...] draw_vertex() [...] Ce sont ne sont pas exactement les mêmes qui sont utilisés les deux fois^^"
Yep d'où le fait que je divise le tout en deux. Si je ne me trompe pas on ne perd pas de performances car le pc ne lit pas es fausses conditions? - Citation :
- draw_primitive_begin(O*pr_linestrip + (!O)*pr_trianglestrip);
Oulà c'est moche ça A part gagner une ligne de code ça sert réellement à quelque chose? - Citation :
- on perd même des perfs avec création/destructions de variables locales au script supplémentaires
Je valide mais c'est quand même beaucoup plus lisible. On perd vraiment beaucoup de performances ? NB: Ce ne sont en aucun cas des affirmations mais des questions. (sauf pour la ligne moche de onilink_ ) |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 16:38 | |
| Pour tous les trucs énoncés les pertes de perfs sont minimes. Tu ne les sentirais qui si tu utilisais ton script énormément de fois (comme dans un double loop for quoi). Sinon bof, le truc en une ligne je trouve ça compréhensible, j'ai déjà vu pire dans certains codes sources :p |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 17:06 | |
| Pour tout ceux qui aime l'optimisation voici ce que ça donne une fois compacté. - Code:
-
draw_primitive_begin(argument3*pr_linestrip + (!argument3)*pr_trianglestrip); draw_vertex(argument0, argument1); draw_vertex(argument0+(argument2/2), argument1+(argument2/2)); if (argument3) draw_vertex(argument0, argument1+argument2); draw_vertex(argument0-(argument2/2), argument1+(argument2/2)); if (argument3) draw_vertex(argument0, argument1); else draw_vertex(argument0, argument1+argument2); draw_primitive_end(); J'ai voulus remplacer - Code:
-
if (argument3) draw_vertex(argument0, argument1); else draw_vertex(argument0, argument1+argument2); par - Code:
-
argument3 ? draw_vertex(argument0, argument1) : draw_vertex(argument0, argument1+argument2); Mais ça ne fonctionne pas. C'est quoi la bonne syntaxe en GML? |
|
| |
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 17:50 | |
| L'opérateur ternaire n'existe simplement pas sous GM. Tu es obligé d'utiliser une condition banale. |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 18:01 | |
| Un jour j'ai pété mon cable parce qu'une loop for ne fonctionnais pas. En fait j'avais mis i++ x)
Et oui, yoyogames on beau nous sortir des version de GM a 200$, sont pas capable d'ajouter quelques opérateurs et enrichir le gml... |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: draw_losange Dim 2 Oct 2011 - 18:13 | |
| - Citation :
- L'opérateur ternaire n'existe simplement pas sous GM
Ça explique que toutes les syntaxes que j'ai essayé ne fonctionnait pas ... - Citation :
- Un jour j'ai pété mon cable parce qu'une loop for ne fonctionnais pas.
En fait j'avais mis i++ x) J'ai fait exactement la même chose x) Bon bha je pense que je ne peut pas réduire plus le code. Je réédite mon post avec une version jolie et une version optimisé. |
|
| |
Contenu sponsorisé
| Sujet: Re: draw_losange | |
| |
|
| |
| draw_losange | |
|