Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Pygame]-Détecter la couleur ou l'on clique

Sujet résolu
4 avril 2011 à 2:38:37

Bonsoir ,

J'arrive a detecter si le clique de la souris se fait sur des surfaces .. rectangle généralement.

Mais comment faire si l'on veut detecter la couleur du pixel a l'endroit du clique ??
je n'arrive pas a trouver de méthode ..


Edit: en fait je viens de trouver la fonction : Surface.get_at ... désolé pour le post :s


Edit : J'ai tout de même un probleme .. je m'explique :

j'ai une surface coloré , je genere 4 rectangle en faisant pygame.draw.rect.. sa marche bien :


Image utilisateur

voila ensuite j'importe une image qui a des zone transparente et je la met au premier plan , voila le résultat:

Image utilisateur

donc quand j'essaye de detecter la couleur du pixel la ou je clique , si je clique sur le gris il me détecte les couleur d'en dessous ...

je ne vois pas comment parré le probleme ..

  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 12:21:55

utilise la surface de rendu ...
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

4 avril 2011 à 13:05:42

Et merci d'orthographier le verbe "cliquer" correctement, parce qu'il risque d'être répété assez souvent sur ce topic...
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
4 avril 2011 à 13:24:44

C'est Pygame que tu utilises ?



Si oui, je pense que tu peux trouver ton bonheur par ici : http://pygame.org/docs/ref/mask.html
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 13:26:00

Le titre du topic étant : « [Pygame]-Détecter la couleur ou l'on click », il y a de fortes chances... :-°
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
4 avril 2011 à 13:33:17

Oui pas faux ....


Bon bah du coup, avec le lien que j'ai rajouté en EDIT dans mon précédent post, tu devrais avoir ce qu'il faut.


Mais je dirais que tu dois découper ton mask en 4 pour appliquer chaque partie du mask à chaque carré de couleur.

Ou sinon, une autre option vu ce que tu fais, est de générer des ronds de couleurs et de tailles différentes sur un fond noir ...


Je ne vois pas quel est le but final mais pour ce à quoi cela ressemble, je trouverai ça plus simple.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 13:39:30

La solution de josmiley qui est d'utiliser la surface de rendu (je suppose pour la convertir en tableau de pixels et accéder directement au pixel qui a été cliqué) a quand même le mérite de fonctionner en toutes circonstances...
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
4 avril 2011 à 13:44:05

Dans ce cas, mettre tous les carrés dans un tableaux de pixel que l'on modifie en fonction des zones de transparences du mask ...

Là ou le mask est noir, on change la valeur des pixels du tableau, et on laisse les pixels correspondants aux carrés de couleur là ou il est transparent.
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 13:56:46

Mais pourquoi tu t'acharnes sur des carrés ?

Si le PO utilisait une surface créée à partir d'une image, tu ferais comment ?
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
4 avril 2011 à 14:21:01

Oula ouai ....

Après un petit pomme+F et en cherchant josmiley, j'ai trouvé le petit commentaire ...

Un peu dur ce midi !!!

Du coup évidemment c'est plus simple, je n'avais pas pensé à cette solution.

J'ai oublié ma ricoré ce matin je crois (je suis encore en mode ours qui hiberne)
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 18:49:11

Bonjour , et merci a tous pour vos réponses . Bon je me lance dans les test .. je vous tient au courant. !

je corrige le verbe cliquer également .. desolé

Et pour christophe , le but final est une sorte de jeu Simon
Image utilisateur .




edit :

@josmiley :

Citation : josmiley

utilise la surface de rendu ...



utilisé la surface de rendu , je crois bien que c'est ce que j'ai fait ..

Citation : christophe238

Si oui, je pense que tu peux trouver ton bonheur par ici : http://pygame.org/docs/ref/mask.html



je ne comprend pas trop l'utilité des mask .. je suis bien allé voir sur le site pygame et ailleur ..

Qu'elle est leur utilité ?
dans quel situation on s'en sert ? (pour l'instant je les imagines comme des calques dans Gimp ou phtoshop ...

:-° )



Si vous voulez testé par vous même :

Test Py-Simon2

vu qu'il est en construction une fois dans le menu faites : ---> New game ---> Easy , l'ordi fait sa séquence apres vous pourrez cliquer sur les couleur ..

dans le code , le probleme de détection de clique se situe a a partir de la ligne 298
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 avril 2011 à 20:26:05

Je pense que Josmiley parlait de ça, mais c'est pas moi le spécialiste :-°
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 21:24:41

Bon voila , probleme résolu .. encore un probleme de logique de ma part ...
j'explique les grandes lignes :

avant je faisais :


ma boucle :

- generation des carré des couleurs en arrieres plan
- gestion d'evenements et detection des cliques
- blit de l'image avec les ronds transparents (une sorte de calque)
- et le pygame display flip

et finalement en faisant sa :

- generation des carré des couleurs en arrieres plan
- blit de l'image avec les ronds transparents (une sorte de calque)
- gestion d'evenements et detection des cliques
- blit de l'image avec les ronds transparents (une sorte de calque)
- et le pygame display flip

Le probleme venait donc du fait que dans l'ordre de passage dans la boucle quand je cliquai il n'y avait pas encore mon image de blité mais seulement les carré de couleurs .. sa ma fait tilt d'un coup !
c'est vraiment idiot de ma part , maintenant sa me semble logique ..

vas falloir que je me penche un peu sur les mask et l'histoire des pixelarrays mais les docs en anglais , j'ai un peu de mal quand sa devient technique .........

Merci d'avoir prété attention a mon probleme
  • Partager sur Facebook
  • Partager sur Twitter
4 avril 2011 à 23:35:14

Citation : fred1599

Je pense que Josmiley parlait de ça, mais c'est pas moi le spécialiste :-°

non, en fait je voulais dire que le get_at() ne se fesait pas sur la bonne surface et qu'il fallait le faire sur la surface finale(après le blit donc) et non pas sur l'image des carrés colorés ^^

@PsyloW: je pense que t'as un peu abusé sur le menu flashy, c'est limite phychédélique ... :p
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

4 avril 2011 à 23:58:51

Flashy ??? :-° je ne vois pas de quoi tu parle *sifflote*
moi j'aime les délires psyché :p

c'est en attente de changement , je pensais au vieux jeu d'arcade quand j'ai fait sa ..
A terme dans les options je vais me débrouiller pour que le joueur puisse changer le thème complet : (couleur, déco, polices ..)

Dans les differents level qu'il y aura, j'ai pensé a des truc du style remplacer les couleurs par des images bien coloré dans le styles d'Andy Waroll ..

en mode hard il y aura plus de couleur .. et durant la séquence ou la séquence est jouer je pense la faire tourné pour augmenter le challenge ..

Autre idée .. le joueur gagne une séquence et hop la jauge a droite augmente une fois en haut il reçoit la un coup suplémentaire .. ou un replay qui permeterai de revoir la séquence ..

plus je fait le code plus j'ai d'idée en fait .. et au final on peut rendre le jeu Simon un petit peu plus sympa ..


@josmiley : Dis moi d'apres ce que j'ai vu tu as l'air de bien maitrisé Pygame.. Connaitrai tu un moyen de recuperer le pseudo du joueur .. un peu comme un champ 'Entry' dans Tkinter ... ?




  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 1:20:27

bha, j'ai codé un truc pour ça ...
http://www.pygame.org/project-Form-1571-3174.html

mais c'est pas encore documenté. Je vais mettre un bout de code ici, en fait c'est pas compliqué.
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

5 avril 2011 à 2:34:11

J'avais vu sa en me baladant, dans le forum .. j'avais pas fait le raprochement que c'etait toi l'auteur ^^

Par contre je l'avait download mais ne comprenant pas trop comment sa fonctionnait , j'etais passé a autre chose ..

Si tu pourra m'éclairer la dessus sa m'interresse bien ^^

ps: je viens encore de perdre 2h a cause de la meme erreur que tout a l'heure .. grrr je suis grave desfois
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 avril 2011 à 8:29:32

Citation

bha, j'ai codé un truc pour ça ...



J'ai essayé de le dézipper et pas moyen

Citation

Archive: /home/fred1599/Bureau/PygameReadWrite.zip
[/home/fred1599/Bureau/PygameReadWrite.zip]
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
zipinfo: cannot find zipfile directory in one of /home/fred1599/Bureau/PygameReadWrite.zip or
/home/fred1599/Bureau/PygameReadWrite.zip.zip, and cannot find /home/fred1599/Bureau/PygameReadWrite.zip.ZIP, period.

  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 8:47:34

