Bonjour à tous !


Je suis en train de créer un jeu d'infiltration, certes rudimentaire, mais qui, dans l'idée, disposerait tout de même de la base de ce genre de jeux: un cône de détection pour des gardes.

Voilà pour le moment mon programme:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()





Le problème étant, qu'actuellement, la détection souffre de quelques bugs, et, pour les triangles, la comparaison des coordonnées ne semble pas fonctionner. Serait-il possible de trouver une méthode plus fiable ?
Ps: Je tiens à rappeler que ce sont là des cônes de vision, et non pas des rectangles, car j'ai vu plusieurs astuces quant à l'utilisation de la méthode find_overlapping, mais celle-ci ne s'adresse qu'aux rectangles, et non pas aux trianlges...

Merci d'avance !