Partage
  • Partager sur Facebook
  • Partager sur Twitter

[pygame]clic dans subsurface -> surface

Sujet résolu
Anonyme
    16 novembre 2014 à 14:15:32

    Bonjour à tous, j'ai fait une interface graphique fullscreen et dedans une subsurface de mon root (surface mère). tout est parfait les calculs de positions partent bien de ma subsurface fenetre, mais j'aimerai récupérer le clic en dehors de fenetre, donc sur root car j'ai mis des boutons (avec rect, tres rudimentaire :D ) dans mon root et je ne peux pas les mettre dans fenetre (je ne veux meme pas).

    la méthode pygame.mouse.get_pos() me pose problème car elle se réfère (j'ai testé) à fenetre et pas à root.

    que faire ?

    Merci de votre aide, Folaefolc

    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2014 à 15:25:00

      Impossible ...

      Poste ton code stp.

      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

      Anonyme
        16 novembre 2014 à 15:27:25

        sur ? vraiment sur que tu veux le code ?

        d'accord :

        #-*-coding: utf8-*
        
        import  os
        import  time
        import  pygame
        import  random
        import  pickle
        import  tarfile
        import  socket
        import  tkinter.messagebox
        import  tkinter.filedialog
        import  PIL
        from    ia                    import *
        from    PIL                   import Image as PilImage
        from    life                  import *
        from    tkinter               import *
        from    tkinter.colorchooser  import *
        from    random                import *
        from    niveau                import *
        from    bdd_co                import *
        from    math                  import *
        from    pygame.locals         import *
        from    constantes            import *
        from    commerces_p           import *
        from    threading             import Thread
        from    BModules.reader       import Reader
        from    BModules.progress_bar import *
        from    BModules.discussion   import *
        
        def jeu_boubouilles(fenetre, choix, dossier_personnage, peacefull, fps, volume_son_j, creatif, root, rcenter, r):
        	#Paramètres de la fenêtre
        	nombre_sprite_cote = 20 #en fait on a 20 sur 15 mais pour la taille de la fenetre on dit que l'on en a 20 sur 20 
        	taille_sprite      = 30
        	cote_fenetre       = nombre_sprite_cote * taille_sprite
        
        	serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        	
        	#tres important :
        	var_gravite = 0.16
        	pt_vie      = 50
        
        	#variables
        	sac, objet, tresors    = {}, [], []
        	nourriture, cache      = [], ""
        	sac["Equipement"]      = "Epée de pierre, Armure légère, Tongues" #ah ah trop drôle !
        	blocs_ = {
        	'h' : 10, 's' : 10, 'e' : 10, 'a' : 10, 'q' : 10, 'm' : 10, 't' : 10, 'd' : 10,
        	"r" : 10, "y" : 10, "u" : 10, "i" : 10, "M" : 10, "v" : 10, "l" : 10, "k" : 10,
        	"g" : 10, "f" : 10, "x" : 10, "b" : 10, "n" : 10, "?" : 10, "." : 10, "/" : 10,
        	'0' : 99999999999999
        	}
        	img_tous_blocs         = {}
        	liste_pose_block_interdit = ['p', '1', '2', '3', '4', '5', '6', '7', '8']
        	liste_passe_a_travers  = ["0", "s", "q", "h"]
        	liste_pos_a_appliquer  = []
        	blacklist              = []
        	liste_images           = []
        	liste_ordre            = []
        	les_autres             = ""
        	message_mort           = "Vous êtes mort !\n\nPar chance, vous n'avez pas perdu votre inventaire, un habitant d'UrWorld l'a récupéré pour vous de manière à ce que personne ne vous le vole.\n\nLa prochaine fois faites attention avant de vous téléporter et de vous déplacer : vous pourriez tomber !"
        	xy_s, xy_s1, xi, yi    = 0, 0, 0, 0
        	debut, fin             = 0, 9 #on va changer fin 
        	x_monstre, y_monstre   = 0, 0
        	x_blit, y_blit         = 0, 0
        	x_souris, y_souris     = 0, 0
        	numero_niv, int_cpt    = 1, 0
        	ok_joy, continuer      = 0, 1
        	var_descend, choix     = 1, 1
        	x_perso, y_perso       = 30, 30
        	transparence, monnaie  = 250, 5000
        	mode, x, y, son_bool   = 0, 0, 0, 0
        	tuple_monstre          = (0, 0)
        	scroll_fond            = (0,0)
        	pos_equi_a_aff         = (x_perso + 27, y_perso + 9)
        	clique_gauche          = 0
        	cpt_time_tombe         = 0
        	cpt_blit_eau           = 0
        	continu_ajout          = 0
        	var_equipement         = 3
        	numero_classe          = 0
        	tresor_affiche_tour    = 0
        	Choix, trouvaille      = "", ""
        	quoi, pseudo           = "", ""
        	obj_courant            = "m"
        	backsl_t               = "\t\t\t"
        	classe_personnage      = "Poils"
        	classe_perso_decoule   = "Tissus"
        	equipement_personnage  = ""
        	armure_personnage      = ""
        	chaussure_personnage   = ""
        	arme_personnage        = ""
        	equipement_en_cours    = ""
        	situation_actuelle     = ""
        	reponse_thread         = ""
        	grd_msg_bjr            = "Bonjour toi !"
        	son_bool               = True
        	pelle                  = True
        	appel_menu_tk          = False
        	mort                   = False
        	en_reseau              = False
        	eau_proche             = False
        	commerce_proche        = False
        	personne_proche        = False
        	windowed_is            = False
        	
        	try:
        		#c'est une liste qui est renvoyée ; - 1 car le fichier n99.lvl ne doit pas etre prit en compte
        		fin = len(os.listdir("Niveaux" + os.sep)) - 2
        		with open('Niveaux' + os.sep + 'blacklist.txt', 'r') as blacklist_read:
        			blacklist = [int(x) for x in blacklist_read.read().split(';')]
        	except Exception as except_gen:
        		#si une erreur survient, on délare que fin vaut 9
        		fin = 9
        		pass
        	
        	with open("Parties" + os.sep + "pseudo.sav", "r") as nom_perso: #pour le pseudo
        		pseudo      = nom_perso.read()
        		grd_msg_bjr = "Bonjour toi ! Je vois que tu es nouveau ici, quel bon vent t'amène ?\nOh, tu es intéressé par la création et l'édification de ton monde ? Je vois ! Cela est effectivement très intéressant et constructif, et développe l'imagination !\n\nD'ailleurs, j'espère que tu en as de l'imagination, car celle-ci te servira tout au long de ton aventure !\n\nTu n'entres pas dans un simple jeu de sand-box, des objectifs de quêtes / missions / synonyme-qui-te-plait sont à prévoir (et donc à atteindre !)\nDes PNJ t'attendent pour te parler et te donner des idées et conseils !\n\nEdifier son monde est une bonne chose, mais il est vrai que le partager l'est encore plus, rejoins donc tes amis grâce à un serveur en réseau local (utilisant ta connexion internet GRATUITEMENT, non accessible depuis un autre pc non connecté à ta box / modem).\n\nSi tu rencontres un problème, sache que la communauté est là pour toi et t'aider à faire des réalisations époustouflantes malgré l'espace réduit et le nombre limité de matériaux disponnibles, cela t'obligeant à redoubler de créativité et d'ingéniosité pour construire ton palais !\n\nBonne aventure `{}` !".format(pseudo)
        	with open("Personnage" + os.sep + "A" + os.sep + "arme.txt", "r") as lire_nom_arme:
        		arme_personnage = lire_nom_arme.read()
        
        	init_joy = pygame.joystick.get_count() #pour le joystick
        	if init_joy > 0:
        		jeu_stick = pygame.joystick.Joystick(0)
        		jeu_stick.init()
        		print("      - Joystick Caractéristiques -")
        		print("Axes       ::  " + jeu_stick.get_numaxes())
        		print("Boutons    ::  " + jeu_stick.get_numbuttons())
        		print("Trackballs ::  " + jeu_stick.get_numballs())
        		print("Hats       ::  " + jeu_stick.get_numhats() + "\n\n")
        
        	def souris_ou_t_es(fenetre):
        		x_souris, y_souris = pygame.mouse.get_pos()
        		#x_souris = (x_souris // 30) * 30
        		#y_souris = (y_souris // 30) * 30
        		fenetre.blit(arme_h_g, (x_souris, y_souris))
        		pygame.mouse.set_visible(False)
        		return (x_souris, y_souris)
        
        	while continuer:
        		#gestion des évenements
        		for evennements_fenetre in pygame.event.get():
        			if evennements_fenetre.type == MOUSEBUTTONDOWN:	
        				if evennements_fenetre.button == 5: #la molette descend
        					equip_a_aff = molette_("bas", situation_actuelle)
        				elif evennements_fenetre.button == 4: #la molette monte
        					equip_a_aff = molette_("haut", situation_actuelle)
        				elif evennements_fenetre.button == 1:
        					clique_gauche = 1
        					#clic, donc on pose un bloc là où on a cliqué !
        					x_blit = evennements_fenetre.pos[0] // 30
        					y_blit = evennements_fenetre.pos[1] // 30
        					if  y_blit <= 14 and x_blit <= 19 and (numero_niv not in blacklist or obj_courant == "0") \
        					and blocs_[obj_courant] > 0:
        						if structure_niveau[y_blit][x_blit] not in liste_pose_block_interdit:
        							if structure_niveau[y_blit][x_blit] in list(blocs_.keys()):
        								#le bloc existe, on met 1 bloc en plus dans l'inventaire
        								blocs_[structure_niveau[y_blit][x_blit]] += 1
        							else:
        								#le bloc n'existe pas dans l'inventaire, on l'ajoute donc
        								blocs_[structure_niveau[y_blit][x_blit]] = 1
        							#on enlève 1 pour le bloc POSé:
        							if blocs_[obj_courant] - 1 >= 0:
        								blocs_[obj_courant] -= 1
        							if obj_courant == 'e':
        								structure_niveau[y_blit][x_blit] = "e"
        								if structure_niveau[y_blit][x_blit] == "e":
        									cpt_blit_eau = 0
        									#i = y_blit
        									#j = x_blit
        									structure_niveau = mettre_eau(structure_niveau, cpt_blit_eau, y_blit, x_blit)
        							else:
        								structure_niveau[y_blit][x_blit] = obj_courant
        
        					#bibli, planche, toit, sable, eau, terre, herbe, minerai d'or, vide
        					#"q",   "m",     "t",  "d",   "e", "s",   "h",   "a",          "0"
        					if   evennements_fenetre.pos[0] >= 137 and evennements_fenetre.pos[0] <= 137 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[0] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 1 and evennements_fenetre.pos[0] <= 137  + 37 * 1 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[1] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 2 and evennements_fenetre.pos[0] <= 137  + 37 * 2 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[2] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 3 and evennements_fenetre.pos[0] <= 137  + 37 * 3 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[3] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 4 and evennements_fenetre.pos[0] <= 137  + 37 * 4 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[4] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 5 and evennements_fenetre.pos[0] <= 137  + 37 * 5 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[5] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 6 and evennements_fenetre.pos[0] <= 137  + 37 * 6 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[6] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 7 and evennements_fenetre.pos[0] <= 137  + 37 * 7 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = liste_ordre[7] #affectation
        					elif evennements_fenetre.pos[0] >= 137 + 37 * 8 and evennements_fenetre.pos[0] <= 137  + 37 * 8 + 36 \
        					and  evennements_fenetre.pos[1] >= 565 and evennements_fenetre.pos[1] <= 600:
        						obj_courant = "0" #n'est pas dans liste_ordre donc on met juste "0", car c'est le vide 
        					#equipement
        					equip_a_aff = equipement_def(equip_a_aff)
        			elif evennements_fenetre.type == MOUSEBUTTONUP:				
        				if   evennements_fenetre.button == 1:
        					#clic gauche
        					#on relache la souris donc on met à false le 'booleen' qui dit que l'on peut
        					#blitter en continue dans MOUSEMOTION
        					clique_gauche = 0
        					#on construit ici, c'est plus simple 
        					construire(numero_niv, structure_niveau)
        					#equipement
        					equip_a_aff = equipement_def(equip_a_aff)
        					#fond herbeu
        					fenetre.blit(fond_herbe, (0, 450))
        					#on affiche les blocs, car il y a sans doute eu un changement
        					fenetre.blit(liste_images[0], (137 + 37 * 0, 565))
        					fenetre.blit(liste_images[1], (137 + 37 * 1, 565))
        					fenetre.blit(liste_images[2], (137 + 37 * 2, 565))
        					fenetre.blit(liste_images[3], (137 + 37 * 3, 565))
        					fenetre.blit(liste_images[4], (137 + 37 * 4, 565))
        					fenetre.blit(liste_images[5], (137 + 37 * 5, 565))
        					fenetre.blit(liste_images[6], (137 + 37 * 6, 565))
        					fenetre.blit(liste_images[7], (137 + 37 * 7, 565))
        					#mise à jour des 'compteurs'
        					inventaire_blocs_act(blocs_, font, fenetre, liste_ordre)
        					#maj de l'écran
        					pygame.display.flip()
        					#################################################################################################################
        					#redéfinir clik par rapport à la position du clic mais sur root et pas sur fenetre ! ! !
        					"""clik = 0
        					if  clik[0] >= rcenter[0] - 280 and clik[0] <= rcenter[0] - 280 + 43 \
        					and clik[1] >= 10 and clik[1] <= 25:
        						if son_bool:
        							son_bool = False
        							pygame.mixer.music.set_volume(0)
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] - 280, 10, 43, 15))
        							pygame.draw.rect(root_, (180, 20, 20), (rcenter[0] - 280 + 1, 10, 20, 15))
        						elif not son_bool:
        							son_bool = True
        							pygame.mixer.music.set_volume(volume_son_j)
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] - 280, 10, 43, 15))
        							pygame.draw.rect(root_, (20, 180, 20), (rcenter[0] - 280 + 22, 10, 20, 15))
        					if  clik[0] >= rcenter[0] + 120 and clik[0] <= rcenter[0] + 120 + 43 \
        					and clik[1] >= 10 and clik[1] <= 25:
        						if peacefull:
        							peacefull = False
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] + 120, 10, 43, 15))
        							pygame.draw.rect(root_, (180, 20, 20), (rcenter[0] + 120 + 1, 10, 20, 15))
        						elif not peacefull:
        							peacefull = True
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] + 120, 10, 43, 15))
        							pygame.draw.rect(root_, (20, 180, 20), (rcenter[0] + 120 + 22, 10, 20, 15))
        					if  clik[0] >= rcenter[0] + 510 and clik[0] <= rcenter[0] + 510 + 43 \
        					and clik[1] >= 10 and clik[1] <= 25:
        						if creatif:
        							creatif = False
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] + 510, 10, 43, 15))
        							pygame.draw.rect(root_, (180, 20, 20), (rcenter[0] + 120 + 1, 10, 20, 15))
        						elif not creatif:
        							creatif = True
        							pygame.draw.rect(root_, (140, 140, 140), (rcenter[0] + 510, 10, 43, 15))
        							pygame.draw.rect(root_, (20, 180, 20), (rcenter[0] + 120 + 22, 10, 20, 15))"""
        				elif evennements_fenetre.button == 3:
        					#clique droit
        					#on se téléporte au lieu du clique
        					if evennements_fenetre.pos[1] < 450:
        						if structure_niveau[(evennements_fenetre.pos[1] // 30)][(evennements_fenetre.pos[0] // 30)] not in liste_pose_block_interdit:
        							#on ne se téléporte pas si il y a le bloc indestructible
        							x_perso, y_perso = (evennements_fenetre.pos[0] // 30) * 30, (evennements_fenetre.pos[1] // 30) * 30
        							if structure_niveau[y_perso // 30 + 1][x_perso // 30] in liste_passe_a_travers:
        								#on descend, c'est le système de gravité !
        								var_descend = 1
        								while structure_niveau[y_perso // 30 + var_descend + 0][x_perso // 30] in liste_passe_a_travers:
        									#tant qu'il y a du vide dessous toi
        									liste_pos_a_appliquer.append((y_perso // 30 + var_descend, x_perso // 30))
        									var_descend += 1
        								cpt_time_tombe = 0
        								for elt, val in enumerate(liste_pos_a_appliquer):
        									y_perso, x_perso = liste_pos_a_appliquer[elt] #elt est l'indice ici
        									y_perso *= 30
        									x_perso *= 30
        									time.sleep(var_gravite - cpt_time_tombe / 100) #on attend 0.16 secondes avant de continuer à tomber !
        									#mais ce temps va diminuer et donner un effet de gravité !
        									cpt_time_tombe += 1
        									fenetre.blit(perso, (x_perso, y_perso))
        									pygame.display.flip()
        								if creatif:
        									pt_vie -= len(liste_pos_a_appliquer) // 2.5
        								liste_pos_a_appliquer = [] #on le vide car sinon double téléportation, puis triple . . .
        					else:
        						#appel l'inventaire drap and drop
        						obj_courant = drag_and_drop_invent(fenetre, font, liste_ordre, liste_images, blocs_, img_tous_blocs)
        				elif evennements_fenetre.button == 2: #bouton du milieu (molette de la souris)
        					#on a récupéré le bloc et on l'a affecté comme bloc en cours d'utilisation
        					obj_courant = structure_niveau[(evennements_fenetre.pos[1] // 30)][(evennements_fenetre.pos[0] // 30)]
        			elif evennements_fenetre.type == MOUSEMOTION:
        				if xy_s1 > 450:
        					maj_inventaire(fenetre, font, blocs_, liste_images)
        					#mouvement permanent de la souris
        					xy_s, xy_s1 = souris_ou_t_es(fenetre)
        				x_blit = evennements_fenetre.pos[0] // 30
        				y_blit = evennements_fenetre.pos[1] // 30
        				if clique_gauche and not creatif: #en fait on est en créatif quand meme dans ce cas ci 
        					if  y_blit <= 14 and x_blit <= 19 and (numero_niv not in blacklist or obj_courant == "0") \
        					and blocs_[obj_courant] > 0:
        						if structure_niveau[y_blit][x_blit] not in liste_pose_block_interdit:
        							if structure_niveau[y_blit][x_blit] in list(blocs_.keys()):
        								#le bloc existe, on met 1 bloc en plus dans l'inventaire
        								blocs_[structure_niveau[y_blit][x_blit]] += 1
        							else:
        								#le bloc n'existe pas dans l'inventaire, on l'ajoute donc
        								blocs_[structure_niveau[y_blit][x_blit]] = 1
        							#on enlève 1 pour le bloc POSé:
        							if blocs_[obj_courant] - 1 >= 0:
        								blocs_[obj_courant] -= 1
        							structure_niveau[y_blit][x_blit] = obj_courant
        							cpt_blit_eau = 0
        							#i = y_blit
        							#j = x_blit
        							if obj_courant == 'e':
        								structure_niveau = mettre_eau(structure_niveau, cpt_blit_eau, y_blit, x_blit)
        if __name__ == "__main__":
        	input("Ce fichier contient la fonction principale du jeu. Lancez 'menu.py' ou\n'tester_le_jeu.py' pour démarrer le jeu UrWorld !")

        edit: j'ai enlever tout le code suceptible de ne pas t'interresser :) un peu trop long à mon gout

        Merci de ton aide !

        -
        Edité par Anonyme 16 novembre 2014 à 15:51:26

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 novembre 2014 à 16:55:45

          je vais faire autrement, en détectant les touches pressées, plus simple je trouve
          • Partager sur Facebook
          • Partager sur Twitter

          [pygame]clic dans subsurface -> surface

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown