FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
On_Sprite_Click N,L - Page 2 Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
On_Sprite_Click N,L - Page 2 Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
On_Sprite_Click N,L - Page 2 Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
On_Sprite_Click N,L - Page 2 Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
On_Sprite_Click N,L - Page 2 Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
On_Sprite_Click N,L - Page 2 Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
On_Sprite_Click N,L - Page 2 Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
On_Sprite_Click N,L - Page 2 Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
On_Sprite_Click N,L - Page 2 Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
On_Sprite_Click N,L - Page 2 Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
On_Sprite_Click N,L - Page 2 Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
On_Sprite_Click N,L - Page 2 Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -55%
Friteuse sans huile – PHILIPS – Airfryer ...
Voir le deal
49.99 €

 

 On_Sprite_Click N,L

Aller en bas 
+4
Klaus
Jean Claude
Jicehel
Yannick
8 participants
Aller à la page : Précédent  1, 2

Soutenez vous ces deux commandes ?
Oui
On_Sprite_Click N,L - Page 2 Vote_lcap78%On_Sprite_Click N,L - Page 2 Vote_rcap
 78% [ 7 ]
Non
On_Sprite_Click N,L - Page 2 Vote_lcap22%On_Sprite_Click N,L - Page 2 Vote_rcap
 22% [ 2 ]
Total des votes : 9
 
Sondage clos

AuteurMessage
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
pascal10000

pascal10000


Nombre de messages : 812
Localisation : Troyes
Date d'inscription : 05/02/2011

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyJeu 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
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: re   On_Sprite_Click N,L - Page 2 EmptyJeu 21 Mar 2013 - 22:40

N'aies pas peur Pascal10000 , parfois on parle un peu chinois
mais on finit toujours par ce comprendre... Laughing

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.
Revenir en haut Aller en bas
pascal10000

pascal10000


Nombre de messages : 812
Localisation : Troyes
Date d'inscription : 05/02/2011

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyJeu 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
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyVen 22 Mar 2013 - 1:45

ygeronimi a écrit:
N'aies pas peur Pascal10000 , parfois on parle un peu chinois
mais on finit toujours par ce comprendre... Laughing
.

Je cours vite m’inscrire au cours du soir pour apprendre le chinois ! 我快速运行(漫游)加入在夜间学习中文! Laughing study
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyVen 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: re   On_Sprite_Click N,L - Page 2 EmptyVen 22 Mar 2013 - 10:30

Je regarderai ce soir, là je vais au miam chez beau papa... Laughing
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyVen 22 Mar 2013 - 10:38

Bon appétit ! J'espère qu'il y aura autre chose à boire que du Sprite... Wink
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: re   On_Sprite_Click N,L - Page 2 EmptyVen 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... Laughing
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyVen 22 Mar 2013 - 10:45

Ca à l'air sympa ça, je regarderais ce soir ou ce week-end Wink Merci pour le code
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptyVen 22 Mar 2013 - 11:59

Hmmm !
Je crois que je vais changer de régime et me mettre aux SPRITEs On_Sprite_Click N,L - Page 2 U_THIN%7E1
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptySam 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptySam 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 Wink
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: re   On_Sprite_Click N,L - Page 2 EmptySam 23 Mar 2013 - 5:47

cheers cheers cheers

Super ce code !
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 EmptySam 23 Mar 2013 - 14:21

Et voici une nouvelle version du même code. Mais la détection du sprite cliqué est simplifié en utilisant la fonction IsPointInRectangle de KGF.dll. Cette fonction est un simple wrapper autour de la fonction Delphi PtInRect(rect, pt).

On effectue le choix en activant une des deux lignes 10 et 11, pour choisir la routine évènement adaptée. Le code présenté ci-dessous active la version "fonction IsPointInRectangle":
Code:
' ON_SPRITE_CLICK.bas
label click1, click2, tim
dim i%, x%, y%, ns%, spr%, x1%, y1%, delta%, res%
dim number_sprite_click%, save_sprite_click%

delta% = 1

scene2d 1 : full_space 1 : color 1,200,200,200
' ======= choisir 1 des 2 lignes suivantes:
' on_click 1,click1  : ' version 100 % Panoramic
 on_click 1,click2  : ' version avec fonction IsPointInRectangle

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

dll_on "KGF.dll"

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

' version 100 % Panoramic
click1:
  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
 
' version avec fonction IsPointInRectangle
click2:
  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%)

    res% = dll_call6("IsPointInRectangle",x%,y%,sprite_x_position(spr%),sprite_y_position(spr%),sprites%(i%,1),sprites%(i%,2))
    if res%=1
            ' 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
  next i%

  if save_sprite_click%>0 then sprite_position save_sprite_click%,x%,y%
  caption 0,"NUMBER_SPRITE_CLICK = 0"
  return

Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





On_Sprite_Click N,L - Page 2 Empty
MessageSujet: Re: On_Sprite_Click N,L   On_Sprite_Click N,L - Page 2 Empty

Revenir en haut Aller en bas
 
On_Sprite_Click N,L
Revenir en haut 
Page 2 sur 2Aller à la page : Précédent  1, 2

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos souhaits d'amélioration de Panoramic-
Sauter vers: