Всех приветствую, сегодня попробую разъяснить основы PyGame, библиотеки для языка Python.
Первым действием будет установка библиотеки. Для ее установки нажимаем Win + R, в открывшееся окно пишем - pip install pygame.
1. Основы
Подключаем библиотеку - import pygame. После этого создадим простой цикл:
Python:
import pygame #Импортируем библиотеку
from pygame.locals import * #Импортируем названия/типы и тд
def main(): #Создаем основную функцию
IsWorking = True #Добавляем переменную для цикла
pygame.init() #Инитиализируем pygame
screen = pygame.display.set_mode((640, 480)) #Задаем параметры окна set_mode((x, y), flags, depth)
screen.fill((0, 150, 200)) #Заполняем окно цветом fill((r, g, b), rect, flags)
pygame.display.flip() #Обновляем дисплей (иначе все что мы делали не отобразится)
while IsWorking: #Пока наша переменная равна True цикл работает
for event in pygame.event.get(): #Создаем цикл event`ов pygame`a (нажатие клавиш, выход и тд)
if event.type == QUIT: #Если текущий event = нажатию на кнопку закрытия окна
IsWorking = False #Приравниваем нашу переменную к False, чтобы завершить цикл
pygame.display.update() #Обновляем дисплей до завершения цикла
pygame.quit() #Заканчиваем работу с pygame
if __name__ == '__main__': #Запускаем основную функцию
main()
Чтобы задать название нашему окну, прописываем эту строку
pygame.display.set_caption('Название') #Задаем название нашему окну
Во всех играх есть FPS (Frames per second). Чтобы добавить его в PyGame, нужно создать переменную с внутри игровым временем, а после задать количество FPS.
clock = pygame.time.Clock() #Внутриигровое время
clock.tick(60) #Количество фреймов в секунду (FPS)
#Ставить после display.update()
2. Работа с изображениями
Для загрузки изображений в PyGame есть модуль - image.load("путь до картинки").
image = pygame.image.load("golf.png") #Загружаем картинку
Остальные функции модуля image -
pygame.image — pygame v2.6.0 documentation (noad)
Добавим 2 переменные - X и Y, они нужны для обозначения начальной точки изображения по X и Y.
У меня они будут равны 100.
Чтобы отобразить ее, используем blit surface`a - screen.blit(image, (X, Y)) # blit(картинка, (x, y))
Советую ознакомиться с surface`ом pygame`a -
pygame.Surface — pygame v2.6.0 documentation (noad)
В итоге получится такой код:
Python:
import pygame #Импортируем библиотеку
from pygame.locals import * #Импортируем названия/типы и тд
def main(): #Создаем основную функцию
IsWorking = True #Добавляем переменную для цикла
pygame.init() #Инитиализируем pygame
clock = pygame.time.Clock() #Внутриигровое время
pygame.display.set_caption('PyGame Lib') #Задаем название нашему окну
screen = pygame.display.set_mode((500, 500)) #Задаем параметры окна set_mode((x, y), flags, depth)
screen.fill((0, 150, 200)) #Заполняем окно цветом fill((r, g, b), rect, flags)
pygame.display.flip()
X = 100
Y = 100
image = pygame.image.load("golf.png") #Загружаем картинку
image = pygame.transform.scale(image, (100, 100)) #Масштабируем изображение
while IsWorking: #Пока наша переменная равна True цикл работает
for event in pygame.event.get(): #Создаем цикл event`ов pygame`a (нажатие клавиш, выход и тд)
if event.type == QUIT: #Если текущий event = нажатию на кнопку закрытия окна
IsWorking = False #Приравниваем нашу переменную к False, чтобы завершить цикл
screen.blit(image, (X, Y)) #Помещаем изображение на экран
pygame.display.update() #Обновляем экран
clock.tick(60) #Устанавливаем задержку
pygame.quit() #Заканчиваем работу с pygame
if __name__ == '__main__': #Запускаем основную функцию
main()
3. Перемещение изображения
На самом деле тут ничего трудного нет, добавляем проверку на новый тип KEYDOWN, а после проверяем какая кнопка нажата.
В коде это выглядит вот так:
Python:
if event.type == KEYDOWN: #Если любая из кнопок нажата
if event.key == K_LEFT: #Левая стрелка
x_moving = -2 #Приравниваем переменную отвечающую за перемещение к -2 (влево на 2 пикселя)
elif event.key == K_RIGHT: #Правая стрелка
x_moving = 2 #Вправо на 2 пикселя
elif event.key == K_UP: #Верхняя стрелка
y_moving = -2 #Перемещение вверх на 2 пикселя
elif event.key == K_DOWN: #Нижняя стрелка
y_moving = 2 #Вниз на 2 пикселя
if event.type == KEYUP: #Если любая кнопка отжата
if event.key == K_LEFT or event.key == K_RIGHT or event.key == K_UP or event.key == K_DOWN: #Проверка "отжатости" кнопок
x_moving = 0 #Эта проверка нужна для остановки движения
y_moving = 0
X += x_moving #Прибавляем к X 2 пикселя (+-)
Y += y_moving #Прибавляем к Y 2 пикселя (+-)
Обязательно нужно перенести screen.fill((r, g, b)), чтобы изображение не оставалось на экране (иначе изображение будет "тянуться" за собой)
Python:
screen.fill((0, 150, 200)) #Заполняем окно цветом fill((r, g, b), rect, flags)
screen.blit(image, (X, Y))
pygame.display.update()
clock.tick(60)
4. Добавление условных стен
Тут так же все просто, нужно просто проверять в каком месте наше изображение.
Python:
if X > 0 and X <= (500 - 100): # Если позиция по X не возле стен
X += x_moving #Прибавляем к X 2 пикселя (+-)
elif X < 1: #Если X < края левой стены
X += 2
elif X > (500 - 100): #Если X > края правой стены
X -= 2
if Y > 0 and Y <= (500 - 100): # Если позиция по X не возле стен
Y += y_moving #Прибавляем к Y 2 пикселя (+-)
elif Y < 1: #Если Y < край верхней стены
Y += 2
elif Y > (500 - 100): #Если Y > края нижней стены
Y -= 2
5. Вывод текста на экран
Создаем новую функцию:
Python:
def msg(screen, text):
textsize = pygame.font.Font('freesansbold.ttf',50) #Добавляем шрифт
textsurface = textsize.render(text, True, (0,0,0)) #"Добавляем на картинку текст"
textrect = textsurface.get_rect() #Получаем размеры
textrect.center = ((500/2),(500/2)) #Устанавливаем центр (размер окна X/2, размер окна Y/2)
screen.blit(textsurface, textrect) #Добавляем на экран
pygame.display.update() #Обнавляем экран
Чтобы испытать ее, импортируем библиотеку time import time и добавим этот код перед screen.fill((0, 150, 200))
:
Python:
if X < 1 or X > (500 - 100) or Y < 1 or Y > (500 - 100): #Проверка на стены
msg(screen, "Стена") #Выводим сообщение "Стена"
time.sleep(0.5) #Останавливаем скрипт на 0.5 секунды
В итоге получилось маленькое приложение, в котором изображение может передвигаться, но не может выйти за пределы стен.
При столкновении со стеной, выводится текст "Стена".
Исходник -
Yandex
VT (Python) -
https://www.virustotal.com/gui/file...db38554a541f7d94d279aa97da70e9f29ba/detection