Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Lire position souris sur un scene2D ? | |
| | Auteur | Message |
---|
dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Lire position souris sur un scene2D ? Jeu 25 Nov 2010 - 20:21 | |
| C'est moi qui me gourre dans le code ou c'est la position souris qui ne fonctionne pas sur le scene2D ? - Code:
-
' Déclaration des variables dim x dim y dim taille
' Création des objts "système" scene2D 1 edit 2
' Taille du scene2D width 1,400 height 1,400 file_load 1,"Carte.bmp"
' Position de l'édit left 2,400 top 2,0
' Affichage dans l'édit de la position souris lors du click gauche x=mouse_x_left_down(1) y=mouse_y_left_down(1) text 2,"X="+str$(x)+" Y="+str$(y) L'édit affiche toujours X=0 Y=0Ce code n'est pas dans une boucle, il se fait seulement lors du click sur la scene2D EDIT 1 :D'ailleurs je viens de faire le test en remplaçant la derniere partie par : - Code:
-
' Affichage dans l'édit de la position souris lors du click gauche if mouse_left_down(1)=1 x=mouse_x_left_down(1) y=mouse_y_left_down(1) text 2,"X="+str$(x)+" Y="+str$(y) end_if
Et là c'est pire, il ne détecte pas que le click souris se fait sur le scene2D :/(L'édit est toujours vide). EDIT 2 :Je viens de remplacer le scene2D par un picture et c'est la même chose, donc c'est la lecture de position souris qui ne fonctionne pas ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Lire position souris sur un scene2D ? Jeu 25 Nov 2010 - 21:39 | |
| A première vue je ne comprends pas bien ton programme: tu le lances, les instructions se déroulent immédiatement, puis il ne se passe plus rien, il n'y a même pas de END pour te mettre en attente d'événement. Ton test sur la souris se déroule une seule fois, au lancement, et puis on n'y revient plus, et tu peux cliquer tant que tu veux ça ne sera pas détecté ni traité. Ce test devrait être dans un sous-programme, appelé par le clic de la souris, du genre: - Code:
-
dim x, y label clic
picture 1 edit 2 on_click 1, clic end
clic: ' Affichage dans l'édit de la position souris lors du click gauche x=mouse_x_left_down(1) y=mouse_y_left_down(1) text 2,"X="+str$(x)+" Y="+str$(y) return maintenant, pour un scene2d ça semble un peu spécial... je ne connais pas. En effet, ça marche pour un picture, mais sur un scene2d ça donne toujours 0,0 ??? Le click est bien détecté, si on écrit: n=n+1: text 2,"n="+str$(n)+" X="+str$(x)+" Y="+str$(y) la valeur n s'incrémente à chaque clic, mais la position n'est pas détectée... | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 1:06 | |
| Le On_click n'a pas besoin d'être dans une boucle, et d'ailleurs tu le vois bien aussi puisque sur ton code il y a incrémentation, mais la position souris n'est pas lue comme je le disais. Si tu ne met pas de END il existe par défaut aussi.
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 1:56 | |
| @ dragonno: Je vois que tu as encore des difficultés avec le mode "basic ancien" et "basic évènementiel" de Panoramic.
Ceci a fait l'objet de multiples posts sur le forum - je te suggère de télécharger mon ForumBrowser et l'indexe du forum Panoramic que j'ai mis en ligne sur mon site, pour retrouver facilement tous ces posts.
Voici une explication brève mais j'espère parlante.
1. Un programme Panoramic démarre dans un mode "programmation linéaire" (ancien Basic) et reste dans ce mode jusqu'à l'exécution de la commande END. Toutes les commandes s'enchaînent les unes après les autres, et Panoramic ne se met PAS en attente d'un évènement.
Si l'on veut créer un programme avec une interface visuelle type Windows, avec des objets visuels, il fgaut utiliser cette phase pour définir son interface (créer les objets, leur donner leurs paramétrages etc). C'est aussi dans cette phase qu'un déclare les sous-programme d'évènements qu'on veut utiliser sur les objets visuels (dans ton cas, un click sur un picture).
2. On place la commande END à la fin de cette phase de préparation. On passe alors en "mode évènementiel". Le noyau de Panoramic prend la main et ne fait rien d'autre qu'attendre un évènement pour lequel un sous-programme a été déclaré dans la phase précédente. SI un tel évènement arrive (un click sur un picture, par exemple), le noyau de Panoramic appelle alors le sous-programme associé comme si le programmeur avait fait un GOSUB.
3. On place TOUS les sous-programmes évènements APRES le END, et on les termine par un RETURN. Ce RETURN redonne la main au noyau de Panoramic pour attendre l'évènement suivant. D'après ce que je viens de dire en (2), tu vois que ces sous-programmes ne sont exécutés que si l'évènement correspondant est arrivé.
Voici donc la structure type d'un programme Panoramic:
label <... liste des labels des sous-programmes évènements et sous-programmes de 2ème niveau...> dim <... définition de toutes les variables...> ... définition de tous les objets, avec leurs paramètres ... initialisation éventuelle de certaines variables
END
routine_event_1: ... traitement de l'évènement 1 RETURN
routine_event_2: ... traitement de l'évènement 2 RETURN
sousprogramme_1: ... sous-programme éventuellement appelé par un des sous-programmes évènement RETURN
Voilà, c'est tout. A la lumière de cela, regarde à nouveau le source de JL35, qui respecte parfaitement ces règles, et qui du coup marche puisqu'il donne la possibilité à Panoramic d'attendre l'évènement du click sur le picture par l'instruction END.
Tu dis qu'en absence de END, le END est automatique. Oui, certes, mais le programme ne bascule alors JAMAIS dans le "mode évènementiel", ou plutôt si: exactement après avoir exécuté la dernière instruction de ton programme, mais il n'y a AUCUN sous-programme évènement qui peut être appelé pour traiter l'évènement s'il arrive, et tous les évènements sont ainsi "perdus", c'est-à-dire ne produisent aucun effet.
Note concernant les SCENE2D: cet objet ne peut effectivement recevoir un évènement on_click, mais on ne peut PAS lire la position du curseur ! C'est comme ça. | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 2:03 | |
| Ok merci de tes précisions Maitre Klaus - Citation :
- 2. On place la commande END à la fin de cette phase de préparation. On passe alors en "mode évènementiel". Le noyau de Panoramic prend la main et ne fait rien d'autre qu'attendre un évènement pour lequel un sous-programme a été déclaré dans la phase précédente. SI un tel évènement arrive (un click sur un picture, par exemple), le noyau de Panoramic appelle alors le sous-programme associé comme si le programmeur avait fait un GOSUB.
Ce que tu dis là confirme ce que je dis précédement non ? C'est à dire que le on_click n'a pas besoin d'être dans une boucle puisque panoramic lit les evennements des objets. Pour le scene2D c'est vraiment dommage :/ Comment faire dans ce cas, pour placer un sprite à la position du click ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 2:31 | |
| 1. Le on_click n'a effectivement pas besoin d'être dans une boucle. Mieux, il ne devrait pas être dans une boucle, mais dans la partie linéaire, exécutée une seule fois, au début du programme, et AVANT la commande END. Et le sous-programme déclaré par la commande on_click DOIT être APRES la commande END. Regarde encore une fois le prpgramme de JL35 - c'est un bon exemple.
2. Effectivement, c'est dommage qu'on ne puisse pas récupérer la position d'un click sur une scene2d. Il faut effectivement utiliser d'autres moyens (les flèches, des touches de déplacement, des boutons agissant comme des flèches, ...). Tu peux par exemple placer un picture en peu plus grand dans la form, placer une scene2d un peu plus petite par-dessus le picture, et utiliser le "bord" du picture qui reste visible pour intercepter la position du click, per exemple en décidant que: 25 % de gauche du bord haut déplacent un sprite d'un cran à gauche ET en haut 50 % du milieu du bord haut déplacent un sprite d'un cran en haut 25 % de droite du bord haut déplacent un sprite d'un cran à droite ET en haut 25 % du haut du bord droit déplacent un sprite d'un cran à droite ET en haut 50 % du milieu du bord droit déplacent un sprite d'un cran à gauche 25 % du bas du bord droit déplacent un sprite d'un cran à droite ET en bas et ainsi de suite pour le bord bas et gauche. A toi d'avoir de l'imagination...
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 8:14 | |
| | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 12:51 | |
| - Citation :
- Et le sous-programme déclaré par la commande on_click DOIT être APRES la commande END.
Oui oui maitre Klaus, c'est bien ce que je fais dans mes codes (Mais je comprend pas pourquoi tu me fais la remarque puisque je l'applique déjà oO ) Pas dans ce code c'est vrai car c'est juste un extrait de mon programme montré en entier ailleurs, et qui lui comporte exactement la bonne façon d'utiliser le On_click. Maitre Klaus, merci pour ton idée pour les bords (25% etc) . En fait ce que je veux faire c'est pouvoir cliquer sur un élément du menu (personnage, batiment ect) et le placer à un endroit de la map (scene2D) par un click. Ok Jean-Claude je regarde ça (et merci) Ah ok
Dernière édition par dragonno le Ven 26 Nov 2010 - 13:04, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 12:59 | |
| @Dragonno:
Eh bien, c'est tout simplement parce que le seul programme que tu as mis en ligne à ce sujey dans ce fil de discussion n'a pas de END ni on_click... à moins que j'ai la berlue. Mais si tu l'as fait ainsi, tant mieux. | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 13:03 | |
| Oui oui tu as raison, dans CE fil de discussion ce n'est qu'un extrait comme je viens de le dire précédement. Donc je comprend :/ EDIT : réparation de la lettre Q oubliée dans mon post précédent, dans le mot "remarque" Et pour ça, pas d'idées ou d'astuces ? - Citation :
- En fait ce que je veux faire c'est pouvoir cliquer sur un élément du menu (personnage, batiment ect) et le placer à un endroit de la map (scene2D) par un click.
Je suis bloqué à cause du manque de la lecture position click du scene2D. Si j'utilise un picture au lieu d'un scene2D pour la map, je serais bloqué aussi par un autre manque qui est la transparence des pictures. A ce stade la création d'un éditeur de map est difficilement réalisable avec panoramic je crois :/ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 14:35 | |
| - Citation :
- Le On_click n'a pas besoin d'être dans une boucle,...
- Citation :
- Ce que tu dis là confirme ce que je dis précédement non ?
C'est à dire que le on_click n'a pas besoin d'être dans une boucle ou as-tu vu dans mon exemple que le on_click était dans une boucle ? Le on_click prépare le traitement de l'événement clic souris, qui est traité dans le sous-programme clic à chaque fois qu'il intervient. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 14:57 | |
| @Dragonno: Je crains que tu n'aies raison. En l'état, on ne peut pas indiquer un endroit "cible" par un clic dans une scene2d. Tout ce que tu peux faire, c'est contourner le problème: soit en chargeant ton élément dans un sprite et déplacer le sprite par une des méthodes possibles, soit en chargeant un réticule dans un sprite transparent, déplacer ce réticule de la même manière, puis valider l'emplacement et remplacer le réticule par l'image que tu veux mettre.
Je me rends compte que ces deux méthodes sont équivalentes. Elles se résument à déplacer un sprite à l'aide de touches.
Tiens, j'ai une idée. Tu pourrais créer un picture de la dimension de la scene2d, et ce picture serait normalement caché (par HIDE). Lorsque tu cliques sur ton menu, tu copies le contenu de la scene2d dans le picture, et comme ce n'est pas dans une boucle de traitement, mais une seule exécution sur demande de l'utilisateur, tu peux simplement faire un file_save de la scene_2d, puis un file_load dans le picture. Puis tu montres le picture, par exemple exactement aux coordonnées xy de la scene2d, et là, tu peux cliquer pour sélectionner l'endroit, tu récupères le clic par on_click sur le picture et tu mémorises les coordonnées. Lorsque ton endroit est sélectionné, tu caches le picture à nouveau (par HIDE) et tu installes un sprite aux coordonnées choisies.
A l'ecran, cela ne change rien: le picture remplace la scene2D. Si jamais il y a des problèmes de Z-order entre picture et scene2d, il suffit de faire ce couple hide scene2d/show picture...hide picture/show scene2d.
Est-ce que cela pourrait être une solution pour le problème que tu me soumets ? J'ai déjà utilisé plusieurs fois cette technique, non pas avec des scene2d, mais avec des picture recouvrant d'autres objets, pour pouvoir sélectionner des parties difficilement d'accès autrement. A condition de charger le contenu du picture AVANT de faire show picture, il n'y a pas de perturbation d'affichage. | |
| | | Invité Invité
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 20:20 | |
| Je ne connais rien et je manque d'inspiration pour ce type de programme. Mais voulu voir par curiosité. Voyez si ceci peut vous servir. Ce n'est pas formidable. - Code:
-
label teste_mouse :dim x%,y%,a% scene2d 1:width 1,300:height 1,140 :left 1,20:top 1,20 sprite 1 sprite_target_is 1 sprite_file_load 1,"C:\image\Ftmp.bmp":' mettre votre photo, surtout si vous êtes beau!
on_click 1,teste_mouse
timer 2 edit 3:top 3,150:width 3,200 on_timer 2,teste_mouse :timer_interval 2,40
end teste_mouse: timer_off 2 hide 1 repeat x%=mouse_x_position(0) y%=mouse_y_position(0) text 3,str$(x%)+" "+str$(y%) sprite_position 1,x%,y% if scancode =27 then exit_for until x%=mouse_x_position(0) and y%=mouse_y_position(0) show 1
timer_on 2 return
C'est pas formidable, mais peut-être d'avancer un peu en attendant les commandes spécifiques à scene2d |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 20:45 | |
| Je répète ce que je disais dans le post que cite Jean-Claude: - Citation :
- Les fonctions suivantes pourront être utilisées avec un SCENE2D dans la prochaine version:
mouse_x_position(N) mouse_y_position(N)
mouse_right_down(N) mouse_right_up(N) mouse_left_down(N) mouse_left_up(N)
mouse_x_right_down(N) mouse_y_right_down(N) mouse_x_right_up(N) mouse_y_right_up(N)
mouse_x_left_down(N) mouse_y_left_down(N) mouse_x_left_up(N) mouse_y_left_up(N) Cette version devrait sortir d'ici quelques jours: encore quelques fiches à écrire, changer FOG_DISTANCE par FOG_DISTANCE_MIN et FOG_DISTANCE_MAX, et ... ... la fonction VARIABLE("V") qui renvoie 1 si V est une variable. | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Lire position souris sur un scene2D ? Ven 26 Nov 2010 - 22:59 | |
| JL35 : je faisais juste référence à ça : - Citation :
- Ton test sur la souris se déroule une seule fois, au lancement, et puis on n'y revient plus,
La phrase m'avait fait penser que c'était une boucle dont il s'agissait Klaus : Ta solution provisoire est une bonne idée, celle de travailler avec un couple "picture/scene2D" il faut que je la tourne et retourne dans mon tit cerveau pour voir ce que je peux faire avec Et pour cette idée là je vois pas trop où le déplacer le réticule ou le sprite puisque je ne connais pas la position du click : - Citation :
- contourner le problème: soit en chargeant ton élément dans un sprite et déplacer le sprite par une des méthodes possibles, soit en chargeant un réticule dans un sprite transparent, déplacer ce réticule de la même manière, puis valider l'emplacement et remplacer le réticule par l'image que tu veux mettre.
Cosmos : Merci pour ton code, je vais le tester Jack : Je vais user de patience Merci de prendre le temps de t'occuper de tout ça ^^ Et à propos de ça : - Citation :
- la fonction VARIABLE("V")
les guillemets c'est vraiment utile ? Je cherche à me rendre moins compliqué l'écriture des instructions (comme y a déjà les parenthèses qui sont utiles) J'ai fais une liste d'ajouts dans le topic concerné, je dis ça pour que le post ne s'enfonce pas dans les entrailles du forum avec le temps. Pour les fonctions souris sur le scene2D toutes ne sont pas urgentes si tu n'a pas le temps, par contre la position x et y du click un peu plus EDIT : J'ai testé ton code Cosmos, ça m'a l'air utile à ce que je veux faire je vais approfondir ça pour voir. C'est sympa le sprite qui colle au curseur se déplaçant. Et j'ai mis ma photo même si je suis pas beau, c'est grave docteur ? - Code:
-
sprite_file_load 1,"vie.bmp":' mettre votre photo, surtout si vous êtes beau! J'ai peur que ça marche pas avec une photo moche | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Sam 27 Nov 2010 - 0:42 | |
| @Dragonno:
1. pour cette histoire du réticule, l'idée c'était de charger l'image bitmap d'un réticule sur fond noir dans un sprite et de déplacer ce sprite via les touches du clavier - les flèches ou autres. Mais je pense que l'idée d'associer un picture à un e scene2d et d'afficher l'un ou l'autre selon les circonstantes est meilleure, car elle mermet d'utiliser la souris pour cliquer.
2. la fonction variable('"V") a essentiellement besoin des guillemets. Car, si tu ne mets pas de guillemets, la variable V doit exister et est passée par valeur ce qui serait un comble pour une fonction qui doit tester si une variable existe. Mais tu pourras certainement faire: dim a$ a$ = test% if variable(a$)<>1 then message "la variable test% n'existe pas !"
@Jack:
Je suis très content de voir apparaître la fonction variable() qui réalise quelque chose que j'attends depuis longtemps. Est-ce qu'on peut espérer quelque chose de similaire pour les labels ? Genre label%("essai") qui retournerait 1 si le label essai existe et 0 ou autre chose sinon.
| |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Lire position souris sur un scene2D ? Sam 27 Nov 2010 - 11:10 | |
| - Citation :
- la fonction variable('"V") a essentiellement besoin des guillemets. Car, si tu ne mets pas de guillemets, la variable V doit exister et est passée par valeur ce qui serait un comble pour une fonction qui doit tester si une variable existe.
Tout à fait ! Que j'aime ce genre de réponse, qui montre une compréhension à 100% de ce qui se passe réellement ! Et pour reprendre l'exemple de Klaus, mais avec cette fois des guillemets dans la ligne a$="test%" (ce que Klaus a oublié) : 1 - exemple 1: - Code:
-
dim a$
a$ = "test%" if variable(a$)<>1 message "la variable test% n'existe pas !" else message "la variable test% existe !" end_if On obtient un MESSAGE indiquant: la variable test% n'existe pas !"2 - exemple 2: - Code:
-
dim a$,text%
a$ = "test%" if variable(a$)<>1 message "la variable test% n'existe pas !" else message "la variable test% existe !" end_if On obtient un MESSAGE indiquant: la variable test% existe !"Je regarde pour faire une fonction LABEL(), quitte à retarder la sortie de la V 0.9.20 de quelques jours. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Lire position souris sur un scene2D ? Sam 27 Nov 2010 - 11:27 | |
| Jack, c'est extra. Voilà des fonctions qui vont très sérieusement faciliter l'utilisation de morceaux de code mis en commun, intégrer des outils d'autres panoramiciens etc. Autre chose. pour rester dans le sujet de ce fil de discussion, j'avais proposé à Dragonno de superposer son scene2d par un picture caché. Au moment de vouloir cliquer dans la scene2d, je proposais de sauver le contenu de la scene2d dans un fichier BMP, de charger de fichier dans le picture, montrer le picture puis cacher la scene2d. Or, je constate ce matin que la commande FILE_SAVE n'est pas supporté par l'objet SCENE2D. Pourquoi ? Cet objet supporte bien la command FILE_LOAD. Pourquoi pas son inverse ? Il y a peut-être des difficultés à récupérer l'aspect visuel à cause des sprite ? Ou peux-tu simplement sauvegarder le canvas servant à l'affichage (si c'est fait comme ça...) ? J'avais fait un petit essai. Il met cela en évidence. Le programme marche sans FILE_SAVE, mais c'est dommage. - Code:
-
label click_1,click_10
button 1 : top 1,10 : left 1,10 : caption 1,"Choix" : on_click 1,click_1 check 2 : top 2,10 : left 2,120 : caption 2,"Avec FILE_SAVE" picture 10 : hide 10 : top 10,100 : left 10,100 : width 10,200 : height 10,200 scene2d 11 : show 10 : top 11,100 : left 11,100 : width 11,200 : height 11,200 on_click 10,click_10 file_load 11,"test scene2d-picture.bmp" end
click_1: inactive 1 if clicked(2)=1 file_save 11,"temp test scene2d-picture.bmp" file_load 10,"temp test scene2d-picture.bmp" else file_load 10,"test scene2d-picture.bmp" end_if show 10 : hide 11 return
click_10: message "X="+str$(mouse_x_left_down(10))+" Y="+str$(mouse_y_left_down(10)) show 11 : hide 10 : active 1 return
| |
| | | Contenu sponsorisé
| Sujet: Re: Lire position souris sur un scene2D ? | |
| |
| | | | Lire position souris sur un scene2D ? | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |