Trouver node dans grille

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Trouver node dans grille

Message par blix » 25 Avr 2020 00:55

Hello,
petite question bête
ce que j'ai trouvé fonctionne mais je suis sûr que c'est pas optimisé (noob inside)

J'ai une grille de node,
je cherche à trouver le premier node d'une colonne avec une variable false.
Je commence par le haut et je descend jusqu’à trouver ce node

Comment faire au mieux?

Mon code moisi :
(je retourne deux fois n, je pense qu'il y a un problème...)

c > la colonne dans laquelle je cherche
maxY > hauteur en node de ma colonne
n > le node que je cherche (le premier qui n'est pas isEmpty)

Code : Tout sélectionner

       Node GetNodeFromColumn(int c)
        {
            Node n = new Node();
            for (int y = maxY - 1; y > 0; y--)
            {
                n = grid[c, y];
                if (!n.isEmpty)
                {
                    return n;
                }
            }
            return n;
        }
Dernière édition par blix le 25 Avr 2020 11:30, édité 1 fois.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Trouver node dans grille

Message par EmileF » 25 Avr 2020 08:04

Salut
A mon avis ton code est nickel
Attention, le dernier node en bas n'est jamais visité. Pour cela il aurait fallu que tu mettes dans la ligne for: y >= 0 ou y > -1
Et c'est normal que tu retournes 2 fois n. En fait tu n'en retournes qu'un, dans la boucle for si tu en trouves un ou à la fin si tu n'as rien trouvé
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Re: Trouver node dans grille

Message par blix » 25 Avr 2020 11:13

Ah! merci beaucoup EmileF,

Je trouvais inutile le dernier return,
mais j'avais un message erreur quand je l'enlevais :-D
je comprends mieux.

J'avais essayé avec des break, des continue, en mode if (true)...
je n'ai pas encore bien assimilé le principe.
(même avec des tutos sous les yeux)

Et merci pour le >= effectivement il manquait un node :gene:

Merci encore,
blix

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Trouver node dans grille

Message par jmhoubre » 25 Avr 2020 14:00

Bonjour,
le return au sein de ton if sort de la fonction, qui "oublie" donc toutes les variables locales, comme n et i.
Continue et break sortent de la boucle en cours, ici c'est la boucle for (i ...).
Enfin, je pense que tu testes ton retour de fonction, afin de savoir si le node renvoyé est vide (cas du second return) ou non vide (cas du premier return).
Dernière édition par jmhoubre le 26 Avr 2020 00:22, édité 2 fois.

Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Re: Trouver node dans grille

Message par blix » 25 Avr 2020 20:38

Ok, merci pour les précisions!

Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Re: Trouver node dans grille

Message par blix » 29 Avr 2020 16:56

Hello,
nouvelle question un peu différente,
j'hésitais à ouvrir un nouveau post, mais c'est dans la continuité de cette dernière,
cela évitera de spammer le forum...

Je suis face à un mystère, cela me semble pourtant très simple :

J'ai une class GameManager où est défini dans start un point de spawn sur l'axe X
J'ai une fonction dans la class Unit pour placer les unités sur l'axe x,
en partant du point de spawn du GameManager mais espacées par 20 x (numéro de l'unité / count)

Le point de spawn du GameManager est censé être fixe, ne subit aucune opération,
et pourtant sa valeur est modifiée quand je l'observe avec un debug.log !
et si je mets en commentaire "spawn_node_temp.x += (20 * count);" elle n'est plus modifiée...

J'ai passé qlq heures dessus, mais je dois faire une erreur grossière.

Code : Tout sélectionner

void PlaceOnNodeSpawn(int count)
        {
            Node spawn_node_temp = game_manager.spawn_node;
            spawn_node_temp.x += (20 * count);

            node_current = spawn_node_temp ;
            transform.position = game_manager.GetWorldPosFromNode(node_current.x, node_current.y);
        }

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Trouver node dans grille

Message par EmileF » 29 Avr 2020 19:39

Salut,

Code : Tout sélectionner

Node spawn_node_temp = game_manager.spawn_node;
spawn_node_temp.x += (20 * count);
C'est comme si tu faisais

Code : Tout sélectionner

game_manager.spawn_node.x += (20 * count);
en fait tu changes la variable game_manager.spawn_node au travers de la variable spawn_node_temp.

pour résoudre ton problème il faut faire
si c'est un Vector3

Code : Tout sélectionner

Node spawn_node_temp = game_manager.spawn_node + new Vector3(20 * count, 0, 0);
ou un Vector2

Code : Tout sélectionner

Node spawn_node_temp = game_manager.spawn_node + new Vector2(20 * count, 0);
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Re: Trouver node dans grille

Message par blix » 29 Avr 2020 21:42

Purée Émile, encore merci !
J'ai fait la correction, ça fonctionne.

Par contre ta réponse me perturbe, je ne comprends pas bien la logique.
Comment se fait-il que l'information remonte dans game_manager.spawn_node
Y'a vraiment un concept de base que je ne dois pas bien saisir.

l'information ne va pas uniquement dans ce sens ??

Code : Tout sélectionner

                    <<<
Node spawn_node_temp = game_manager.spawn_node;

Au final j'ai procédé de la sorte : (node est une class)
Je veux bien que tu me dise si c'est ok :)
car je suis dans une phase ou j'essaye de comprendre certain concept,
et d'avoir un code bien structuré, simple et sans redondance.

Code : Tout sélectionner

    public class Node
    {
        public int x;
        public int y;
        public bool isEmpty;
        public int material;
    }
(j'ai mis la variable node_spawn_temp en local...)

Code : Tout sélectionner

        void PlaceOnNodeSpawn(int count)
        {
            Node node_spawn_temp = new Node();

            node_spawn_temp.x = game_manager.spawn_node.x + (count * 20);
            node_spawn_temp.y = game_manager.spawn_node.y;

            node_current = node_spawn_temp;
            transform.position = game_manager.GetWorldPosFromNode(node_current.x, node_current.y);
        }

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Trouver node dans grille

Message par jmhoubre » 29 Avr 2020 21:53

Voir ce tuto :
https://www.youtube.com/watch?v=KGFAnwkO0Pk

En gros :
- il y a 2 types de variables : type valeur (comme un int ou un float) et type référence (class, array ...)
- les types valeur stockent leurs données, tandis que les types référence stocke une référence vers leurs données.

Ton node est une classe, donc type référence. Si tu fais

Code : Tout sélectionner

Node A = new Node();
Node B;
B = A;
B et A pointent vers le même emplacement de la mémoire. Si tu changes une valeur d'un membre de A, tu changes également cette valeur dans B.
Essaies ceci :

Code : Tout sélectionner

	// Type valeur : a ne change pas quand on modifie b
        int a = 5;
        int b = a;
        print (a);
        b = 6;
        print (a);
        
        // Type référence : arrayA  est modifié quand on modifie arrayB 
        int [] arrayA = { 1, 2 };
        int [] arrayB = arrayA;
        print (arrayA[1]);
        arrayB [1] = 123456789;
        print (arrayA[1]);
Dernière édition par jmhoubre le 29 Avr 2020 22:12, édité 2 fois.

Avatar de l’utilisateur
blix
Messages : 27
Inscription : 15 Nov 2015 17:30

Re: Trouver node dans grille

Message par blix » 29 Avr 2020 22:05

Cool, merci jmhoubre,
je vais regarder ça.

[EDIT] ok, merci pour l'explication!
c'est encore derrière un voile, mais je commence à entrevoir qlq chose :mrgreen:
Je vais potasser le sujet.

Répondre

Revenir vers « Scripting »