-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
340 lines (279 loc) · 18.8 KB
/
main.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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
#
# ! При створюванні проекту використовувалось
# *
# * (офіційна документація pygame) === https://www.pygame.org/docs/tut/newbieguide.html
# * (безкоштовні шрифти від google) === https://fonts.google.com/
# * (безкоштовний сервіс анімацій, картинкок, відео) === https://www.istockphoto.com/
# * (Приклади інших робіт з бібліотекою pygame) === https://github.com/search?q=pygame
# *
# ! Гру створив MaKarastY
#
# ! ІМПОРТИ
from os.path import join # ? з'єднує елементи
# ? імпортуєм функцію часу, яка вітдає системний час в секундах
from time import time
from random import choice
# ? randint Випадкова цифра віт - до
# ? choice Виберає випадковий елемент із не порожньої послідовності.
# ! ПРОБУЄМО ІНІЦІАЛІЗУВАТИ БІБЛІОТЕКІ
try:
# * пайгейм
import pygame
except:
print(input('ПОМИЛКА ЗАВАНТАЖЕННЯ pygame')) # ? головна бібліотека
# * настройки
try:
# ? це данні типу кешу які спочатку моють одине значіння та можеть змінювати його, якщо процесс гри завершиться данні не збережуться
import налаштування as дата
except:
print(input('ПОМИЛКА ЗАВАНТАЖЕННЯ НАЛАШТУВАНЬ'))
# * функції та деякі спрайти
try:
# ? функції які безліч разів використовуються в коді, закинув іх в інший файл щоб скоротити синтаксис
from _ import функції
from _ import ворог # ? путлер та вибух (смерть)
from _ import зброя # ? приціл зброя та вибух
except:
print(input('ПОМИЛКА ЗАВАНТАЖЕННЯ ФУНКЦІЙ АБО СПРАЙТІВ'))
from os import listdir
# ? listdir все що знаходиться в папці
from os.path import isfile, join
# ? isfile перевіряє файл
# ? join з'єднує елементи
# ! ПОЧАТКОВА ІНІЦІАЛІЗВАЙІЯ БІБЛІОТЕКИ Pygame
pygame.init() # ? ініціалізуємо Pygame
pygame.font.init() # ? ініціалізуємо шрифти Pygame
# ! ШРИФТИ
# ? великий шрифт та маленький
шрифт_м = pygame.font.Font(join(дата.папка_з_датою, 'LeelawUI.ttf'), 16)
шрифт_в = pygame.font.Font(join(дата.папка_з_датою, 'LeelawUI.ttf'), 30)
# ! ІГРОВЕ ВІКНО
Гра = функції.Ініціалізуватив_вікно_гри(
дата.Гра_ширина, # ? висота екрану гри з файлу налаштувань
дата.Гра_висота, # ? висота екрану гри з файлу налаштувань
pygame.FULLSCREEN, # ? функція щоб гра була в повному екрану
(0, 0, 0), # ? колір фону
"Putler killer II" # ? назва вікна гри
)
# ! СПРАЙТИ
# ? ініціалізуємо приціл
курсор_з_прицiлом = зброя.приціл()
# ? ініціалізуємо зброю
Зброя = зброя.зброя()
# ? ініціалізуємо путлера
Ворог = ворог.путлер()
# ? ініціалізуємо спрайти
Спрайти = pygame.sprite.Group()
Спрайти_верх = pygame.sprite.Group()
# ? додаємо приціл, зброю, та путлера до спрайтів
Спрайти_верх.add(Зброя, курсор_з_прицiлом)
Спрайти.add(Ворог)
pygame.mouse.set_cursor((8, 8), (0, 0), (0, 0, 0, 0, 0,
0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0)) # ? Сховати курсор
# ! ЗМІННІ
Постріл = False # ? чи відбувається в данний момент постріл
гра_робить = True # ? чи прцює в данний момент гра, а саме аім карта
назва_кімнати = 'меню' # ? стартова комната (меню, гра, вихід)
color_i = 0 # ? змінна яка допомагає перебрати всю палітну кольорів
r, g, b = 0, 0, 0 # ? ініціалізуємо кольори
# ! ЗВУКИ
# ? завантажуємо звуки та робимо їх тихими
Звук_постріл = функції.Завантаити_звук('звуки/shot.wav', 0.02)
Звук_немаєПатронів = функції.Завантаити_звук('звуки/empty.wav', 0.03)
Звук_перезарядка = функції.Завантаити_звук('звуки/reload.wav', 0.03)
# ! КАРТИНКИ ТА ФОН
фон = функції.Завантаити_фон() # ? завантажуємо фон
# ? завантажуємо інші картинки
Картинка_статусбар = pygame.image.load(
join(дата.папка_з_датою, 'картинки/статусбар.png')
)
Картинка_лого = pygame.image.load(
join(дата.папка_з_датою, 'картинки/лого.png')
)
# ! ФОНОВА ПІСНЯ
# ? ініціалізуємо трек з файлу та робимо щоб він грав безкінечно
розташування = "_/звуки/музика/" # ? розташування папки з музикою
масив_пісні = [
# ? створюємо масив зі всіми піснями в папці
ф for ф in listdir(розташування) if isfile(join(розташування, ф))
]
функції.Завантаити_музику(f'звуки/музика/{choice(масив_пісні)}').play(-1)
# ? задаємо фоновій музиці низьку гучність, щоб вона не відволікала від ігрового процессу
pygame.mixer.music.set_volume(0.05)
# ! ДІЇ ПЕРЕД ЗАПУСКОМ ОСНОВНОЇ ЧАСТИНИ КОДУ
функції.Генерація_зірок() # ? генеруємо зірки
# ! ОСНОВНА ЧАСТИНА КОДУ ГРИ
while гра_робить: # ? цикл працює доти доки 'гра_робить = true'
# ! система бліку тексту
дата.ii += 1 # ? додати 1. ця змінна використовується для бліку 'тексту'
if дата.ii % 50 == 0: # ? робить так щоб цей код відтворювався через декілька овертів ціклу
if дата.блік: # ? якщо блік = false він зразу стане тру, але це працює не кожен раз
дата.блік = False
else:
дата.блік = True
# ? Обмеження частоти кадрів + оптимізація
pygame.time.Clock().tick(дата.FPS)
# ! ОБРОБНИК ПОДІЇ
for ПОДІЇ in pygame.event.get(): # ? івент = кожный події в грі по черзі
if ПОДІЇ.type == pygame.QUIT:
гра_робить = False # ? зупиняє гру якщо івент = вихід
# ! ОБРОБНИК ПОДІЇ НАТИСКАННЯ КНОПОК
if ПОДІЇ.type == pygame.KEYDOWN: # ? Події натискання кнопок
# ! ЯКЩО НАТИСНУТА КЛАВІША ESC
if ПОДІЇ.key == pygame.K_ESCAPE:
дата.ініціалізація_гри = False # ? деініціалізує гру
if назва_кімнати == 'гра': # * якщо користувач в грі
# ? очистити всі данні, вбивства тощо
функції.clear()
# ? зарядити максимальний боєзапас
Зброя.боєзапас = дата.Максимальний_боєзапас
Ворог.kill() # ? вбити путлера
Ворог = ворог.путлер() # ? створити нового ворога
# ? додати до спрайтів
Спрайти.add(Ворог)
назва_кімнати = 'меню' # ? змінити кімнату на меню
else: # * якщо користувач не в грі
# ? змінити кімнату на ( вихід )
назва_кімнати = 'вихід'
гра_робить = False # ? вимкнути цикл гри
# ! ЯКЩО НАТИСНУТИЙ ПРОБІЛ
if ПОДІЇ.key == pygame.K_SPACE:
# * якщо кімната гри = ( вихід )
if назва_кімнати == 'вихід':
# ? Почати гру ще раз
# ? очистити всі данні, вбивства тощо
функції.clear()
# ? зарядити максимальний боєзапас
Зброя.боєзапас = дата.Максимальний_боєзапас
Ворог = ворог.путлер() # ? створити нового ворога
# ? додати до спрайтів
Спрайти.add(Ворог)
# ? змінити кімнату на ( гра )
назва_кімнати = 'гра'
# * якщо кімната гри = ( меню )
if назва_кімнати == 'меню':
# ? змінити кімнату на ( гра )
назва_кімнати = 'гра'
# ! КНОПКИ МИШІ ЯКІ НАТИСКАЮТЬСЯ
# * х це кнопка під кільцем миші але в цьому проекті я її не використовую
Миш_Кнопка_Ліва, x, Миш_Кнопка_Права = pygame.mouse.get_pressed()
# ! КІМНАТА МЕНЮ
# * якщо кімната гри = ( меню )
if назва_кімнати == 'меню':
# ? додати фон до сцени
Гра.blit(фон, (0, 0))
функції.зірки(Гра) # ? рендерити зірки
# ? додаємо логотип до сцени
Гра.blit(Картинка_лого, (дата.СИСТЕМА_ширина /
4.5, дата.СИСТЕМА_висота / 4.5))
функції.меню(Гра, шрифт_в) # ? рендерити меню
pygame.display.update() # ? обновити дисплей
# ! КІМНАТА ГРА
# * якщо кімната гри = ( гра )
if назва_кімнати == 'гра':
if дата.ініціалізація_гри == False: # ? якщо гра не ініціалізована ініціалізвати
дата.ініціалізація_гри = True
# * перевірити чи натиснута ліва кнопка миші та в обоймі є патрони
if Миш_Кнопка_Ліва and Зброя.боєзапас > 0:
if Постріл == False: # * якщо не відбувається постріл, ФІКС бага коли користувач зажимає ліву кнопку миші та убиває всії
if pygame.sprite.collide_mask(
Ворог,
курсор_з_прицiлом
): # * якщо путлер та приціл доторкаються
Вибух = ворог.вибух() # ? ініціалізувати спрайт вибух
# ? додати спрайт вибух до спрайтів
Спрайти.add(Вибух)
дата.Ворог_k = [
дата.рахунок_ЗаВбивство * дата.рівень,
Вибух.rect.x,
Вибух.rect.y,
int(time())
] # ? записати кординати вбивства та час, показати напис KILL
дата.Ворог_k_pos = 0 # ? задати таймер 0
дата.Ворог_k_ = True # ? напис kill = да
Ворог.kill() # ? вбити ворога
Ворог = ворог.путлер() # ? створити нового ворога
Спрайти.add(Ворог) # ? додати до спрайтів
дата.убийств += 1 # ? вбивства + 1
if дата.убийств % дата.прокачувати_рівень_кожні == 0: # * перевірити чи пожна підвищити рівень
дата.рівень += 1
функції.Прорахувати_рахунок() # ? рахуємо рахунок
# ! ПОСТРІЛ
# * якщо натиснута ліва кнопка миші та користувач зараз не стріляє
if Миш_Кнопка_Ліва and Постріл == False:
if Зброя.боєзапас > 0: # * якщо боєзапас більше 0
Звук_постріл.play() # ? граємо звук пострілу
Постріл = зброя.постріл() # ? створити нового ворога
Спрайти.add(Постріл) # ? додати до спрайтів
дата.постріли += 1 # ? додати + до кількості пострілів
Зброя.боєзапас -= 1 # ? - 1 патрон
else: # * якщо боєзапас порожній
Звук_немаєПатронів.play() # ? граємо звук порожнього боєзапасу
# ! ПЕРЕВІРКА ЧИ КОРИСТУВАЧ СТРІЛЯЄ
if Миш_Кнопка_Ліва:
Постріл = True
else:
Постріл = False
if (
not Миш_Кнопка_Ліва
and
Миш_Кнопка_Права
and
Зброя.боєзапас == 0
): # * якщо не натиснута ліва кнопка миші та натиснута права кнопка миші та боєзапас порожній і користувач зараз не перезаряджає зброю
Звук_перезарядка.play() # ? граємо звук перезарядки
Зброя.боєзапас = дата.Максимальний_боєзапас
if (
Ворог.rect.x > дата.СИСТЕМА_ширина or
Ворог.rect.y > дата.СИСТЕМА_висота or
Ворог.rect.x < 1 - Ворог.Спрайт_розмір or
Ворог.rect.y < 1 - Ворог.Спрайт_розмір
): # * якщо вирог вийшов за екран
Ворог.kill() # ? вбити ворога
Ворог = ворог.путлер() # ? створити нового ворога
Спрайти.add(Ворог) # ? додати до спрайтів
дата.пропущенні += 1 # ? пропущенні путлери + 1
# * якщо пропущенний путлерів більше ніж можна пропустити
if дата.пропущенні == дата.максимально_пропущенних:
дата.ініціалізація_гри = False
назва_кімнати = 'вихід'
# ! АНІМАЦІЯ НАПИСУ KILL
if дата.Ворог_k_ == True:
дата.Ворог_k_pos += 1
# * Прибрати стару надпись KILL
if дата.Ворог_k[3] + 1 < int(time()):
# ? засунути за краї екран
дата.Ворог_k = [0, -200, -200, 0]
дата.Ворог_k_pos = 0
дата.Ворог_k_ = False
# ! ПОЧАТОК РЕНДЕРУ ГОЛОВНОЇ ЧАСТИНИ ГРИ ! #
# ! оновлення
Спрайти.update() # ? оновлюємо всі спрайти\об'єкти
Спрайти_верх.update() # ? оновлюємо всі спрайти\об'єкти які знаходяться вище інших
# ! рендер
Гра.blit(фон, (0, 0)) # ? додаємо фон до сцени
функції.зірки(Гра) # ? рендерим зірки
функції.пулі(Гра, Зброя.боєзапас)
# ? рендерим статусбар
функції.статусбар(Гра, Картинка_статусбар, шрифт_м)
# ? рендерим вбивство
функції.убивство(
Гра, шрифт_м, дата.Ворог_k[0], дата.Ворог_k[1], дата.Ворог_k[2], дата.Ворог_k[3])
Спрайти.draw(Гра) # ? рендерим всі спрайти
# ? рендерим всі спрайти які знаходяться вище інших
Спрайти_верх.draw(Гра)
# ! кінцеве оновлення
pygame.display.update() # ? оновлюємо дисплей
# ! КІНЕЦЬ РЕНДЕРУ ГОЛОВНОЇ ЧАСТИНИ ГРИ ! #
# ! ЕКРАН ЗАКЫНЧЕННЯ ГРИ
if назва_кімнати == 'вихід': # * якщо кімната гри = ( вихід )
if дата.ініціалізація_гри == False:
Ворог.kill() # ? убити путлера
дата.ініціалізація_гри = True
Гра.blit(фон, (0, 0)) # ? додаємо фон до сцени
функції.зірки(Гра) # ? рендеримо зірки
# ? рендерити закінчення гри
функції.гра_завершенна(Гра, шрифт_в, шрифт_м)
pygame.display.update() # ? оновлюємо дисплей
# ! Вихід зі гри
quit()