| [Résolu] Problème avec une boucle. | |
|
|
Auteur | Message |
---|
Saito Gray Débutant
Messages : 10
| Sujet: [Résolu] Problème avec une boucle. Dim 11 Jan 2015 - 16: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 ! |
|
| |
hofmeister Bavard
Messages : 109
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 15: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. |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 17: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 : https://i.imgur.com/sZZAtVY.jpgActuellement, après avoir supprimé la boucle do j'ai ce genre de choses : https://i.imgur.com/WqG36QL.jpgLa 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... |
|
| |
hofmeister Bavard
Messages : 109
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 17: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. |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 17:46 | |
| Malheureusement, la boucle est toujours infinie. Le until n'a pas l'air de fonctionner. |
|
| |
hofmeister Bavard
Messages : 109
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 18: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! |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 19: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. https://i.imgur.com/PqBXqng.jpgLe 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 :/ |
|
| |
Kabcorp Utilisateur confirmé: Rang **
Messages : 315 Localisation : Savoie Projet Actuel : trop...
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 19: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 =) |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 19: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 |
|
| |
hofmeister Bavard
Messages : 109
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 20: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. |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Lun 12 Jan 2015 - 22: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 : https://i.imgur.com/QdAzMkq.jpgEn tout cas, merci encore pour l'aide, tu m'as permis de bien avancer ! |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: [Résolu] Problème avec une boucle. Mar 13 Jan 2015 - 2: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 |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Mar 13 Jan 2015 - 2:09 | |
| Ah oui effectivement, c'est bien la solution, merci ! |
|
| |
hofmeister Bavard
Messages : 109
| Sujet: Re: [Résolu] Problème avec une boucle. Mar 13 Jan 2015 - 10: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;} |
|
| |
Saito Gray Débutant
Messages : 10
| Sujet: Re: [Résolu] Problème avec une boucle. Mar 13 Jan 2015 - 13: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 !
|
|
| |
Contenu sponsorisé
| Sujet: Re: [Résolu] Problème avec une boucle. | |
| |
|
| |
| [Résolu] Problème avec une boucle. | |
|