Je confirme , jeviens d'essayer meme probleme au dézipage..

par contre la version 3.2 sa télécharge un fichier .py direct donc nikel .. doit y avoir un ptit bug
  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 12:06:04

hello,
j'ai eu un problème pour uploader sur plusieur site cette nuit mais c'est réglé ...
http://joel-murielle.perso.sfr.fr/PygameReadWrite.zip

tu update() l'objet Form en lui envoyant les evenements il faut donc l'inclure dans une boucle.
show() sert à l'afficher.

Form(pos,width,fontsize,height=None,font=None,bg=(250,250,250),fgcolor=(0,0,0),hlcolor=
(180,180,200),curscolor=(0xff0000),maxlines=0) ==> Rect

pos = (x,y) la position de la boite
width = largeur en pix
fontsize = la hauteur de la police
height = la hauteur de la boite en pix, si None alors height sera egale à la hauteur d' une ligne
font = nom de la fonte
bg = couleur de l'arriere plan ou un objet Surface
fgcolor = couleur du texte
hlcolor = couleur du surligneur
curscolor = couleur du curseur
maxlines = nombre max de nouvelles lignes, 0 = illimité

Form.cursor() : efface/affiche succesivement le curseur
Form.update(event) : update l'objet
Form.show() : affiche l'objet
Form.OUTPUT : est une propriétée et contient le résultat de l'entrée


voilà un exemple simple d'utilisation ...
import form
from pygame import *

font.init()
police = font.Font(font.get_default_font(),20)

scr = display.set_mode((500,50))

r = scr.blit(police.render('Enter Your Nick : ',1,(250,250,250)),(10,10))
display.update(r)

get_nick = form.Form((r.right+20,10),200,20,bg=(250,150,250),fgcolor=(50,50,50),hlcolor=(80,180,200),curscolor=(0xff0000),maxlines=1)
# on creee un objet Form qui sert a entrer du texte
while True:
    ev = event.wait() # catch l'evenement
    if ev.type == KEYDOWN and ev.key == K_RETURN: break # casse le while si appuie sur return
    get_nick.update(ev) # on update en envoyant l' evenement
    get_nick.show() # on affiche la boite

print get_nick.OUTPUT # contiend le texte entre par l'user

  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

5 avril 2011 à 12:24:34

Bonjour et merci pour l'explication !
C'est vraiment une chose qui manquait dans pygame..
je vais essayer de suite ;)

Edit: Et bien sa marche nikel tout sa ^^
Merci bien :)
  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 14:15:04

de rien,
j'vais pitetre faire un simon pour le fun ...
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

5 avril 2011 à 15:22:38

A mon avis sa va etre du Simon de "pro" que tu vas nous sortir ^^
;)

je suis curieux de voir sa ^^
  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 20:01:55

Citation : PsyloW

A mon avis sa va etre du Simon de "pro" que tu vas nous sortir ^^
;)

je suis curieux de voir sa ^^



non,non ... ^^
j'aime bien les codes courts. pour l'instant je l'ai fait en mode texte.

from random import randint

Game = True
SimonSeq = []
while Game:
    SimonSeq.append(randint(1,4))
    print SimonSeq
    PlayerSeq = []
    for x in range(len(SimonSeq)):
        PlayerSeq.append(int(raw_input(': ')))
        if PlayerSeq != SimonSeq[:len(PlayerSeq)]:
            Game = False
            break

  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

5 avril 2011 à 21:31:55

