AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [Résolu] Problème avec une boucle.

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: [Résolu] Problème avec une boucle.   Dim 11 Jan 2015 - 15:37

Bonjour !

Voilà, je ne suis vraiment rouillé en programmation ayant commencer a l'époque avec le php non orienté objet et n'ayant pas vraiment approfondie au della, j'ai parfois assez de mal avec certain concept simple.

Mon problème est probablement simple à régler, mais ça fait 3 jours que je teste tout ce qui me passe par la tête sans résultat.

En gros, j'utilise la librairie grid ( https://marketplace.yoyogames.com/assets/349/grids ) pour générer une grille facilement modifiable pour mon jeu de gestion/construction (imaginez prison architect mais en vraiment simplifié). La création de la grille ne pose pas de problème et j'arrive facilement à faire spawner des instances dans la grille.


Mon problème est le suivant, je veux spawner plusieurs instances grâce a une sélection de la souris, mais je n’y arrive pas, ma boucle do est infinie. J'aurais aimé utiliser les variables xi et yi, mais apparemment rien n'y fait, la boucle ne s'arrête pas.

Mon code est le suivant :

Code:
if (mouse_check_button_pressed(mb_left))
    {
    //si le joueur pressen le boutton de la souris on enregistre les choordonnées.
         mouse_position_pressed = gl_mouse_get_position();
         grid_point_pressed = gl_map_world2grid(map, mouse_position_pressed);
         world_point_pressed = gl_map_grid2world(map, grid_point_pressed);
    }
    
if (mouse_check_button_released(mb_left))
    {
    //Et on enregistre quand il relache le clic
         mouse_position_released = gl_mouse_get_position();
         grid_point_released = gl_map_world2grid(map, mouse_position_released);
         world_point_released = gl_map_grid2world(map, grid_point_released);
            
            //On calcule pour la boucle
             createGridX = grid_point_released[0] - grid_point_pressed[0];
             createGridY = grid_point_released[1] - grid_point_pressed[1];
             show_debug_message("createGridX");
             show_debug_message(createGridX);
             show_debug_message("createGridY");
             show_debug_message(createGridY);
            
             //on initialise les variable de la boucle while
             wx = grid_point_pressed[0]
             wy = grid_point_pressed[1]
            
            //on commence la boucle qui spawnera les instance
            for(xi = createGridX ; xi != 0 ; xi-=1)
                {
                    
                    
                    //dexième boucle pour les y
                    for(yi = createGridY ; yi != 0 ; yi-=1)
                        {
                            
                             vector_add = gl_vector_create(xi, yi);
                                //on initialise les boucle pour les coordonnée réelle de l'instance
                                    do
                                        {
                                            
                                            gridPos[0] = wx
                                            wx +=1
                                            
                                            gridPos[1] = wy
                                            wy +=1
                                            
                                            show_debug_message("gridpos");
                                            show_debug_message(gridPos);
                                            gridxy = gl_map_grid2world(map, gridPos);
                                            gl_grid_set(grid, vector_add, gl_instance_create(gridxy, obj_recTest));
                                                
                                        }
                                    until(gridPos[0] = xi)
                            
                        }
                }

    }
    //A revoir :
    //La boucle est mauvaise. Si le coté x est plus petit le coté y ne se finit pas
    //Aussi, la zone est décalé d'un carré a cause de la boucle

Y a t'il un moyen simple pour régler ce problème ?
Merci d'avance pour vote aide !
Revenir en haut Aller en bas
http://www.eppions.info/blog/
hofmeister
Bavard


Messages : 109

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 14:54

Bonjour, je n'ai pas bien compris ce que tu cherches à faire (plein de fonctions que je ne connais pas),
mais wx et wy devraient peut-être être réinitialisés avant la boucle do, parce que là, ils sont incrémentés
à chaque boucle xi et yi et finissent sans doute par dépasser la largeur de la sélection.
Revenir en haut Aller en bas
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 16:26

Merci pour la réponse !

En fait ce que je veux faire est relativement simple sur le papier.

Quand le joueur fait un glissé de la souris, je veux créer une "zone" rectangle constituée de plusieurs instances alignées sur une grille.

comme ça : http://i.imgur.com/sZZAtVY.jpg

Actuellement, après avoir supprimé la boucle do j'ai ce genre de choses : http://i.imgur.com/WqG36QL.jpg

La fonction qui sert à la création d'instance fonctionne parfaitement, les instances sont bien alignées sur une grille et le nombre d’instances est également correct, mais pas dans le bon ordre.
J'en conclus donc que j'ai un problème avec mes boucles et mes notions de programmation sont bien trop rouillées pour que j'arrive à le résoudre par moi même...

Voici mon code actuel :
Code:

if (mouse_check_button_pressed(mb_left))
    {
    //si le joueur pressen le boutton de la souris on enregistre les choordonnées.
         mouse_position_pressed = gl_mouse_get_position();
         grid_point_pressed = gl_map_world2grid(map, mouse_position_pressed);
         world_point_pressed = gl_map_grid2world(map, grid_point_pressed);
    }
    
if (mouse_check_button_released(mb_left))
    {
    //Et on enregistre quand il relache le clic
         mouse_position_released = gl_mouse_get_position();
         grid_point_released = gl_map_world2grid(map, mouse_position_released);
         world_point_released = gl_map_grid2world(map, grid_point_released);
            
            //On calcule pour la boucle
             createGridX = grid_point_released[0] - grid_point_pressed[0];
             createGridY = grid_point_released[1] - grid_point_pressed[1];
             show_debug_message("createGridX");
             show_debug_message(createGridX);
             show_debug_message("createGridY");
             show_debug_message(createGridY);
            
             //on initialise les variable de la boucle while
             wx = grid_point_pressed[0]
             wy = grid_point_pressed[1]
            
            //on commence la boucle qui spawnera les instance
            for(xi = createGridX ; xi != 0 ; xi-=1)
                {
                    
                    
                    //dexième boucle pour les y
                    for(yi = createGridY ; yi != 0 ; yi-=1)
                        {
                            
                             vector_add = gl_vector_create(xi, yi);

                                            gridPos[0] = wx
                                            wx +=1
                                            
                                            gridPos[1] = wy
                                            wy +=1
                                            
                                            show_debug_message("gridpos");
                                            show_debug_message(gridPos);
                                            gridxy = gl_map_grid2world(map, gridPos);
                                            gl_grid_set(grid, vector_add, gl_instance_create(gridxy, obj_recTest));
                            
                        }
                }

    }

Les fonctions proviennent de l'extension grid et ne servent qu'a facilitées la création ainsi que la modification d'une grille dans mon jeu.
Ce qui déconne vraiment ici c'est la boucle...
Revenir en haut Aller en bas
http://www.eppions.info/blog/
hofmeister
Bavard


Messages : 109

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 16:37

De rien!
Oui, la boucle semble nécessaire mais je pense qu'il faut réinitialiser les variables wx et wy, juste avant la boucle do.
réécrire donc:
Code:
wx = grid_point_pressed[0]
wy = grid_point_pressed[1]
do{...}
Enfin je crois.
Revenir en haut Aller en bas
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 16:46

Malheureusement, la boucle est toujours infinie.
Le until n'a pas l'air de fonctionner.
Revenir en haut Aller en bas
http://www.eppions.info/blog/
hofmeister
Bavard


Messages : 109

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 17:33

La deuxième image pose les instances sélectionnées comme dans l'image 1?
Si c'est le cas il faudrait à nouveau supprimer la boucle do mais modifier wx dans la boucle xi, pas dans la boucle yi.
Sinon j'ai l'impression qu'une sélection de droite à gauche ferait planter le programme, ça donnerait une distance négative je crois,
il faudrait utiliser des valeurs absolues.
Bon courage!
Revenir en haut Aller en bas
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 18:08

Merci beaucoup pour l'aide.

Alors cette fois après avoir modifié mon code de la sorte :

Code:
            //on initialise les variable de la boucle while
             wx = grid_point_pressed[0]
             wy = grid_point_pressed[1]
            
            //on commence la boucle qui spawnera les instance
            for(xi = createGridX ; xi != 0 ; xi-=1)
                {
                    gridPos[0] = wx
                    wx +=1
                                            
                    //dexième boucle pour les y
                    for(yi = createGridY ; yi != 0 ; yi-=1)
                        {
                            
                            gridPos[1] = wy
                            wy +=1
                            
                             vector_add = gl_vector_create(xi, yi);
                                            
                                            show_debug_message("gridpos");
                                            show_debug_message(gridPos);
                                            gridxy = gl_map_grid2world(map, gridPos);
                                            gl_grid_set(grid, vector_add, gl_instance_create(gridxy, obj_recTest));

                                    
                        }
                }
Ca me donne ce genre de chose lorsque j'essaie de tracer une zone de 3*3. Non seulement les instances ne sont pas alignées, mais en plus je n'ai plus le bon compte, il en manque une en x et y.

http://i.imgur.com/PqBXqng.jpg

Le programme plante effectivement lorsque j'essaie de faire une sélection, de droite à gauche qu'est-ce que tu entends quand tu parles de valeur absolue ? j'ai du mal a visualisé comme régler ce problème :/
Revenir en haut Aller en bas
http://www.eppions.info/blog/
Kabcorp
Utilisateur confirmé: Rang **
avatar

