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
» Gestion d'un système client-serveur.
On_Sprite_Click N,L - Page 2 Emptypar Klaus Ven 17 Mai 2024 - 14:02

» item_index(résolu)
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Mar 14 Mai 2024 - 19:38

» Bataille terrestre
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Lun 13 Mai 2024 - 15:01

» SineCube
On_Sprite_Click N,L - Page 2 Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
On_Sprite_Click N,L - Page 2 Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
On_Sprite_Click N,L - Page 2 Emptypar papydall Jeu 9 Mai 2024 - 3:22

» select intégrés [résolu]
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
On_Sprite_Click N,L - Page 2 Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
On_Sprite_Click N,L - Page 2 Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
On_Sprite_Click N,L - Page 2 Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0(résolu)
On_Sprite_Click N,L - Page 2 Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
On_Sprite_Click N,L - Page 2 Emptypar Klaus Lun 6 Mai 2024 - 11:41

» @Jack
On_Sprite_Click N,L - Page 2 Emptypar Jack Mar 30 Avr 2024 - 20:40

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-45%
Le deal à ne pas rater :
PC Portable LG Gram 17″ Intel Evo Core i7 32 Go /1 To
1099.99 € 1999.99 €
Voir le deal

 

 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 : 12301
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 : 12301
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 : 12301
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 : 8611
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 : 7009
Age : 73
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 : 12301
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 : 8611
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 : 12301
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 : 8611
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 : 51
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 : 7009
Age : 73
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 : 12301
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 : 51
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 : 8611
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 : 12301
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: