| Système d'ombre basique [Résolu] | |
|
|
|
Auteur | Message |
---|
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 14:29 | |
| Bonjour, J'ai voulus créer des ombres très basique pour mon projet et donc j'ai utiliser comme script : - Code:
-
// Distance entre l'ombre et l'objet var distance = argument0;
if ( instance_exists(obj_light) and collision_circle(x,y,64,obj_player,false,false) ) { // } else { if last_key == 4 draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, 1, -1, image_angle, c_black, global.shawlpha); else draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, global.shawlpha); draw_self(); }
Donc il fonctionne bien mais j'aimerais encore l'améliorer, en effet le script superpose les ombres, or ça ne fait pas très beau, quelqu'un sait comment remédier au problème ? J'ai déjà essayé avec les surfaces mais ça consomme beaucoup trop de ressources :s Merci
Dernière édition par Mamie Wawa le Sam 6 Sep 2014 - 17:34, édité 1 fois |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 16:14 | |
| Il faudrait en bref que tu dessine les ombres sur une surface avec l'alpha 1, mais que tu dessine la surface avec une alpha style 0.3. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 16:50 | |
| J'ai essayé de faire ça dans le script: - Code:
-
draw_set_alpha(1); shadow = surface_create(sprite_width,sprite_height); surface_set_target(shadow); draw_clear_alpha(c_black,1);
surface_set_target(shadow); draw_clear(c_black); draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, 0.4); surface_reset_target(); Mais ça ne fonctionne pas - Code:
-
############################################################################################ ERROR in action number 1 of Draw Event for object obj_player:
Invalid surface dimensions at gml_Script_scr_shadow (line 20) - shadow = surface_create(sprite_width,sprite_height); ############################################################################################ -------------------------------------------------------------------------------------------- stack frame is gml_Script_scr_shadow (line 20) called from - gml_Object_obj_player_DrawEvent_1 (line 11) - scr_shadow(8);
Ça me dit dimensions invalide mais pourtant sprite_width et sprite_height retourne bien les dimensions du sprite non ? Pourquoi ça ne marcherait pas ? |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 17:31 | |
| Oulala tu es complètement à côté de la plaque ^^' Tu as essayé de reproduire le comportement normal du draw mais avec une surface, c'est bien pire ^^' Essaie plutôt : - Code:
-
// Event room create d'un objet control globalvar srf_shadow; srf_shadow = surface_create(view_wview[0], view_hview[0]);
// Event draw de l'objet controlleur surface_draw_ext(view_xview[0], view_yview[0], 1, 1, 0, c_black, 0.3); // pas sûr des args
// Event draw (Mets-y en step si ça ne marche pas!) de l'objet controlleur surface_set_target(srf_shadow); draw_clear_alpha(c_black, 0.0); surface_reset_target();
// Event room end de l'objet control surface_destroy(srf_shadow);
// Event draw (Mets-y en step si ça ne marche pas!) des objets qui doivent posséder une ombre surface_set_target(srf_shadow); draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, 0.4); surface_reset_target(); C'est un peu "dirty" mais ça devrait faire l'affaire. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 19:52 | |
| Oui niveau surface je débute juste, donc c'est un peu confus pour moi, sinon j'ai essayé ton code ( et changé 2-3 fonctions qui était mal épelé ou bien inexistant ) Et malheureusement ça me dessine aucune ombre Voici le code : Event create de mon objet controller : - Code:
-
global.srf_shadow = surface_create(640,480) draw_surface_ext(global.srf_shadow, view_xview[0], view_yview[0], 1, 1, 0, c_black, 0.3); // pas sûr des args Event draw de mon objet controller : - Code:
-
surface_set_target(global.srf_shadow); draw_clear_alpha(c_black, 0.0); surface_reset_target(); Et l'event draw de mes objets ayant une ombre : - Code:
-
var distance = argument0;
// Event draw (Mets-y en step si ça ne marche pas!) des objets qui doivent posséder une ombre surface_set_target(global.srf_shadow); draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, 0.4); surface_reset_target(); Je vais encore relire pour voir si je me suis trompé quelque part |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 20:20 | |
| Je sais pas si GM:S supporte le set target en event draw :/ essaie de passer en event step |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 20:31 | |
| Ça fonctionne pas non plus |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 20:36 | |
| L'objet controller est à quelle depth? |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 20:39 | |
| Au dessus de tout ( il fait aussi office d'hud ) Faut qu'il soit en dessous ? Aussi lorsque je switch entre fullscreen / windowed mode ça me fait un gros bordel dans le jeu Parfois les ombres se dessinent parfois, parfois pas, les objets disparaissent aussi, jpense que c'est à voir avec le controller avec sa position x,y mais je vois pas pourquoi ça ferai ça |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 22:06 | |
| Je viens de remarquer que tu as fait un truc très bizarre... Pourquoi tu essaie de draw la surface dans l'event create? Il faut la créer plutôt. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Ven 22 Aoû 2014 - 23:15 | |
| Ok j'ai juste laisser le create, mais ça change rien, les ombres n'apparaissent pas et les graphiques du jeu font un gros bug visuel quand je switch en fullscreen/windowed :/ Et au final c'est assez aléatoire, les éléments disparaissent, les ombres parfois ,parfois pas, je comprend pas trop |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Sam 23 Aoû 2014 - 9:15 | |
| C'est quoi ton code actuel?
(Au passage le switch windowed/fullscreen c'est normal ça fait sauter la surface, il faudra faire quelque chose pour la recréer) |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Sam 23 Aoû 2014 - 14:36 | |
| Au final j'ai: Event create de mon objet controller : - Code:
-
global.srf_shadow = surface_create(view_wview,view_hview) Event step de mon objet controller : - Code:
-
surface_set_target(global.srf_shadow); draw_clear_alpha(c_black, 0.0); surface_reset_target();
Et l'event draw de mes items qui possèdent une ombre : - Code:
-
var distance = argument0;
// Event draw (Mets-y en step si ça ne marche pas!) des objets qui doivent posséder une ombre surface_set_target(global.srf_shadow); draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, 0.4); surface_reset_target(); draw_self() Sinon j'ai essayé de mettre : - Code:
-
surface_reset_target(); Ou bien encore: - Code:
-
global.srf_shadow = surface_create(view_wview,view_hview) Dans l'event switch fullscreen/windowed mode mais rien n'y change |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Sam 23 Aoû 2014 - 14:40 | |
| Essaie de mettre - Code:
-
surface_set_target(global.srf_shadow); draw_sprite_ext(sprite_index, image_index, x, y+sprite_height-distance, -1, -1, image_angle, c_black, 0.4); surface_reset_target(); en step |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Sam 23 Aoû 2014 - 14:54 | |
| Tu veux dire pour le draw event des items à ombre non ? Parce que la ça dessinerai juste l'ombre du controller qui a pas de sprite Donc j'ai essayé quand même, ça a pas fonctionné :/ |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Sam 23 Aoû 2014 - 14:57 | |
| Désolé mais je sais vraiment pas comment les surfaces marchent sous gm:s :s |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Dim 24 Aoû 2014 - 18:49 | |
| Dommage, quelqu'un aurait une solution ? Les surfaces c'est pas trop mon truc, et même en lisant le manuel de game maker y a rien qui me parle pour ce que je voudrais faire |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Système d'ombre basique [Résolu] Dim 24 Aoû 2014 - 20:44 | |
| J'y connais pas grand chose niveau surface et j'ai pas étudié ton code à fond, mais moi je verrais la logique différemment : tu prend un objet spécial que tu dédie à tes ombres (ou un objet Main qui gère tout le bordel (genre hud,etc...), peu importe) et tu fais un for avec tous les objets et tu dessine leur ombre SANS utiliser de surface, en dessinant dans le buffer de base. Faut juste que ton objet est la depth la plus élevée pour qu'il affiche tout en dessous des objets. Comme dit je suis ptet à côté de la plaque et c'est pas le résultat que tu attends, si c'est le cas autant pour moi. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Dim 24 Aoû 2014 - 20:45 | |
| Ça reviendrai à la même que mon problème de base, les ombres se superposeraient, et c'est l'effet indésiré |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Système d'ombre basique [Résolu] Dim 24 Aoû 2014 - 20:53 | |
| Ouais mais je comprend pas alors, tu veux obtenir quoi avec tes surfaces ? Un truc de ce genre en partant du principe que les deux triangles sont deux ombres ? - Code:
-
a1(before) + a2 = a1(after)
################ ################ ################ ############## ############## ################ ############ ############ ################ ########## ########## ################ ######## ######## ################ ###### ###### ###### ###### #### #### #### #### ## ## ## ## Dans ce cas ce sera pas réaliste, en vrai quand t'as plusieurs sources de lumières tu peux avoir des ombres qui se chevauchent avec plusieurs degrés d'opacité. Si t'avais un schéma je pense que ce serait plus clair. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Lun 25 Aoû 2014 - 3:04 | |
| Oui comme tu l'as fais sur ton chemin, et c'est vrai aussi que ton explication sur la réalité des ombres est correcte mais c'est juste que je fais un jeu 2D, et que je peux me déplacer de bas en haut, de gauche à droite, et que certains de la map je peux passer derrière eux, ainsi ça fera une seconde couche d'ombre sur celle déjà présente de l'élément, alors que ça ne devrait pas :/
|
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 14:12 | |
| Coucou, j'ai finalement résolus ce problème d'ombre superposés ( avec les surfaces ! ) Mais maintenant j'ai un soucis qui vient de gm, je n'ai aucune idée du pourquoi du comment ; Vu que mes ombres sont censé être des ombres j'ai mis leurs depth la plus basse ( pour qu'ils soient en dessous de tous les objets du jeu ) mais quand je fais ça et que je bouge avec mon personnage il y a un décalage avec les ombres, elles bougent aussi puis reviennent à leur place une fois que j'arrête de bouger le personnage Mais quand je met la depth au dessus de tout ( mais donc les ombres se dessinent par dessus les éléments du jeu et c'est pas l'effet recherché ^^' ) là le problème est réglé, les ombres sont statiques, elles ne bougent plus Donc ça vient de la depth dont ce soucis de décalage provient, mais je ne vois pas comment le régler ( c'est vraiment étrange ) Mon code: Event create de mon objet shadow - Code:
-
/// Créer la surface shadow global.shadow = surface_create(640,480); Event end step: - Code:
-
/// Créer la surface shadow si elle n'existe pas if ( !surface_exists(global.shadow) ) { global.shadow=surface_create(view_wview,view_hview); } x = view_xview y = view_yview
- Code:
-
// Draw shadow if ( surface_exists(global.shadow) ) { draw_set_alpha(global.shawlpha) draw_surface(global.shadow,view_xview,view_yview) surface_set_target(global.shadow) draw_clear_alpha(c_black,0) surface_reset_target() } Et le script pour dessiner les ombres de mes objets: - Code:
-
if surface_exists(global.shadow) { surface_set_target(global.shadow) draw_sprite_ext(sprite_index, image_index, x-view_xview, y+sprite_height-view_yview-distance, 1, -1, image_angle, c_black, 1); surface_reset_target(); } J'ai essayé d'enlever le step event mais ça change rien au soucis, je suis bloqué à nouveau |
|
| |
GDOR1 Très bonne participation
Messages : 130
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 15:45 | |
| Dans GM, je crois que l'ordre d'exécution des objets se fait selon le depth. Donc d'après ta description, ça voudrait dire que l'objet shadow s'exécute avant l'objet qui dessine sur la surface. Donc regarde si le problème ne vient tout simplement pas du step que t'as choisi.
Quand je dessine des ombres, j'ai l'habitude de faire ça : Begin step de l'objet shadow : draw_clear_alpha(c_black,0) sur la surface. Step des autres objets : tout sauf dessiner l'ombre End step des autres objets : dessiner l'ombre |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 16:46 | |
| J'ai fais comme tu me l'as conseillé mais ça change rien, c'est toujours le même soucis J'ai même essayé après post draw/predraw, etc... soit ça m'affiche plus ombres soit ça me les affiche par dessus les objets... |
|
| |
Asu Utilisateur confirmé: Rang ****
Messages : 895
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 17:09 | |
| - GDOR1 a écrit:
- Dans GM, je crois que l'ordre d'exécution des objets se fait selon le depth.
Seulement l'event draw en fait. Les event step, etc. ne s'exécutent que selon l'id. |
|
| |
red-error Utilisateur confirmé: Rang ****
Messages : 1015 Projet Actuel :
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 17:09 | |
| ( End step se fait avant le draw http://gmc.yoyogames.com/index.php?showtopic=337904 ) Tout ce qui est affichage doit se faire dans les draws, et les déplacements hors des draws, dans les step, sinon ça marche pas. Je crois pas que t'aies mis un code de déplacement dans les draw... Donc le problème vient peut-être de la vue qui est pas mise à jour en même temps? La vue se déplace quelque part entre step et draw. Hors tu mets x = view_xview dans l'event step-> du coup tu as peut-être enregistré l'ancienne position de ta vue?
Dernière édition par red-error le Lun 1 Sep 2014 - 17:14, édité 2 fois |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 17:12 | |
| - red-error a écrit:
- ( End step se fait avant le draw
http://gmc.yoyogames.com/index.php?showtopic=337904 ) Dépend des versions de GM ça, sous 6,7 et 8, le draw se fait avant les events step. Suffit de faire un show message/error pour vérifier sous GMS sinon. |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 17:18 | |
| - red-error a écrit:
- Tout ce qui est affichage doit se faire dans les draws, et les déplacements hors des draws, dans les step, sinon ça marche pas.
Effectivement, ca serait très intelligent de la part de GM de n'exécuter les events draw uniquement des objets qui sont visible dans la view (ou ceux qu'on choisiraient, genre les objets qui dessinent tout ce qui est hud), mais c'est pas le cas... Donc t'es pas obligé de mettre les mouvements dans le step plutôt que dans le draw, meme si ca parait plus logique. |
|
| |
Mamie Wawa Très bonne participation
Messages : 112
| |
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Système d'ombre basique [Résolu] Lun 1 Sep 2014 - 17:35 | |
| Bon, j'ai vraiment lu le truc et red-error a surement raison : "Donc le problème vient peut-être de la vue qui est pas mise à jour en même temps? La vue se déplace quelque part entre step et draw. Hors tu mets x = view_xview dans l'event step-> du coup tu as peut-être enregistré l'ancienne position de ta vue?" Donc soit tu change d'event l'update, soit tu vire les options following object et tu le fais toi même au bon endroit.
Vu le nombre de problème qu'occasionne ce système d'ombres "basique", je pense que tu devrais te concentrer sur d'autres tâches plus importantes et y revenir plus tard, quand t'aura un truc déjà jouable et plus d'expérience. Outre le fait que tu pers un temps fou pour un truc dispensable, c'est le meilleur moyen de te démotiver. |
|
| |
Contenu sponsorisé
| Sujet: Re: Système d'ombre basique [Résolu] | |
| |
|
| |
| Système d'ombre basique [Résolu] | |
|