как сделать поле ввода в pygame

How can I create a text input box with Pygame?

I want to get some text input from the user in Python and display what they are typing in a text box, and when they press enter, it gets stored in a string.

I’ve looked everywhere, but I just can’t find anything. I’m using Pygame.

5 Answers 5

Here’s an object-oriented variant that allows you to easily create multiple input boxes:

There are also third party modules available like pygame_textinput.

Use the KEYDOWN event to get the input from the keyboard (see pygame.event ). The key that was pressed can be obtained from the key attribute of the pygame.event.Event object. unicode contains a single character string that is the fully translated character. Add the character to the text when a key is pressed.
Two special keys need to be dealt with. If RETURN is pressed, the input is finished. If BACKSPACE is pressed, the last character of the input text must be removed:

Use the algorithm in a pygame.sprite.Sprite class. Handle the event in the update method.Determine whether the mouse clicks in the text entry field with collidepoint (see How to detect when a rectangular object, image or sprite is clicked) and activate the text input box:

Pass the list of events to the update method of the Group that contains the Sprite:

Источник

Как создать текстовое поле ввода с Pygame?

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

5 ответов

Вот объектно-ориентированный вариант, который позволяет легко создавать несколько полей ввода:

Также доступны сторонние модули, такие как pygame_textinput.

Использовать KEYDOWN событие для получения ввода с клавиатуры (см. pygame.event ). Нажатую клавишу можно получить из key атрибут pygame.event.Event объект. unicode содержит односимвольную строку, которая является полностью переведенным символом. Добавьте символ к тексту при нажатии клавиши.
Необходимо разобраться с двумя специальными ключами. Если RETURN нажата, ввод завершен. Если BACKSPACE нажата, последний символ вводимого текста должен быть удален:

Используйте алгоритм в pygame.sprite.Sprite класс. Обработать событие в update Метод. Определите, щелкает ли мышь в поле ввода текста с collidepoint (см. Как определить, когда щелкают прямоугольный объект, изображение или спрайт) и активируйте поле ввода текста:

Передайте список событий в update метод группы, содержащей спрайт:

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

Однако я добавил возможность рисовать (цветной) прямоугольник вокруг текста, добавив параметр rect и rect_color в функцию __init__() и добавив

к функции обновления ( себя, события ).

Модуль pygame_gui позволяет вам создать поле text_input от пользователя, создав экземпляр UITextEntryLine. Вам нужно будет настроить экземпляр, как в кратком руководстве.

Источник

Как получить ввод от пользователя в Pygame и сохранить его как переменную?

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

Итак, я должен сохранить этот ввод как переменную. Есть ли какой-нибудь возможный способ сделать это?

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

Читайте также:  имущественный налоговый вычет при строительстве квартиры

ИЗМЕНИТЬ 2: Позвольте мне быть более ясным. В Python мы можем это сделать:

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

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

Сначала создадим функцию текстового рендеринга

Тогда функция работает как input ;

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

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

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

Похоже, вот как вы получаете вход от пользователя с экраном pygame правильно? Посмотрим на строку 4 этой функции:

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

Если вы можете сделать аналогичную функцию (если этот не работает), вы можете сделать то же самое! Просто сохраните первый элемент в списке, содержащий строку в переменной, как показано выше. Если у вас есть какие-либо проблемы, прокомментируйте, чтобы я мог отредактировать мой ответ.
К следующей части сейчас. Вы можете просто активировать эту функцию в любое время. Вы можете активировать, когда что-то произойдет. Например, змея ест яблоко. У вас, вероятно, есть функция, за которую я верю. Вы можете сделать такую ​​переменную:

И вставьте эту функцию. Когда эта переменная равна 0. Ничто действительно не активирует другую функцию. Когда змея ест яблоко, reset переменная в 1, а затем активирует функцию следующим образом:

Вы делаете это со многими другими случаями. Надеюсь, что это более понятно и полезно!

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

Затем вы можете проверить, когда пользователь выполнил ввод (кнопка/введите ключ), и завершите переменную.
При этом вы можете столкнуться с проблемой, когда ключ удерживается дольше, поэтому вы получаете 3 w для однократного нажатия кнопки. Если это так, вы можете: 1. не разрешать другой ввод до тех пор, пока не пройдет определенное время (.25 с, возможно?) Или 2. используйте pygame.KEYUP вместо pygame.KEYDOWN и исключите проверку на удары.

Я думаю, ниже линия работает для вас!

mydata = raw_input (‘Запрос:’)

Чтобы сделать так, чтобы пользователь вводил что-то
введите

Теперь пользователь может ввести что-то
чтобы сделать что-то типа

Теперь, если я наберу ввод, он скажет:
вход работает

Источник

Библиотека Pygame / Часть 1. Введение

Это первая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python.

Код в уроках был написан на Python 3.7 и Pygame 1.9.6

Что такое Pygame?

Pygame — это «игровая библиотека», набор инструментов, помогающих программистам создавать игры. К ним относятся:

Игровой цикл

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

В каждом кадре происходит масса вещей, но их можно разбить на три категории:

Читайте также:  Крафт акции к дню рождения

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

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

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

Время

Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК. Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.

Создание шаблона Pygame

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

В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:

Дальше необходимо открыть окно игры:

Теперь необходимо создать игровой цикл:

Раздел рендеринга (отрисовки)

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

Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:

Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.

Узнать общее количество отображаемых компьютером цветов можно, умножив:

Теперь, зная, как работают цвета, можно задать их в начале программ:

А после этого — заполнить весь экран.

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

Представьте, что у вас есть двусторонняя доска, которую можно поворачивать, показывая то одну, то вторую сторону. Одна будет дисплеем (то, что видит игрок), а вторая — оставаться скрытой, ее сможет «видеть» только компьютер. С каждым кадром рендеринг будет происходить на задней части доски. Когда отрисовка завершается, доска поворачивается и ее содержимое демонстрируется игроку.

А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.

В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :

Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.

Раздел ввода (событий)

Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.

Читайте также:  Ликвидация акционера судьба акций

События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них. Создается список, и с помощью цикла for можно пройтись по всем из них.

Контроль FPS

Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:

Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.

Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:

В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.

Источник

Создание игр на Python 3 и Pygame: Часть 2

Класс TextObject

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

Создание основного окна

Игры на Pygame выполняются в окнах. Можно даже сделать так, чтобы они выполнялись в полноэкранном режиме. Сейчас я расскажу, как отобразить пустое окно Pygame. Вы увидите многие элементы, которые мы обсуждали ранее. Сначала вызывается init() Pygame, а затем создаются основная поверхность рисования и таймер.

Затем выполняется основной цикл, который постоянно заполняет экран однотонным серым цветом и вызывает метод таймера tick() с частотой кадров.

Использование фонового изображения

Отрисовка фигур

Pygame может рисовать всё, что угодно. В модуле pygame.draw есть функции для отрисовки следующих фигур:

Отрисовка кирпичей

Стоит заметить, что класс Brick является подклассом GameObject и получает все его свойства, но также имеет и цвет, который обрабатывает самостоятельно (потому что могут существовать игровые объекты, имеющие несколько цветов). Поле special_effect мы пока рассматривать не будем.

Отрисовка мяча

Отрисовка ракетки

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

Заключение

В этой части мы узнали о классе TextObject и о том, как рендерить текст на экране. Также мы познакомились с тем, как рисовать объекты: кирпичи, мяч и ракетку.

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

Источник

Развивающий портал