This repository has been archived by the owner on Mar 5, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathui.py
174 lines (150 loc) · 7.48 KB
/
ui.py
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
################################################################################
# #
# ui.py : Module qui contient des fonctions permettant d'afficher différentes #
# interfaces et qui contrôle les évènements de la fenêtre du jeu #
# (principalement ceux générés par la souris) #
# #
################################################################################
import time
from sdl2 import *
import display
# ============================================================================ #
# CONSTANTES #
# ============================================================================ #
# Valeur renvoyée par certaines fonctions de ce module indiquant à l'appelant
# que l'utilisateur souhaite fermer la fenêtre du jeu et qu'il faut donc arrêter
# le programme
SIG_CLOSE_WINDOW = -1
# ============================================================================ #
# FONCTIONS #
# ============================================================================ #
def Init():
# Fonction qui initialise l'interface graphique en initialisant le sous-système
# évènement et également le module display
# AUCUN PARAMÈTRE
if SDL_InitSubSystem(SDL_INIT_EVENTS) != 0:
raise Exception("Erreur d'initialisation de SDL2 (Évènements) : " +
SDL_GetError().decode())
display.Init()
# ============================================================================ #
def WaitClick(board, ui, data):
# Fonction qui attend un clic dans la fenêtre et renvoit ses coordonnées (ou
# SIG_CLOSE_WINDOW si la fenêtre a été fermée)
# PARAMÈTRES:
# board : tableau 2D des cases du plateau à afficher derrière l'interface
# ui : valeur indiquant quelle interface doit être affichée
# data : données supplémentaires à transmettre à display.DrawUI()
# Initialisation des différentes variables
event = SDL_Event()
# Variables de contrôle de la fréquence de raffraîchissement
lastDraw = 0
needDraw = True
# Coordonnées du curseur dans la fenêtre et statut du bouton gauche
mouse_x = -1
mouse_y = -1
mouse_dw = False
while True:
# Demande à la SDL si un évènement s'est produit et le cas échéant le
# traite en fonction des informations qu'il contient pour suivre les
# déplacements et les clics de la souris
while SDL_PollEvent(event) != 0:
if event.type == SDL_WINDOWEVENT:
# L'utilisateur veut fermer la fenêtre, on renvoie
# SIG_CLOSE_WINDOW pour indiquer que le programme doit s'arrêter
if event.window.event == SDL_WINDOWEVENT_CLOSE:
return SIG_CLOSE_WINDOW
# La souris quitte la fenêtre, on réinitialise les variables
elif event.window.event == SDL_WINDOWEVENT_LEAVE:
mouse_x = -1
mouse_y = -1
mouse_dw = False
needDraw = True
# La fenêtre revient au 1er plan, on doit réafficher son contenu
elif event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED:
needDraw = True
# La souris a été déplacée dans la fenêtre
elif event.type == SDL_MOUSEMOTION:
mouse_x = event.motion.x
mouse_y = event.motion.y
mouse_dw = bool(event.motion.state & SDL_BUTTON_LMASK)
needDraw = True
# Le bouton gauche de la souris est pressé
elif event.type == SDL_MOUSEBUTTONDOWN:
if event.button.button == SDL_BUTTON_LEFT:
mouse_x = event.button.x
mouse_y = event.button.y
mouse_dw = True
needDraw = True
# Le bouton gauche de la souris est relaché = clic
elif event.type == SDL_MOUSEBUTTONUP:
if event.button.button == SDL_BUTTON_LEFT:
return (event.button.x, event.button.y)
# Affiche le plateau et l'interface graphique tout en faisant en sorte
# d'alléger la charge processeur en ne raffraîchissant l'affichage que
# lorsque c'est nécessaire et à la fréquence maximale de 60Hz (fréquence
# de raffraîchissement des écrans la plus commune)
if needDraw and (time.time() - lastDraw) >= 1/60:
display.DrawBoard(board)
display.DrawUI(ui, mouse_x, mouse_y, mouse_dw, data)
display.UpdateWindow()
needDraw = False
lastDraw = time.time()
else:
time.sleep(1/120)
return
# ============================================================================ #
def WaitPlay(board, possibilities, playerColor):
# Fonction qui attend qu'un joueur joue son tour et renvoie les coordonnées du
# pion qu'il a posé
# PARAMÈTRES:
# board : tableau 2D qui représente les cases du plateau
# possibilities : liste des cases où le joueur peut placer un pion
# playerColor : couleur des pions du joueur
while True:
click = WaitClick(board, display.UI_MODE_INGAME,
[possibilities, playerColor])
# Si l'utilisateur ferme la fenêtre, on transmet le signal
if click == SIG_CLOSE_WINDOW:
return SIG_CLOSE_WINDOW
else:
# On calcule les coordonnées de la case qui a été sélectionnée
tile_x = int((click[0]-32) / 66)
tile_y = int((click[1]-32) / 66)
# On vérifie si le joueur peut jouer sur cette case, si c'est le
# cas on renvoit ses coordonnées
for possibility in possibilities:
if possibility[0] == tile_x and possibility[1] == tile_y:
return possibility
return
# ============================================================================ #
def DisplayScores(board, scores):
# Fonction qui affiche l'interface des scores, avec 2 boutons pour lancer une
# nouvelle partie ou quitter le jeu
# Renvoie SIG_CLOSE_WINDOW quand le joueur ferme la fenêtre ou clique sur le
# bouton "Quitter le jeu"
# Renvoie None si le joueur clique sur le bouton "Nouvelle partie"
# PARAMÈTRES:
# board : tableau 2D qui représente les cases du plateau
# scores : liste qui contient le score de la partie qui vient de se finir
while True:
# On attend un clic du joueur
click = WaitClick(board, display.UI_MODE_SCORES, scores)
# Si le joueur a fermé la fenêtre on transmet le signal
if click == SIG_CLOSE_WINDOW:
return SIG_CLOSE_WINDOW
else:
# Si le joueur a cliqué sur "Nouvelle partie", on renvoit None
if display.MouseIn(click[0], click[1], 70, 295, 370, 408):
return
# Si le joueur a cliqué sur "Quitter le jeu", on renvoit le signal
# SIG_CLOSE_WINDOW
if display.MouseIn(click[0], click[1], 328, 521, 370, 408):
return SIG_CLOSE_WINDOW
return
# ============================================================================ #
def Quit():
# Fonction qui nettoie le module display et quitte le sous-système évènement de
# la SDL
# AUCUN PARAMÈTRE
display.Quit()
SDL_QuitSubSystem(SDL_INIT_EVENTS)