Как сделать меню в pygame

Добавил пользователь Евгений Кузнецов
Обновлено: 10.09.2024

Я хочу сделать игру, похожую на DopeWars в pygame, которая просто использует базовый интерфейс, чтобы сделать довольно интересную игру. Я хочу, чтобы при нажатии кнопки появлялось окно меню. С моим текущим кодом он появляется, когда я щелкаю мышью, но исчезает, как только я отпускаю кнопку мыши. Есть ли какой-нибудь способ сделать меню (в настоящее время просто rect) открытым до тех пор, пока я не нажму кнопку назад (еще не реализовано).

2 ответа

Я относительно новичок в python и сделал несколько полезных инструментов и несколько небольших игр w/ 10 спрайтов в python; основываясь на производительности, я думаю, что мой следующий логический шаг-это создание расширений C для повышения производительности в pygame. Мой первый начальный вопрос.

Да, это название было сформулировано не совсем правильно. Итак, вот что у нас есть - программа Python, использующая библиотеку pyGame, и мы делаем игру. Мы начинаем в среде меню main.py . Когда пользователь нажимает на одну из кнопок меню, выполняется действие. Программа проверяет наличие кликов.

В принципе, вам просто нужен способ сделать так, чтобы меню оставалось. Один из способов, которым я бы это сделал, - это просто сохранить состояние (меню выключено или включено) в логической переменной. Например:

Вам нужно будет добавить еще кое-что к этому (например, где должно быть расположение мыши и многое другое), Но общая идея состоит в том, чтобы сохранить состояние того, открыто меню или нет в переменной. Обычно, если это меню включено-выключено, используются логические значения, но целые числа можно использовать, если у вас есть несколько элементов. Скажите мне, работает ли это решение для вас.

Я рекомендую вам использовать pygame-menu (pip install pygame-menu)

Похожие вопросы:

Поэтому я недавно работал над программированием игры в Python, а также внешней библиотеки под названием PyGame. Если кто-то знаком с игрой Hearthstone, то это именно то чувство, которое я испытываю.

Вот в чем дело. Я пытаюсь написать игру-клон арканоида, и дело в том, что мне нужно меню окна, как вы получаете в pyGTK. Например, файл - >(Open/Save/Exit) .. что-то в этом роде и открытие контекста.

Я пытаюсь создать игру. Я хочу, чтобы картинка следовала за курсором мыши, но только после того, как я нажму. Я попытался запрограммировать его, но картинка только появляется, а потом снова.

Я относительно новичок в python и сделал несколько полезных инструментов и несколько небольших игр w/ 10 спрайтов в python; основываясь на производительности, я думаю, что мой следующий логический.

Да, это название было сформулировано не совсем правильно. Итак, вот что у нас есть - программа Python, использующая библиотеку pyGame, и мы делаем игру. Мы начинаем в среде меню main.py . Когда.

Я учусь pygame, помогая другу составить меню для его интерактивной игры TicTacToe. Это достаточно просто, название и 2 кнопки для запуска и выхода из игры. Он уже закончил игру, мне просто нужно.

Итак, у меня есть школьный проект, и он заключается в создании игры. Я создал игру, но нам также нужно иметь главное меню. Я довольно новичок в PyGame и понятия не имею, как это сделать. Я также.

Я создаю меню в python, а в меню pygame я хотел бы отобразить 3 различных варианта, которые являются кнопками. Кнопки есть: Игра Введите имена игроков Выход Не мог бы кто-нибудь помочь мне и.

Я пытаюсь сделать строку меню для пасьянса в Pygame. Я знаю, как это сделать в ботн wxpython и Tkinter, но я не могу найти никакой информации о том, как это сделать в pygame. Я хочу иметь.

Я хочу создать строку в pygame точно так же, как в tkinter.

Это код tkinter, но кто-нибудь знает, как создать что-то в pygame, который делает это точно так же?

Я использовал os.environ для объединения pyGame с tkiter, поэтому в вашем tkinter-окне есть окно pygame:

Я добавил фрейм для того, чтобы pygame был в:

И вот добавленная среда:

Надеюсь, что это поможет!

Я думаю, что это не представляется возможным интегрировать Tkinter в строку меню Pygame, они разные инструменты.