une petite question me viens quand je vois la ligne 11 (j'ai déja vu cette forme de syntaxe mais je ne comprend pas trop.. ):

if PlayerSeq != SimonSeq[:len(PlayerSeq)]:


c'est le fait de voir les : dans les crochets qui me pertube ..
  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 21:48:36

[:x]
ça signifie "depuis le début de la liste jusqu'à x"
[x:]
ça signifie "depuis x jusqu'à la fin de la liste"
donc [:] signifie ?
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

5 avril 2011 à 22:08:21

On peut dire qu'il représente une limite de recherche peut etre ..

Quand je vois ton code , je me dis que j'ai encore du boulot dans l'apprentissage du python .. j'ai l'impression que par moment je me prend la tete car je vois pas le probleme du bon coté..

edit : je viens de faire une belle découverte , avant pour savoir si ma souris survolai un choix du menu je me débrouillai de la sorte :

for event in pygame.event.get() :
            if event.type == MOUSEMOTION :
                if event.pos[0] > 180 and event.pos[0] < 415 and event.pos[1] > 240 and event.pos[1] < 260 :
                    choix_menu = 0
                if event.pos[0] > 180 and event.pos[0] < 415 and event.pos[1] > 300 and event.pos[1] < 320 :
                    choix_menu = 1
                if event.pos[0] > 230 and event.pos[0] < 360 and event.pos[1] > 360 and event.pos[1] < 385 :
                    choix_menu = 2
                if event.pos[0] > 230 and event.pos[0] < 360 and event.pos[1] > 420 and event.pos[1] < 440 :
                    choix_menu = 3
                if event.pos[0] > 230 and event.pos[0] < 360 and event.pos[1] > 480 and event.pos[1] < 500 :
                    choix_menu = 4


Ce qui devient fastisieux plus le menu augmente , pour calculer la postion de chaque teste je faisai un imprime ecran , j'allais dans GIMP et je notai les positions et taille ... :-° (on rigole pas svp :euh: )

et la en me promenant sur pygame.org j'ai découvert un moyen bien plus simple ... :

list_menu = [text2,text3,text4,text5,text6]
if event.type == MOUSEMOTION :
                for x in list_menu :
                    if x.collidepoint(event.pos[0],event.pos[1]):
                        print ('survol : {}'.format(x))


c'est un peu comme si tout les jours on doit allé au boulot a 30km de chez soi .. on s'y rend a pied jusqu'au jour ou l'on se rend compte qu'il y a le metro et le bus qui peut nous y emmener en quelque minute ..


c'est magique je trouve :p



on devrait faire un post comme sa :

" Mieux vaut tard que jamais!! ce que vous avez découvert bien trop tard en en python et qui vous a changer la vie !"
  • Partager sur Facebook
  • Partager sur Twitter
5 avril 2011 à 23:56:46

y a aussi ...
list_menu = [text2,text3,text4,text5,text6]
if event.type == MOUSEMOTION:
    item = Rect(event.pos,(0,0)).collidelist(list_menu)
    if item > -1:
        print 'survol du choix: ',item

  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

6 avril 2011 à 0:06:44

en gros sa creer un rect au niveau du curseur de la souris et verifie si il rentre en collision avec un element de la liste ?. c'est bien sa ?

je viens d'essayer , par contre Item ne prend pas de valeur .. moi sa m'ecris sa si je survol un élément :

survol du choix: 
survol du choix: 
survol du choix: 
survol du choix: 
survol du choix: 
survol du choix: 
survol du choix: 
psylow@Psy-Sys:~/Documents/Psymon$



pour recuperer la clé d'un élément de la liste j'ai utilisé sa :

if event.type == MOUSEMOTION :
    for z,x in enumerate(list_menu) :
        if x.collidepoint(event.pos[0],event.pos[1]):
            choix = z



Y a pas un moyen de récupere le nom d'un objet , de le transferer en chaine de charactere pour pouvoir l'afficher ensuite ?

je viens d'essayer d'utiliser ton exemple pour utilisé ton script Form

alors quand je l'essaye dans un fichier seul tout vas bien , mais la je viens d'essayer de l'incorporer a mon jeu , et a chaque fois je me retrouve avec une erreur de ce type :

psylow@Psy-Sys:~/Documents/Psymon$ python simon.py 
there is no soundcard
Traceback (most recent call last):
  File "simon.py", line 81, in <module>
    ev = event.wait() # catch l'evenement
AttributeError: event member not defined


EDIT : alors pour le fait que ton exemple marche seul mais pas dans mon jeu , je ne sais pas pourqoi .. mais pour qu'il marche dans le jeu , j'ai changer la ligne
ev = event.wait() # catch l'evenement


par sa :

ev = pygame.event.wait() # catch l'evenement
  • Partager sur Facebook
  • Partager sur Twitter
6 avril 2011 à 9:29:16

question 1: y avait une faute de frappe dans mon code et c'est pour python2.6

question 2: pas compris

question 3: tout dépend de l'import
tu as dû écrire 'import pygame' alors que j'ai fait 'from pygame import *'
  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en.