Messages : 315
Localisation : Savoie
Projet Actuel : trop...

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 18:18

En super simple;

Objet=instance_create(mouse_x,mouse_y,obj_monobjet);
with(Object){move_snap(32,32);}

Non? Ou alors j'ai pas compris =)

_________________
Vous voulez un jeu pas comme les autres? Voici DeFRaG :
 
Revenir en haut Aller en bas
http://kabcorp.fr
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 18:26

kab a écrit:
En super simple;

Objet=instance_create(mouse_x,mouse_y,obj_monobjet);
with(Object){move_snap(32,32);}

Non? Ou alors j'ai pas compris =)

Non, ça, c'est facile. Moi je veux plusieurs instances qui spawn dans la zone de sélection de ma souris.

Pour compliquer les choses, j'utilise une extension qui facilite l'utilisation d'une grille, mais complique un peu les choses quand il s'agit de manipuler des objets.

Regardes les screens, je pense qu'ils sont plus parlant que mes explications Wink
Revenir en haut Aller en bas
http://www.eppions.info/blog/
hofmeister
Bavard


Messages : 109

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 19:10

Bon j'espère que je vais pas encore raconter des bêtises...
Il fallait pas déplacer wx,finalement.
Code:
for(xi = createGridX ; xi != 0 ; xi-=1)
   {
   //dexième boucle pour les y
   for(yi = createGridY ; yi != 0 ; yi-=1)
       {
        gridPos[0]=wx+xi
        gridPos[1] =wy+yi
Il faut aussi que xi et wx soient de même type, cad si wx est une position en pixels, il faut convertir xi en pixels en le multipliant par
la largeur d'une case en pixels.
Sinon pour la sélection de droite à gauche, il faudrait utiliser abs(x):
Code:
createGridX=abs(coordClicx-coordReleasex)
createGridY=abs(coordClicy-coordReleasey)
Je sais plus les noms exacts des variables. Comme ça, la valeur retenue est toujours positive et correspond à la différence
des deux nombres.
Revenir en haut Aller en bas
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Lun 12 Jan 2015 - 21:57

Wow, ça marche presque, merci beaucoup !

Maintenant j'ai deux autres soucis :

il manque une rangé en x et en y (quand j'essaie de tracer un carré de 3*3 je me retrouve avec un carré de 2*2 ) probablement parce que la boucle soustrait 1 à xi et yi. Y a t'il a moyen de régler ça ?

Quand j'utilise des valeurs absolues, la zone ne se crée pas au bon endroit. en gros ça donne ça : http://i.imgur.com/QdAzMkq.jpg


En tout cas, merci encore pour l'aide, tu m'as permis de bien avancer !
Revenir en haut Aller en bas
http://www.eppions.info/blog/
glcraft
Utilisateur confirmé: Rang *****
avatar

Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

MessageSujet: Re: [Résolu] Problème avec une boucle.   Mar 13 Jan 2015 - 1:02

pour le premier probleme, est ce que xi et yi ne devrai pas passer par 0 avant de quitter la boucle for ?
si c'est le cas, la condition n'est pas xi!=0 mais xi>=0 ou xi!=-1
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Mar 13 Jan 2015 - 1:09

Ah oui effectivement, c'est bien la solution, merci !
Revenir en haut Aller en bas
http://www.eppions.info/blog/
hofmeister
Bavard


Messages : 109

MessageSujet: Re: [Résolu] Problème avec une boucle.   Mar 13 Jan 2015 - 9:47

Sinon, pour faire la sélection dans n'importe quel sens:
Code:
wx=grid_point_pressed[0]
wy=grid_point_pressed[1]
if (grid_point_released[0]-grid_point_pressed[0]<0{wx-=createGridX;}
if (grid_point_released[1]-grid_point_pressed[1]<0{wy-=createGridY;}
Revenir en haut Aller en bas
Saito Gray
Débutant
avatar

Messages : 10

MessageSujet: Re: [Résolu] Problème avec une boucle.   Mar 13 Jan 2015 - 12:04

Ça marche parfaitement !

Je vais maintenant faire un petit stage intensif de code, histoire de me mettre à jour et de reprendre les bonnes pratiques avant de continuer le jeu...

Quoi qu'il en soit, merci beaucoup, vous m'aviez évité des heures de migraine !
Revenir en haut Aller en bas
http://www.eppions.info/blog/
Contenu sponsorisé




MessageSujet: Re: [Résolu] Problème avec une boucle.   

Revenir en haut Aller en bas
 
[Résolu] Problème avec une boucle.
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [résolu] Problème avec fichiers BKH
» [résolu]Problème avec Dictionnaire des Lieux
» problème avec une attache de ma poussette
» Problème avec placenta et cicatrice de césarienne !
» problème avec alice and jo

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: