| Créer instance aléatoirement sauf dans un mur ou dans la vue. | |
|
|
Auteur | Message |
---|
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 1:29 | |
| Bonjour à tous! Je fais actuellement un TDS survival (oui je sais, comme tout le monde, c'est surtout un exercice), et je suis confronté à un petit problème. Pour faire spawn les monstres, j'utilise un objet qu'on va appeler obj_controller. Pour l'instant j'arrive à créer des instances en dehors des murs en utilisant une petite feinte mais je ne pense pas que ce soit vraiment optimisé. dans le create event de obj_controller : (sous certaines conditions) - Code:
-
instance_create(random(room_width),random(room_height),obj_enemy); dans le create event de obj_enemy : - Code:
-
if (!place_free(x,y)){ instance_create(random(room_width), random(room_height), obj_enemy); instance_destroy(); }
De cette façon, je crée une instance aléatoirement dans la room, si elle est crée sur un mur, l'instance en question en crée une autre à un endroit différent avant de s'auto détruire. J'aimerais savoir si il existe un moyen plus malin d'arriver au même résultat, mais je voudrais aussi que les ennemies spawn à un endroit aléatoire en dehors de la view afin d'éviter qu'ils pop directement sur le joueur (et pour donner l'illusion qu'ils viennent de loin). Si vous le désirez vous pouvez trouver le GMZ ICI (fait avec GM : S). Dans cette version il y a des bouts de code inutiles que j'ai viré, n'y faites pas attention. Merci d'avance pour l'aide que vous pourrez m'apporter. |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 2:38 | |
| Plutôt que de s'embêter à s les répartir sur les bords de l'écran, il est plus simple (et plus logique) de spawner les ennemis sur un cercle centré sur le joueur. Donc un angle tiré au hasard, et un peu de trigo avec un rayon légèrement supérieur à la demi-diagonale de l'écran. |
|
| |
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 3:42 | |
| Merci de ta réponse. Ce que tu dis est plein de sens. Par contre, j'ai un peu avancé sur le jeu et j'utilise une caméra dynamique (elle suit la souris tant que le joueur est encore à l'écran), et de ce fait, j'ai peur que les instances continuent de se créer à la vue du joueur. Enfin je me dis aussi qu'il suffirait d'agrandir encore le rayon du cercle pour régler le problème, mais même si je saisis le concept (créer une instance à un endroit aléatoire entre le bord de la room et une certaine distance du joueur), je suis incapable de mettre ça sous forme de code (non seulement je début en GML mais je suis pas très bon en maths ^^). Sais tu si la technique que j'utilise pour éviter que les monstres ne pop dans les murs est correcte ? Je n'aime pas créer des instances pour rien, surtout dans un jeu dans lequel il y aura déjà énormément d'instances. Edit : Ok, j'ai réussi à atteindre le résultat en trichant encore une fois avec le create event de obj_enemy : - Code:
-
if (!place_free(x,y)) or distance_to_object(obj_player) < 350{ instance_create(random(room_width), random(room_height), obj_enemy); instance_destroy(); }
mais ça fait encore plus d'instance créées pour rien, pour l'instant je n'ai pas noté de baisses de frame rate mais je cherche toujours à connaitre une façon plus optimale de procéder ! Edit 2 : Et voilà, je viens d'avoir mon premier crash ^^ |
|
| |
marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 8:15 | |
| |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 9:43 | |
| - Code:
-
oldmask = mask_index mask_index = sprite0 r = 300 do { a = random(360) xx = x+lengthdir_x(r, a) yy = y+lengthdir_y(r, a) } until (place_free(xx, yy)) instance_create(xx, yy, object) mask_index = oldmask Il faut donc mettre le mask de l'objet a créer pour que le place_free fonctionne correctement, chercher un angle ou la position est libre, et si on trouve on crée l'instance. On restaure ensuite le mask de l'objet. Par contre attention, dans ce cas s'il n'y a pas de position libre tu te retrouveras avec une boucle infinis. Tu peut soit créer une variable qui compte le nombre d'itérations, et si elle dépasse une limite tu break ta boucle et ne crée pas d'instance, ou tu peut aussi mettre ce code dans un step sans boucle, et il s'exécuteras une fois par step (donc aucune chance de freeze). |
|
| |
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 11:39 | |
| Merci pour vos réponses, J'ai tenté avec ton code onilink_, je dois me planter quelque part. Pour expliquer un peu le contexte, j'utilise un objet pour contrôler le spawn des ennemis. Comme c'est un survival, j'utilise une alarme avec une variable pour augmenter la puissance de chaque vague. A la base, ça ressemble à ça : j'initialise les variables dans le create event: - Code:
-
pop_lvl = 1 alarm[0] = room_speed*5 alarm[1] = room_speed*30
ensuite j'utilise l'alarme 0 pour gérer les spawn de monstre et l'alarme 1 pour les bonus (qui fonctionnent sur le même principe que les mobs) alaram[0] : - Code:
-
if pop_lvl <= 5 { repeat(pop_lvl*3) instance_create(random(room_width),random(room_height),obj_enemy0); pop_lvl += 1; } if pop_lvl > 5 && pop_lvl <= 15 { repeat(pop_lvl/2) instance_create(random(room_width),random(room_height),obj_enemy0); repeat(pop_lvl/2) instance_create(random(room_width),random(room_height),obj_enemy1); pop_lvl += 1; } if pop_lvl > 15 { repeat(pop_lvl/4) instance_create(random(room_width),random(room_height),obj_enemy0); repeat(pop_lvl/4) instance_create(random(room_width),random(room_height),obj_enemy1); repeat(pop_lvl/4) instance_create(random(room_width),random(room_height),obj_enemy2); pop_lvl += 1; } alarm[0] = room_speed*15;
Du coup, j'ai tenté d'y mettre ton code à la place de la ligne de création de la première vague en remplaçant sprite0 par le sprite de mon objet à créer et en mettant la bonne instance à créer et ... j'ai pu observer quelques pops de façon complètement anarchique à l'intérieur de la view (voir pas du tout de pop sur certaines vagues), mais je pense que c'est moi qui n'ai pas pigé quelque chose ! |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 13:00 | |
| Le code que je t'ai passé crée des objets autour de celui ou est le code est si la place est libre. Donc c'est pas vraiment la même chose. Pour le comprendre tu peut créer un nouveau projet avec deux objets seulement et faire des tests |
|
| |
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 14:12 | |
| Ok, je comprends mieux !
J'ai effectivement placé ce code dans le step event de mon obj_player (en retirant complètement l'obj_controller) et ça fonctionne très bien, merci beaucoup ! |
|
| |
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 14:32 | |
| Ok alors une dernière question, j'approche de mon but ! J'ai réussi à transposer ce code dans mon obj_controller afin de pouvoir gérer tout depuis le même objet, simplement en utilisant with obj_player. Ca fait encore un paquet de code dans cette section que je suis censé souvent modifier pour équilibrer les vagues, donc je me suis dit que je devrais en faire un script et l'appeler quand j'en ai besoin. Seulement, je crois que je n'ai pas saisi comment fonctionnent les arguments (j'avais lu un tuto là dessus mais je ne le trouve plus), du coup j'ai tenté au feeling, mais ça ne fonctionne pas. scr_pop : - Code:
-
with obj_player { oldmask = mask_index mask_index = argument0 r = 300 do { a = random(360) xx = x+lengthdir_x(r, a) yy = y+lengthdir_y(r, a) } until (place_free(xx, yy)) instance_create(xx, yy, argument1) mask_index = oldmask }
Je pensais qu'en tapant ça, il me suffirait de taper scr_pop(spr_enemy1, obj_enemy1); pour avoir le même effet que quand je tape manuellement le code, mais visiblement c'est pas comme ça que ça marche ^^ |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 15:01 | |
| |
|
| |
PixOut Nouveau
Messages : 9 Localisation : Paris
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. Dim 10 Mar 2013 - 15:03 | |
| Merci ! Edit : J'avais donc bien compris, j'ai du faire une erreur quelque part ... quoi qu'il en soit, j'ai toutes les clés en main pour me débrouiller tout seul maintenant, je vous embête plus |
|
| |
Contenu sponsorisé
| Sujet: Re: Créer instance aléatoirement sauf dans un mur ou dans la vue. | |
| |
|
| |
| Créer instance aléatoirement sauf dans un mur ou dans la vue. | |
|