AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
-55%
Le deal à ne pas rater :
Friteuse sans huile – PHILIPS – Airfryer HD9200/90 Série 3000
49.99 € 109.99 €
Voir le deal

 

 Créer instance aléatoirement sauf dans un mur ou dans la vue.

Aller en bas 
4 participants
AuteurMessage
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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.
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
D-z


Messages : 1611
Localisation : Montpellier

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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.
Revenir en haut Aller en bas
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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 ^^
Revenir en haut Aller en bas
marty
Utilisateur confirmé: Rang ***
marty


Messages : 697
Projet Actuel : laby-ereinte !

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 10 Mar 2013 - 8:15

salut,
recherche d'abord une position aléatoire
vérifie quelle est libre
ensuite créer l'objet

il faut utiliser une boucle

https://cbna.forumactif.com/t10923-apprendre-le-gml-4-les-boucles?highlight=boucles

happy1

Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9183
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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).
Revenir en haut Aller en bas
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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 !
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9183
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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 Wink
Revenir en haut Aller en bas
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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 !
Revenir en haut Aller en bas
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 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 ^^
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9183
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 10 Mar 2013 - 15:01

Revenir en haut Aller en bas
PixOut
Nouveau



Messages : 9
Localisation : Paris

Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. EmptyDim 10 Mar 2013 - 15:03

Merci ! Smile

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 Smile
Revenir en haut Aller en bas
Contenu sponsorisé





Créer instance aléatoirement sauf dans un mur ou dans la vue. Empty
MessageSujet: 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. Empty

Revenir en haut Aller en bas
 
Créer instance aléatoirement sauf dans un mur ou dans la vue.
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Creer un object dans une timeline
» comment créer un viseur dans un jeu vu de haut ?
» [Résolu]-Créer un objet de nom contenu dans une chaîne
» suppression d'objets sauf un
» Choisir aléatoirement une action

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide débutants-
Sauter vers: