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 |
|
|
| On_Sprite_Click N,L | |
|
+4Klaus Jean Claude Jicehel Yannick 8 participants | |
Soutenez vous ces deux commandes ? | Oui | | 78% | [ 7 ] | Non | | 22% | [ 2 ] |
| Total des votes : 9 | | Sondage clos |
| Auteur | Message |
---|
Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: On_Sprite_Click N,L Mer 20 Mar 2013 - 21:35 | |
| Pouvoir cliquer sur un SPRITE est une fonction qui manque à un SCENE2D. Mais terriblement difficile à faire. Car l'image qui s'affiche sur le SCENE2D est le résultat d'une fusion du fond et des sprites: ce n'est rien d'autre qu'une image. C'est comme si je prenais une rue en photo et que je veuille cliquer sur la voiture rouge en stationnement ... alors que ce n'est qu'une tache colorée d'une image ... Ce qui est possible de faire, c'est d'introduire la notion de curseur et d'affecter un sprite au curseur de la souris (croix, rond, carré, ...) et de tester la collision du curseur avec un sprite du SCENE2D.
Il manque aussi d'autres choses importantes au SCENE2D: la collision des sprites (par "pixel perfect" ou par rectangle englobant) et une "profondeur" qui permettrait à des sprites de passer dessus ou dessous d'autres sprites. Tout cela, j'ai l'intention de le faire. Mais il me faut le temps de les mettre en place... | |
| | | Froggy One
Nombre de messages : 598 Date d'inscription : 06/01/2012
| Sujet: Commentaire inutile... mais ça fait du bien !!! Mer 20 Mar 2013 - 21:50 | |
| Patience, courage, zénitude... Moi j'aimerais que... Non, je plaisante!VIVE LE TRAVAIL D’ÉQUIPE !!! Déjà que seul, je n'arrive pas à faire tout ce que je veux pour moi, alors en groupe... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 20 Mar 2013 - 22:59 | |
| Merci de ta réponse Jack, Il me semblait bien qu'il y avait un problème technique à la chose. Je prends donc mon mal en patience... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: On_Sprite_Click N,L Mer 20 Mar 2013 - 23:06 | |
| Hélas, on ne peut pas te donner un peu de temps de notre temps, Jack ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 1:09 | |
| @Jack: Voici une simulation de l'identification du sprite cliqué en Panoramic pur. L'exemple utilise deux sprites, un tableau contenant, pour chaque sprite, son numéro, la largeur et sa hauteur. Lors d'un clic dans le scene2d, on parcourt cette liste et on teste si le clic correspond à un rectangle du sprite. La boucle parcourt la liste de la fon vers le début pour tenir compte de la superposition des sprites: - Code:
-
label click dim i%, x%, y%, ns% dim number_sprite_click%
scene2d 1 : on_click 1,click
ns% = 2 : ' 2 sprites dim sprites%(ns%,2)
sprite 1 : sprite_position 1,300,10 sprite_file_load 1,"file_1.bmp" : ' ex: taille 30x100 pixels sprites%(1,0) = 1 : " numéro du premier sprite sprites%(1,1) = 300 : ' largeur du premier sprite sprites%(1,2) = 10 : ' largeur du premier sprite
sprite 2 : sprite_position 2,10,50 sprite_file_load 2,"file_2.bmp" : ' ex: taille 120x120 pixels sprites%(2,0) = 1 : " numéro du premier sprite sprites%(2,1) = 120 : ' largeur du premier sprite sprites%(2,2) = 120 : ' largeur du premier sprite
end
click: number_sprite_click% = 0 : ' supposer "aucun sprite n'est cliqué" x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) for i%=ns% to 1 step -1 : ' boucle sur les sprites existants ' test si l'abscisse du clic correspond à ce sprite if x%>=sprite_x_position(sprites%(i%,0) if x%<(sprite_x_position(sprites%(i%,0))+sprite_x_position(sprites%(i%,1))) ' test si l'ordonnée du clic correspond à ce sprite if y%>=sprite_y_position(sprites%(i%,0) if y%<(sprite_y_position(sprites%(i%,0))+sprite_y_position(sprites%(i%,2))) ' alors on a identifié le sprite number_sprite_click% = sprites%(i%,0) return end_if end_if end_if end_if next i% return En Delphi, ceci est infiniment plus simple, à l'aide de la fonction PtInRect() de Delphi.
Dernière édition par Klaus le Jeu 21 Mar 2013 - 16:03, édité 1 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 21 Mar 2013 - 2:04 | |
| Vérifies Klaus, j'ai des messages d'erreur "Not logical expression" Mais bon si y'a moyen de moyenner çà dans une dll... Je vois que pour le moment, il me faut passer par des tableaux de variable pour recréer des grilles de valeur et au bout d'un moment une chatte n'y retrouve plus ses petits... Et ce n'est valable que sur des positions définies vers des positions définies. Je n'ose même pas imaginer sur des positions non définis ou là les tableaux devraient prendre en compte chaque pixel... Essayes de visualiser pour un scene2d de 800x800 Edit : rassures toi, je n'ai pas encore d'inspiration pour un tel jeu J' en remets une couche car j'arrivais pas à l'exprimer tout à l'heure: le fait que le sprite devienne un objet avec son numéro cliquable et par conséquent que l'on puisse récupérer le numéro du sprite cliqué fait qu'au lieu d'affecter des valeurs sur le scene2d on les affecterait au sprite... et là... ...çà devient presque un jeu d'enfants .... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 16:24 | |
| J'ai corrigé deux lignes - il y avait une parenthèse fermante en trop. Ce code a été saisi directement dans la page du forum, sans passer par l'éditeur. C'est juste pour montrer le principe: 1. on a un tableau contenant 3 informations pour chaque sprite: - son numéro - sa largeur - sa hauteur sa position x et y est connue par les fonctions sprite_x_position() et sprite_y_position(), donc pas besoin de les mémoriser 2. pour chaque clic dans le scene2d, on obtient les coordonnées par mouse_x_left_down() et mouse_y_left_down() 3. on fait une boucle, commençant au dernier sprite créé et terminant par le premier, et on vérifie si le clic a lieu à l'intérieur du rectangle dont le coin en haut à gauche est fourni par la position du sprite, et les coordonnées du coin en bas à droite s'obtiennent en additionnant les dimensions du sprite mémorisés dans le tableau 4. dès qu'on constate que le clic est à l'intérieur d'un sprite, on met sont numéro (mémorisé dans le tableau) dans la variable number_sprite_click, et à ce moment, on devrait théoriquement déclencher l'évènement on_sprite_click dont la routine aurait été enregistrée par la commande ON_SPRITE_CLICK N,R, avec N étant un numéro de sprite et R le nom d'un label Panoramic. Ceci concerne bien sur uniquement le noyau de Panoramic si c'est fait par Jack - le morceau de code présenté ici ne peut pas faire cela. Ce code ne sert qu'à montrer comment on peut facilement détecter le sprite visé. Le fait de faire la boucle à l'envers tient compte de la superposition des sprites. En effet, et dans l'état actuel de Panoramic, chaque nouveau sprite créé est placé "par-dessus" tous les autres. En commençant donc par le dernier, on a systématiquement celui qui est au-dessus, et on ne détecte pas un sprite qui serait caché par un autre. Cette technique de détection test valable quelque soit la taille su scene2d. Et en delphi, cette suite de 4 IFs imbriqués se remplace par une seule lgne:* - Code:
-
if PtInRect(RectangleDuSprite, PointDuClic) then ..... // détection du sprite visé
On ne travaille pas du tout sur l'image affichée, dans laquelle on ne peut effectivement pas savoir quel sprite est visé. On travaille uniquement avec les propriétés du sprite qui sont forcément mémorisées dans une table interne à Panoramic (numéro, position, dimension), et rien d'autre entre en ligne de compte. Et à condition d'ajouter une extension de ces tables pour ajouter la mémorisation du nom de l'évènement ON_SPRITE_CLICK, le déclenchement de l'évènement se fait exactement de la même manière que pour un ON_CLICK den'importe que objet. Je souligne au passage que si cette modification est faite, cela ne transforme pas pour autant un sprite en objet Panoramic clasique ! Il reste un sprite avec sa série de numérotation totalement indépendante des numéros des objets. Il acquiert simplement de nouvelles capacités, c'est tout. Rien d'autre ne change dans la logique de Panoramic. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 21 Mar 2013 - 17:23 | |
| Je pense que tu viens d'ouvrir une piste pour Jack et je garde en favoris cette page avec ta démo pour une étude approfondie de la chose Merci à toi pour cette nouvelle fonction. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 19:35 | |
| @Klaus: Oui, je vois bien ce que tu veux faire, et c'est le premier algorithme qui vient à l'esprit. Malheureusement, ce n'est pas si simple car un SPRITE n'est pas rectangulaire et il faut tenir compte de la couleur transparente (qui est le noir pour Panoramic). J'utilise ton algorithme pour ce sprite représentant un personnage sous forme d'ellipse verticale: J'utilise un fond bleu ciel. Le personnage va donc apparaitre ainsi: Maintenant, si je clique en A, ça fonctionne. Mais si je clique en B, ça fonctionne aussi, car je clique à l'intérieur du rectangle qui a servi à définir mon sprite. Or, pour un joueur qui clique en B, il a cliqué à côté du personnage et pour lui, le clic ne doit pas être actif. Et là, j'entends déjà tous les joueurs crier: au bug ! au bug ! et intervenir sur le forum: BUG, BUG, BUG ON_SPRITE_CLICK NE FONCTIONNE PAS !!! Un joueur n'a pas notion de SPRITE et de son rectangle de définition (rectangle englobant pour reprendre les termes classiques), il ne connait que ce qui est représenté par le SPRITE, ce que j'ai appelé le personnage. Et mon raisonnement se base sur une forme simple. Imagine un sprite concave ou en forme d'anneau (qui a des "trous") à l'intérieur ... Autre chose: Imagine un sprite n°1 comme celui que j'ai fait (ellipse) et un sprite en forme d'anneau n°2 devant lui. Ou clique dans la partie creuse de l'anneau. Si on part du sprite ayant le plus grand numéro comme dans ton algorithme, on s'arrête au numéro 2 car le clic est dans son rectangle. Or, c'est sur le sprite n°1 qu'on a cliqué... Et là, nouvelle avalanche de messages: BUG, BUG, BUG NUMBER_SPRITE_CLICK NE FONCTIONNE PAS !!! | |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 20:53 | |
| bsr klaus je peut te proposé un système pour installé un picture de 30X30 dans un autre picture plus grand en ce moment je suis en train de créer un pacman avec un editeur de circuit ça pourrait vous donné des idées avec des sprite je n'ai pas fait de teste mais ça doit marché donc le picture de 30X30 je l'installe ou je veut dans un picture de 570X570 sur un point tres precis voici un extrai du code - Code:
-
selection: n=number_click 2d_target_is n 2d_image_copy 30,0,0,30,30 2d_target_is 51 2d_image_paste 30,0,0 return
xmou=int(mouse_x_left_down(1)/30)+1 x=-30+(30*xmou) ymou=int(mouse_y_left_down(1)/30)+1 y=-30+(30*ymou) item_delete 101,ymou
2d_target_is 1 2d_image_paste 30,x,y gob(xmou,ymou)=str$(n)
si tu veut le code complet tu peut le telechargé ici: gob v1ou directement sur mon webdav:panoramic@pascal10000 :code panoramic123 bonsoir! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 21:09 | |
| @Jack: Je comprends tes objections, et je n'ai bien entendu aucune idée comment les sprites sont implémentés de façon interne. Cependant, je suppose que tu as quelque part la bitmap complète, rectangulaire, y compris les pixels noirs, car à chaque déplacement d'un sprite, tu dois évidemment recalculer complètement l'image globale résultante. Et donc, il est facile de savoir, pour des coordonnées de clic données, si le pixel d'un sprite sous le curseur est noir ou pas. La version modifiée de mon code ci-après en tient compte: - Code:
-
label click dim i%, x%, y%, ns% dim number_sprite_click%
scene2d 1 : on_click 1,click
ns% = 2 : ' 2 sprites dim sprites%(ns%,2)
sprite 17 : sprite_position 17,300,10 sprite_file_load 17,"file_17.bmp" : ' ex: taille 30x100 pixels sprites%(1,0) = 17 : " numéro du premier sprite sprites%(1,1) = 300 : ' largeur du premier sprite sprites%(1,2) = 10 : ' largeur du premier sprite
sprite 12 : sprite_position 12,10,50 sprite_file_load 12,"file_1.bmp" : ' ex: taille 120x120 pixels sprites%(2,0) = 12 : " numéro du second sprite sprites%(2,1) = 120 : ' largeur du second sprite sprites%(2,2) = 120 : ' largeur du second sprite
end
click: number_sprite_click% = 0 : ' supposer "aucun sprite n'est cliqué" x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) for i%=ns% to 1 step -1 : ' boucle sur les sprites existants ' test si l'abscisse du clic correspond à ce sprite if x%>=sprite_x_position(sprites%(i%,0) if x%<(sprite_x_position(sprites%(i%,0))+sprite_x_position(sprites%(i%,1))) ' test si l'ordonnée du clic correspond à ce sprite if y%>=sprite_y_position(sprites%(i%,0) if y%<(sprite_y_position(sprites%(i%,0))+sprite_y_position(sprites%(i%,2))) ' alors on a identifié le sprite if sprite_color(i%,x%-sprite_x_position(sprites%(i%,1)),y%-sprite_y_position(sprites%(i%,1)))<>...noir... begin number_sprite_click% = sprites%(i%,0) : ' .. lancer ici la routine on_sprite_click end return end_if end_if end_if end_if next i% return
Et je suis d'accord avec toi pour dire qu'on ne peut pas se baser sur le numéro des sprite dans l'ordre croissant. C'est bien pour cela que j'ai placé les numéros des sprites dans la table - une table qui sera chargée, un peu comme une pile, avec le premier sprite créé dans la cellule 1, le second sprite créé dans la cellule 2 etc, quelque soit le numéro du sprite. Ceci correspond, et j'en suis certain, à ta liste des sprites actuellement gérée dans Panoramic, car c'est le seul moyen d'expliquer la superposition du sprite le plus récent sur les autres: en redéssinant l'image du scene2d après un mouvement d'un sprite, tu appliques certainement sprite après sprite, en tenant chaque fois compte de la couleur noire pour la transparence, et ainsi de suite du premier sprite créé jusqu'au dernier, dans le sens de la chronologie de création, et non par rapport aux numéros des sprites (qui n'ont aucune importance à ce niveau). C'est pourquoi, dans mon code proposé, je parcours la liste du plus récent au plus ancien, et je m'arrête sur celui qui est touché, sachant ainsi que je touche forcément celui qui est le plus "haut", donc le plus récent. Et en tenant compte de la couleur noire comme dans le code ci-dessus, je touche bien le sprite dont la couleur non-noire est le plus récent. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 21:16 | |
| @pascal10000: Il marche bien, ton code. Nombre d'entre nous ont trouvé des solutions similaires à ce problème (qui est un peu en-dehors du sujet actuel, mais néanmoins intéressant).
Je t'invite à regarder la documentation de la dll nommée KGF.dll, contenue dans le fichier KGF.chm. Plus particuliairement la rubrique "Gestion d'images", et la fonction ModifyPicture qui s'y trouve (mais il y en a plein d'autres qui sont intéressantes): cette fonction fait cela, mais avec en plus la possibilité de gérer une couleur quelconque comme couleur de transparence ET de gérer le degré de transparence ou d'opacité. Je me suis intéressé de près à la gestion des images. | |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 21:34 | |
| dsl klaus mais pour manipulé les "DLL" je ne serai pas faire, trop peur de planté mon ordi sinon il y a longtemps que j'aurai manipule ceux de windows et des autres logiciel ça serait un peut comme si je trifouille le registre de windows ce qui est tres dangeureu et j'avais plein de projets si j'avais ce niveau a programmer avec visual basic ou même avec C# mais c'est trop compliqué pour moi et c'est pour cela que je me suis orienté sur panoramic parce que il est simple et très facile a le prendre en main
et je felicite a jack de se donné tant de mal pour son BB comme il dit et pour nous tous sur cela bonsoir et bonne continuation | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 22:06 | |
| N'aie pas peur des DLL ! Tant que tu n'utilises pas des fonctions que modifient le registre ou des fichiers système, il n'y a aucun danger ! Même si tu produis une violation d'accès de mémoire, pas de problème. Tu relances ton programme et c'est bon. En développement de mes DLL, j'en produis des dizaines par jour, et tout va bien. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 21 Mar 2013 - 22:40 | |
| N'aies pas peur Pascal10000 , parfois on parle un peu chinois mais on finit toujours par ce comprendre... Les dll et en particulier celle de Klaus est une source de fonctions que ne possède pas Panoramic pour l'instant. Si tu lis la doc "kgf.chm" attentivement tu devrais t'en sortir et, au cas où tu aies un souci, Klaus répond aux questions. | |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: On_Sprite_Click N,L Jeu 21 Mar 2013 - 23:23 | |
| ben ce qui m'aurai plus c de manipulé les fichier mp3 et les wave pour créer une table de mixage et qu'il soit en comunication avec windows pouvoir réglé les grave ,les aigus,la balance et tous le tointoin mais ça c'est une autre histoire sinon si tu as une telle librairie alors fait moi ou a nous une proposition
sur ça gros dodo | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: On_Sprite_Click N,L Ven 22 Mar 2013 - 1:45 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Ven 22 Mar 2013 - 9:31 | |
| Pour illuster mon propos sur les ON_SPRITE_CLICK, voici mon petit code, mais cette fois pleinement opérationnel ! J'ai créé deux sprites: - un étroit rectangle bleu - sprite 17 - un large anneau rouge - sprite 12 Je crée bien le second sprite avec un numéro inférier à celui du premier sprite, et les numéros ne se suivent pas. Je superpose l'anneau au rectangle et autorise les clics. Dans la routine on_click du scene2d, j'affiche le numéro du sprite trouvé (contenu de NUMBER_SPRITE_CLICK). On voir qu'on peut cliquer dans problème au travers du trou de l'anneau: Si l'on vise le rectangle bleu à l'intérieur du trou de l'anneau, on trouve bien le rectangle. Si l'on vise le fond du scene2d à l'intérieur du trou de l'anneau, on trouve sprite 0 (pas de sprite visé) Si l'on vise l'anneau là où il superpose le rectangle bleu, on obtient bien le sprite de l'anneau Donc, mon algorithme fonctionne parfaitement et n'est pas compliqué à implémenter. Le code semble lourd car c'est en Panoramic, mais en Delphi, cela ne représente que quelques lignes. Voici le code: - Code:
-
label click dim i%, x%, y%, ns%, spr%, x1%, y1% dim number_sprite_click%
scene2d 1 : on_click 1,click : full_space 1 : color 1,200,200,200 image 2
ns% = 0 : ' initialement pas de sprites dim sprites%(10,2) : ' pérvoir pour 10 sprites
' premier sprite: rectangle bleu sprite 17 : sprite_position 17,300,10 picture 17 : hide 17 : width 17,200 : height 17,10 2d_target_is 17 : 2d_pen_color 0,0,255 : 2d_fill_color 0,0,255 2d_rectangle 0,0,199,9 2d_image_copy 2,0,0,199,9 sprite_image_load 17,2 memoriser_sprite(17,200,10) sprite_position 17,200,200
' deuxième sprite: anneau rouge sprite 12 : sprite_position 12,10,50 picture 12 : hide 12 : width 12,120 : height 12,120 color 12,0,0,0 : ' fond transparent 2d_target_is 12 : 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 2d_circle 60,60,50 2d_fill_color 0,0,0 2d_circle 60,60,25 2d_image_copy 2,0,0,119,119 sprite_image_load 12,2 memoriser_sprite(12,120,120) sprite_position 12,250,150
end
sub memoriser_sprite(n%,w%,h%) ns% = ns% + 1 : ' compter le nouveau sprite sprites%(ns%,0) = n% : ' numéro du sprite sprites%(ns%,1) = w% : ' largeur du sprite sprites%(ns%,2) = h% : ' hauteur du sprite end_sub
click: number_sprite_click% = 0 : ' supposer "aucun sprite n'est cliqué" x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) for i%=ns% to 1 step -1 : ' boucle sur les sprites existants spr% = sprites%(i%,0) x1% = x% - sprite_x_position(spr%) y1% = y% - sprite_y_position(spr%) ' test si l'abscisse du clic correspond à ce sprite if x%>=sprite_x_position(spr%) if x%<(sprite_x_position(spr%)+sprites%(i%,1)) ' test si l'ordonnée du clic correspond à ce sprite if y%>=sprite_y_position(spr%) if y%<(sprite_y_position(spr%)+sprites%(i%,2)) ' test si ce n'est pas la couleur transparente if (color_pixel_red(spr%,x1%,y1%)+color_pixel_green(spr%,x1%,y1%)+color_pixel_blue(spr%,x1%,y1%))>0 ' alors on a identifié le sprite number_sprite_click% = spr% : ' .. lancer ici la routine on_sprite_click message "NUMBER_SPRITE_CLICK = "+str$(number_sprite_click%) return end_if end_if end_if end_if end_if next i% message "NUMBER_SPRITE_CLICK = 0" return
Ce code est d'ores et déjà utilisables dans des jeux utilisant scene2d. La procédure memoriser_sprite(n%,w%,h%) mémorise chaque sprite dans la table. Contrainte en Panoramic: il faut garder les picture contenant l'image du sprite pour pouvoir tester la couleur sous le curseur, et je garde dont les picture, avec le même numéro que le sprite correspondant, pour une question de facilité de programmation. On pourrait aussi créer les picture avec n'importe quel numéro, passer ce numéro en 4ème paramètre à la procédure memoriser_sprite() et copier ce paramètre dans sprites%(ns%,3), après avoir dimensionné le tableau sprites% en consequence. Ce problème ne se pose pas à l'évidence dans le moteur de Panoramic, car de toutes façons, les images des sprites sont mémorisées quelque part, et sont accessibles pour le test de couleur. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 22 Mar 2013 - 10:30 | |
| Je regarderai ce soir, là je vais au miam chez beau papa... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Ven 22 Mar 2013 - 10:38 | |
| Bon appétit ! J'espère qu'il y aura autre chose à boire que du Sprite... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 22 Mar 2013 - 10:45 | |
| Moi aussi, et pas de Panoramic, j'en ai mangé toute la nuit pour résoudre mon problème de "No repeat....". Comme quoi, un simple "if" peut vous changer la vie... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: On_Sprite_Click N,L Ven 22 Mar 2013 - 10:45 | |
| Ca à l'air sympa ça, je regarderais ce soir ou ce week-end Merci pour le code | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: On_Sprite_Click N,L Ven 22 Mar 2013 - 11:59 | |
| Hmmm ! Je crois que je vais changer de régime et me mettre aux SPRITEs | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: On_Sprite_Click N,L Sam 23 Mar 2013 - 0:11 | |
| J'ai amélioré mon programme de détection de clic sur un sprite. Les messages d'information sont remplacées par un affichage du texte dans la caption de la form 0. Mais surtout, le sprite cliqué est considéré "sélectionné" et montre cela en vibrant. En cliquant sur un autre sprite, le sprite sélectionné précédemment est désélectionné (ne vibre plus) et le nouveau est sélectionné (vibre à son tour). Si l'on clique ailleurs (pas dans un sprite), le dernier sprite sélectionné est positionné à cet endroit (par son coin en haut à gauche). Cela montre comment on peut déplacer un sprite avec la souris, par exemple. - Code:
-
' ON_SPRITE_CLICK.bas label click, tim dim i%, x%, y%, ns%, spr%, x1%, y1%, delta% dim number_sprite_click%, save_sprite_click%
delta% = 1
scene2d 1 : on_click 1,click : full_space 1 : color 1,200,200,200 image 2 timer 3 : timer_interval 3,100 : on_timer 3,tim : timer_off 3
ns% = 0 : ' initialement pas de sprites dim sprites%(10,2) : ' pérvoir pour 10 sprites
' premier sprite: rectangle bleu sprite 17 : sprite_position 17,300,10 picture 17 : hide 17 : width 17,200 : height 17,10 2d_target_is 17 : 2d_pen_color 0,0,255 : 2d_fill_color 0,0,255 2d_rectangle 0,0,199,9 2d_image_copy 2,0,0,199,9 sprite_image_load 17,2 memoriser_sprite(17,200,10) sprite_position 17,200,200
' deuxième sprite: anneau rouge sprite 12 : sprite_position 12,10,50 picture 12 : hide 12 : width 12,120 : height 12,120 color 12,0,0,0 : ' fond transparent 2d_target_is 12 : 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 2d_circle 60,60,50 2d_fill_color 0,0,0 2d_circle 60,60,25 2d_image_copy 2,0,0,119,119 sprite_image_load 12,2 memoriser_sprite(12,120,120) sprite_position 12,250,150
end
sub memoriser_sprite(n%,w%,h%) ns% = ns% + 1 : ' compter le nouveau sprite sprites%(ns%,0) = n% : ' numéro du sprite sprites%(ns%,1) = w% : ' largeur du sprite sprites%(ns%,2) = h% : ' hauteur du sprite end_sub
tim: sprite_position number_sprite_click%,sprite_x_position(number_sprite_click%)+delta%,sprite_y_position(number_sprite_click%)+delta% delta% = 0 - delta% return
click: timer_off 3 save_sprite_click% = number_sprite_click% number_sprite_click% = 0 : ' supposer "aucun sprite n'est cliqué" x% = mouse_x_left_down(1) y% = mouse_y_left_down(1) for i%=ns% to 1 step -1 : ' boucle sur les sprites existants spr% = sprites%(i%,0) x1% = x% - sprite_x_position(spr%) y1% = y% - sprite_y_position(spr%) ' test si l'abscisse du clic correspond à ce sprite if x%>=sprite_x_position(spr%) if x%<(sprite_x_position(spr%)+sprites%(i%,1)) ' test si l'ordonnée du clic correspond à ce sprite if y%>=sprite_y_position(spr%) if y%<(sprite_y_position(spr%)+sprites%(i%,2)) ' test si ce n'est pas la couleur transparente if (color_pixel_red(spr%,x1%,y1%)+color_pixel_green(spr%,x1%,y1%)+color_pixel_blue(spr%,x1%,y1%))>0 ' alors on a identifié le sprite number_sprite_click% = spr% : ' .. lancer ici la routine on_sprite_click caption 0,"NUMBER_SPRITE_CLICK = "+str$(number_sprite_click%) timer_on 3 return end_if end_if end_if end_if end_if next i% if save_sprite_click%>0 then sprite_position save_sprite_click%,x%,y% caption 0,"NUMBER_SPRITE_CLICK = 0" return
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: On_Sprite_Click N,L Sam 23 Mar 2013 - 5:13 | |
| Ca marche super bien Klaus, bravo. Encore un code qui peut paraître simple mais qui est hyper pratique et malin | |
| | | Contenu sponsorisé
| Sujet: Re: On_Sprite_Click N,L | |
| |
| | | | On_Sprite_Click N,L | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |