1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
from tkinter import*
from math import*
# Cette partie sert à déterminer dans quelle position est le garde.
gauche = False
droite = False
haut = False
bas = False
#Cette partie sert à déterminer les coordonnées d'origine du garde.
y1=250
x1=250
#Cette partie sert à déterminer les coordonnées d'origine du joueur.
x2=100
y2=100
#Cette fonction sert à déplacer le garde, en créant et en modifiant également le champ de vision, et à détecter.
def deplacement (evt):
#Cette partie permet de modifier les valeurs des variables suivantes:
global detecte
global x1
global y1
global x2
global y2
global gauche
global droite
global haut
global bas
global angle
drawzone.delete(ALL) #On commence par nettoyer le canevas, pour éviter les superpositions des objets.
player=drawzone.create_oval(x2,x2,x2+10,y2+10, fill="blue") #On recrée le joueur à sa place initiale. On ne le met pas à la fin, car ses coordonnées interviennent dans la détection.
if evt.keycode==38: #Si jamais on presse la flèche directionnelle "Haut"
detecte=0 #Ce petit ajout permet d'éviter le flood de "détectés" dans le moniteur.
haut=True # Le garde passe en position haute
gauche = False
droite = False
bas = False
#On modifie les coordonnées du garde
y1=y1-5 #Coordonnées en y du garde
xf1=x1-a*y1 #Coordonnées en x du premier point du champ de vision
yf1=0 #Cordonnées en y du premier point du champ de vision
xf2=x1+a*y1 #Coordonnées en x du second point du champ de vision
yf2=0 #Coordonnées en y du second point du champ de vision
#On recrée le champ de vision
field2=drawzone.create_polygon(xf1, 0,xf2, 0, x1, y1, fill="yellow")
#On recrée le garde (après la champ de vision pour ne pas que celui-ci ne l'efface partiellement)
point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
#Cette partie sert à détecter le joueur
#>>>>>>> LE PROBLEME EST ICI <<<<<<<< !!!!
if x2>=xf1 and x2<=xf2 and y2>=yf2 and y2>=yf2 and y1>=y2:
#Cela nous donne un champ de vision effectif RECTANGULAIRE, ce qui fait que si jamais le joueur est placé juste à côté du garde (en fait, entre le champ de vision et la courbe y=yf1 ou y=yf2), il sera quand même détecté, donc pour se faufiler c'est... Mort. Et ça m'ennuie.
print("detecte")
detecte = 1
elif evt.keycode==40:
detecte=0
bas=True
gauche = False
droite = False
haut = False
y1=y1+5
xf1=a*500+x1-a*y1 #faisceau côté droit
yf1=500 # faisceau côté droit
xf2=-a*500+x1+a*y1 #faiseau côté gauche
yf2=500 # faisceau côté gauche
field1=drawzone.create_polygon(xf1, yf1, xf2, yf2, x1, y1, fill="yellow")
point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
if x2<=xf1 and x2>=xf2 and y2<=yf2 and y2<=yf2 and y1<=y2 and detecte==0:
print("detecte")
detecte = 1 #Ceci évite de se faire flooder par les "detecte" ;D
#Et on y retourne ! C'est plus ou prou la même chose pour les trois "elif qui suivent"
elif evt.keycode==39: #Garde se dirige vers la droite
detecte=0
droite=True
gauche = False
haut = False
bas = False
x1=x1+5
xf1= 500 # faisceau bas
yf1= a*500+y1-a*x1 # faisceau bas
xf2= 500 # faisceau haut
yf2= -a*500+y1+a*x1 #faisceau haut
field3=drawzone.create_polygon(xf1, yf1, x1, y1, xf2, yf2, fill="yellow")
point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
if x2>=xf1 and x2>=xf2 and y2<=yf1 and y2>=yf2 and detecte==0:
detecte = 1
print("detecte")
elif evt.keycode==37: #Garde se dirige vers la gauche
detecte=0
gauche=True
droite = False
haut = False
bas = False
x1=x1-5
xf1= 0 #faisceau haut
yf1= y1-a*x1 #faisceau haut
xf2= 0 #faisceau bas
yf2= y1+a*x1 #faisceau bas
field4=drawzone.create_polygon(xf1, yf1, x1, y1, xf2, yf2, fill="yellow")
point=drawzone.create_oval(x1-5,y1-5,x1+5,y1+5, fill="black")
if x2<=xf1 and x2<=xf2 and y2>=yf1 and y2<=yf2 & detecte==0:
detecte = 1
print("detecte")
drawzone.tag_raise(player) #On remet le joueur en premier plan pour des raisons évidentes de visibilité.
a= sqrt(3)/3 #Ceci est le coefficient de chaque droite qui compose le champ de vision, avec un angle de 60°
fen=Tk() # On installe la fenêtre
fen.geometry("500x500") #On donne ses dimensions
fen.bind("<Key>", deplacement) #On la lie à l'évènement clavier
drawzone=Canvas(height=500, width=500, bg="White") #On initie le canevas
drawzone.place(x=0,y=0)
point=drawzone.create_oval(245,245,255,255, fill="black") #On place le joueur
player=drawzone.create_oval(x2,y2,y2+10,y2+10, fill="blue") #On place le garde
fen.mainloop() |
Partager