Единственное, что я вижу, что вы можете сделать, это создать непосредственно строку меню с pygame, используя только одну часть экрана для основной сцены, а другую для меню, которая может быть создана с помощью кнопок (созданных с помощью прямоугольников или похожих объектов).

У вас есть еще один вариант, то есть создать отдельное корневое окно tkinter (не рекомендуется, потому что у вас будет две основные циклы, сражающиеся друг с другом: одна из приложения tkinter и одна из приложения pygame), и запускайте ее параллельно с основным приложением pygame.

По-видимому, вы также можете использовать библиотеку wxPython, которая позволяет интегрировать окно pygame внутри обычного окна wxPython.

Pygame — библиотека, предназначенная для разработки мультимедийных приложений с графическим интерфейсом, например игр.

Начало работы¶

Начнем знакомство с библиотекой непосредственно с разбора примера простого приложения:

В первую очередь импортируем модуль pygame в наш файл с исходным кодом:

Затем вызываем функцию init() для подготовки модулей pygame к работе:

После этого создаем графическое окно, передав в качестве аргумента в функцию set_mode() его разрешение в виде пары целых чисел. В свою очередь функция вернет нам объект типа Surface, используемый для представления изображений:

Далее, запускаем основной цикл программы, в котором, среди всех событий, происходящих в нашем приложении, перехватываем событие закрытия основного графического окна пользователем:

После того как ожидаемое событие наступило, завершаем работу с библиотекой pygame вызовом функции pygame.quit() и нашей программы вызовом функции exit() из модуля sys .

Рисование геометрических фигур¶

Разместим в окне нашего приложения прямоугольник. Прямоугольные объекты представлены типом Rect :

Для создания объекта этого типа нам необходимо указать координаты левого верхнего угла прямоугольника и длины его сторон:

Обратите внимание, что начало координат (0, 0) находится в левом верхнем углу окна.

В библиотеке pygame функции отображения геометрических фигур находятся в модуле draw . Нарисуем прямоугольник c помощью функции rect() :

Для этого передадим в функцию в качестве аргументов поверхность, на которой мы размещаем прямоугольник, его цвет, сам прямоугольник и толщину линии — стороны прямоугольника. Если толщина равна нулю прямоугольник закрашивается сплошным цветом.

Рассмотрим готовый пример:

Обратите внимание на последнюю строку нашей программы. На самом деле графические объекты которые мы хотим разместить на основном экране сначала попадают в специальный буфер. Чтобы отобразить изменения стали видны вызываем функцию flip() .

Прочие функции для рисования графических фигур¶

Нарисовать линию на поверхности Surface , цветом color , с началом в точке start_pos , концом в точке end_pos и толщиной линии width.

pygame.draw. lines ( Surface, color, closed, pointlist, width=1 ) ¶

Нарисовать линию, соединяющую точки из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если параметр closed равен True , конечная точка соединяется с начальной.

Нарисовать окружность на поверхности Surface, цветом color , с центром в точке pos и радиусом radius . Если толщина линии width равна нулю, окружность закрашивается.

Нарисовать эллипс, ограниченный прямоугольником Rect , на поверхности Surface , цветом color . Если толщина линии width равна нулю, эллипс закрашивается.

pygame.draw. polygon ( Surface, color, pointlist, width=0 ) ¶

Нарисовать многоугольник по точкам из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если толщина линии width равна нулю многоугольник закрашивается.

Значение для цвета можно задать тройкой чисел, каждое из которых лежит в диапазоне от 0 до 255. Первое значение в последовательности определяет, какое количество красного содержится в данном оттенке, второе - зеленого, третье - голубого. Чем меньше значение числа, тем темнее будет оттенок. Например, красный цвет можно представить как (255, 0, 0), белый как (255, 255, 255), а черный как (0, 0, 0).

Помимо этого, в модуле color из библиотеки pygame содержится словарь THECOLORS, ключами которого являются названия различных цветовых оттенков. Подключить его можно с помощью команды:

Закрасим основной экран c помощью метода fill() :

Текст и шрифты¶

При работе с текстом мы будем использовать шрифты - группы символов объединенных по стилистическому или иному признаку. Шрифты в библиотеке pygame представлены типом Font

Чтобы создать объект Font на основе имеющегося в системе шрифта вызовем следующую функцию:

С помощью параметра name передаем в функцию имя шрифта, параметр size - размер шрифта в пунктах. Параметры bold и italic отвечают за начертание шрифта.

Список имеющихся в системе шрифтов можно получить с помощью функции get_fonts() :

Далее, с помощью метода render() нашего объекта типа Font получаем изображение с текстом, которое передаем на вход методу blit() для отрисовке на нашем основном экране:

Текст размещается в на основном экране по координатам (50, 50)

Задания¶

1. Используя функции для работы с графикой библиотеки pygame, нарисуйте дом с квадратным основанием и треугольной крышей.

2. Используя функции для работы с графикой библиотеки pygame, нарисуйте белый флаг с олимпийскими кольцами.

3. Разработайте программу, которая разбивает основное игровое окно на клетки заданного размера.

4. Доработайте программу так, чтобы в каждой клетке был записан её порядковый номер.

5. Доработайте в программу возможность закрашивания клетки с произвольным номером случайным цветом. Номера клеток которые необходимо закрасить считывать из файла.

© Copyright Revision d00c0df4 .

Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Запишем программный код, который будем использовать как основной шаблон для игровой программы. Поскольку в большинстве случаев внутри основного цикла выполняется рисование или вывод изображений, то дополним наш программный код рисованием. Для примера в игровом цикле будем рисовать круг синего цвета.

Вот основные функции, которые реализует код шаблона игровой программы :

  • создает окно
  • запускает игровой цикл
  • выполняет контроль частоты кадров
  • в игровом цикле покадрово рисует круг и обновляет главное игровое окно
  • закрывает окно, если щелкнуть по кнопке закрытия в правом верхнем углу окна

window templ

Основное графическое окно игры

Прог раммное окно, в котором в любой момент времени будет формироваться один кадр игры, а в процессе игры отображаться другие кадры, называется основным графическим окном игры. Вот код, который создаст пустое окно игры.

Основная поверхность

В пустом окне программы невозможно отобразить текст или графику, поэтому в различных графических библиотеках для этих целей использую такие понятия как поверхность или хост, по аналогии с холстом художника.

В Pygame для отображения графики в окне программы используют термин поверхность ( анг. surface - поверхность). Поверхность surface представляет часть экрана, на которой отображаются игровые элементы. В программе может быть много поверхностей, но всегда имеется основная поверхность, которую создает следующий метод:

Объект, присвоенный переменной screen , называется поверхностью ( surface ). Метод display . set_mode всегда возвращает основную поверхность - это основное графическое окно программы. При каждом проходе игрового цикла происходит обновление основного графического окна программы.

В методе display.set_mode((600, 400)) первый параметр 600 - ширина, второй 400 – высота окна в пикселях. Двойные круглые скобки обязательны, поскольку метод set_mode() принимает значения не как два отдельных параметра, а как связанные значения в качестве параметра - кортеж.

Игровой цикл

Игры так устроены, что большая часть действий циклически потеряется: выполняется действие в игре, которое приводит к изменению состояния игры и, которое в свою очередь формирует новую стратегию поведения игрока. Далее все повторяется: действие, состояние, стратегия. Это и есть игровой цикл - базовое понятие в теории игр, на котором строится структура и логика игры.

С точки зрения программирования структура игровой программы построена следующим образом: в начале программы идет блок кода, в котором выполняется инициализация вспомогательных компонентов – графики, звука, времени, видео и других. Далее идет блок кода, который содержит бесконечный цикл, выход из которого приводит к окончанию игры.

В бесконечном цикле необходимо постоянно выполнять какие-то действия: реагировать на действия игрока, например, игрок нажал клавишу на клавиатуре, обновлять экран игры, потому что изменилось его содержимое. Поэтому в игровых программах присутствует цикл, который непрерывно проверяет, выполняет ли пользователь какие-либо действия и необходимо ли выполнять обновление игрового экрана. Такой цикл называется игровым циклом событий.

Игровой цикл событий записывается с помощью оператора while. Он должен работать все время, пока пользователь играет в игру и может быть записан следующим образом:

Контроль скорости игры

Таким образом, команда clock.tick(FPS) выполняет автоматический контроль заданной частоты кадров.

Программная реализация контроля частоты кадров может быть записана следующим образом:

Обработка событий

