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 ) 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.
#-*-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
je vais faire autrement, en détectant les touches pressées, plus simple je trouve
[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.
Python c'est bon, mangez-en.