Событие (англ. Event) – это один из объектов pygame. Все события в PyGame при их появлении добавляются в очередь событий. Каждый элемент в этой очереди является Event объектом. Для получения доступа к событиям используется метод pygame.event.get(), который возвращает список событий, произошедших с момента последнего вызова этого метода. Просматривая список событий, мы может обработать выход из программы

С помощью цикла for проходим по списку. Каждое возникающее событие последовательно извлекается из цепочки событий, и проверяется, является ли оно событием pygame.QUIT. Если есть событие QUIT в очереди событий, то выйдем из игрового цикла

Добавим код закрытия окна в наш

Если запустить эту программу, то увидим работающее игровое окно, исчезающее, когда вы его закрываете.

window 1

Обновление основной поверхности

Метод pygame.display.flip() обновляет содержимое основного окна игры. При обновлении используется механизм двойной буферизации. Экранная картинка сначала формируется в памяти компьютера, где она невидима, а затем методом display.flip () переносится на экран. В результате изменения появляются не постепенно, а сразу, что позволяет избежать возникновения на экране изображений нарисованных лишь наполовину и уменьшить мерцания экрана.

Аналогом метода pygame.display.flip() является метод update(), имеющий тоже назначение.

Здесь rectangle – это прямоугольная область, которую требуется перерисовать. По умолчанию, если параметр rectangle не указан

то перерисовывается вся клиентская область. Этот метод позволяет повысить производительность рисования, обновляя не все главное игровое окно, а обновляя только те части окна, которые были изменены. Для этого необходимо задать прямоугольные области, которые требуется перерисовать.

Примечание.

Вся область игрового окна состоит из клиентской и не клиентской областей.
Клиентской называется та область, в которой отображается содержимое окна.
Не клиентская область – это служебные области окна: рамка, заголовок, полосы прокрутки, главное меню и т.п.

Выполним обновление содержимого основного игрового окна

Surface

Поверхность surface представляет часть экрана, на которой отображаются игровые элементы. В программе может быть много поверхностей, но всегда имеется основная поверхность, которую создает следующий метод:

Объект, присвоенный переменной screen , называется поверхностью ( surface ). Метод display . set _ mode всегда возвращает основную поверхность - это основное графическое окно программы. При каждом проходе игрового цикла происходит обновление основного графического окна программы

Функция Surface()

Эта функция pygame. Surface() используется для создания объекта surface - это дополнительная поверхность для размещения на ней изображений. Она принимает в качестве параметра кортеж с двумя значениями (ширина, высота) поверхности

Этот код создаст пустое изображение размером 100 x 100 пикселей. Цвет по умолчанию будет черным.

Функция fill()

Функция принимает объект color – цвет заливки поверхности, это кортеж RGB, например, BLUE = (0, 0, 255)

Поверхности можно делать прозрачными с помощью их метода set_alpha(). Аргумент меняется от 0 (полная прозрачность) до 255 (полная непрозрачность).

Функция blit()

Эта функция обычно принимает два параметра Первый параметр - это дополнительная поверхность, которая должна быть нарисована на основной поверхности. Второй параметр - координаты размещения верхнего левого угла дополнительной поверхности в координатной системе основной поверхности

В этом примере функция blit() отображает содержимое дополнительной поверхности mySurface на поверхности screen.

Метод pygame.display.flip()

Этот метод обновляет содержимое основного экрана, используя механизм двойной буферизации. Если он не будет вызван, ни одно из изменений, вызванных вызовом функции blit () , не будет отображаться на экране.

Метод pygame.display.update()

Механизм двойной буферизации

Метод pygame.display.flip() обновляет содержимое основного окна игры. При обновлении используется механизм двойной буферизации. Экранная картинка сначала формируется в памяти компьютера, где она невидима, а затем методом display.flip() переносится на экран. В результате изменения появляются не постепенно, а сразу, что позволяет избежать возникновения на экране изображений нарисованных лишь наполовину и уменьшить мерцания экрана.

Класс Draw

Класс Draw имеет 9 методов рисования геометрических фигур, которые имеют следующие общие параметры:

Рисование прямоугольника:

Рисование круга:

Рисование треугольника/многоугольника:

Рисование линий

1. Рисование линии между точками start=(x,y) и end=(x1,y1)

2. Рисование тонкой сглаженной линии между точками start=(x,y) и end=(x1,y1),blend– коэффициент сглаживания линии

3. Рисование ломаной линии, pointlist = ((x1,y1),(x2,y2),(x3,y4)) – координаты точек связанных отрезков, сlosed = (True или False) указывает замыкать ли крайние точки.

Рисование эллипсов:

Рисование дуги:

Движение круга

Алгоритм движения можно записать следующим образом.

В игровом цикле:

  • оч истить содержимое всего игрового окна. Для этого достаточно установить фоновый цвет окна, например, зеленый. Все содержимое окна будет стерто
  • изменить координаты рисования круга, например

здесь x += 1 и у += 1 означает, что координаты круга изменяются на 1 пиксель на каждом игровом цикле.

  • нарисовать круг в памяти компьютера в новых координатах

pygame.draw.circle(screen, blue, (x, y), r)

Для игрового цикла мы использовали частоту 60 кадров в секунду. Следовательно, за 1 секунду центр круга сместиться на 60 пикселей по оси х, по оси y и через несколько секунд исчезнет за границей окна, поскольку главный цикл обновляет экран с частотой 60 кадров в секунду , постоянно перерисовывая его содержимое .

Отталкивание круга от границ окна

В PyGame используется э кранная система координат – это координатная система, заданная на экранной плоскости. Две ее оси параллельны сторонам экрана, ось OX направлена слева на право, OY – снизу вверх.

XOY

Запишем условия не выхода круга за границы игрового экрана. Введем переменные для скорости перемещения круга: dx, dy – количество пикселей, на которое смещается центр круга по оси x и оси y за один кадр

В этом случае код контроля движения круга внутри игрового окна можно записать следующим образом:

if y + r > H or y-r
dy = dy * -1
if x + r > W or x-r
dx = dx * -1

Полный листинг программы

Способы обработки событий клавиатуры и мыши

Есть два основных способа работы с клавиатурой, мышью.

Данный способ основан на обработке очереди событий. Все события в момент появления добавляются в очередь событий. Каждый раз, когда нажимается или отпускается клавиша или кнопка мыши или перемещается мышь, событие добавляется в очередь событий.

Если вызывать метод pygame.event.get() в игровом цикле, то мы получим список событий для каждого кадра. Каждый элемент списка это объект типа Event, который имеет свойство type . Способ обработки этих событий зависит от типа самого события. Тип события можно проверить, прочитав поле event.type .

События клавиатуры могут иметь два типа

  • event.type == pygame.KEYDOWN – клавиша нажата;
  • event.type == pygame.KEYUP – клавиша отпущена.

Если вы нажали клавишу и отпустили, то в очередь событий будут записаны оба.

События мыши могут иметь четыре типа

  • event.type == pygame.MOUSEBUTTONDOWN – кнопка мыши нажата
  • event.type == pygame.MOUSEBUTTONUP – кнопка мыши отпущена
  • event.type == pygame.MOUSEMOTION –курсора мыши перемещается
  • event.type == pygame.MOUSEWHEEL – кручение колесика мыши.

Данный способ основан на работе с модулем клавиатуры и модулем мыши

Ознакомится с модулями можно здесь:

События клавиатуры

В качестве примера рассмотрим фрагмент программы, в котором при нажатии на курсорные клавиши будет перемещаться прямоугольник на экране

С помощью цикла for проходим по списку

Каждое возникающее событие последовательно извлекаем из цепочки событий, и сравниваем с типом события pygame.KEYDOWN , если тип события равен pygame.KEYDOWN , то у этого типа есть атрибут event.key . Теперь сравниваем этот атрибут со значениями курсорных клавиш K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN. Если получили совпадение с одной из клавиш, то задаем смещение прямоугольника с помощью переменных dx или dy .

Далее определяем новые координаты для рисования прямоугольника

и рисуем прямоугольник в блоке формирования кадра

Обработка событий клавиатуры помощью с модуля клавиатуры pygame.key

Проверить состояние клавиш можно с помощью функции

которая возвращает кортеж двоичных значений. Индекс каждого значения соответствует своей клавиатурной константе. Само значение равно 1, если клавиша нажата, и 0 – если не нажата.

В программном блоке формирования отдельного кадра получаем список значений и сравниваем с клавиатурными константами наших клавиш.

Читайте также: