Как сделать перезапуск игры pygame
Перезагрузка Pygame?
У меня есть игра, в которой работает True loop, и я хотел бы попросить пользователя «Играть снова?». У меня уже есть код для прямого появления текста, но мне нужен способ щелкнуть правой кнопкой мыши или нажать y для «да», а код снова запустить его.
6 ответов
Если у вас есть метод loop, вызовите его из main() run, когда игра закончится и закончится, попросите пользователя main() спросить пользователя, хотят ли они снова играть, и если так вспомнить основной цикл после того, как все по умолчанию
Просто имейте часть, которая просит снова очистить и повторно инициализировать все переменные, поскольку они по умолчанию, и пусть цикл, если пользователь хочет снова сыграть
Я могу подумать об этом: в конце кода поставьте что-то вроде этого, чтобы спросить пользователя, хочет ли он играть:
Внутри основного цикла программы создайте новый оператор event.key if для любого ключа, который вы хотите, чтобы игрок нажал, чтобы перезапустить игру, а затем вызовите main() внутри оператора if. Это вернет все обратно к квадрату 1.
В моем примере ниже я обнаруживаю, что пользователь умер и нажал клавишу R, затем перезапустите main().
Далее вниз в основном цикле я показываю некоторый текст, прося игрока нажать клавишу R для респауна.
Запустите эту функцию, которую я написал специально. Откорректируйте это до вашего сердца. Если игрок умирает (или что бы ни случилось, чтобы текст снова воспроизводился), вам нужно только вызвать play_again()
Надеюсь, это тот ответ, который вы искали.
Чтобы узнать, нажал ли пользователь на прямоугольник, просто установите прямоугольник 1 на 1 в положение мыши, а затем, щелкнув, проверьте, не пересекаются ли прямоугольники. Затем просто вызовите цикл снова, имея его собственную функцию, например DeadChex.
Можно ли упростить процесс, используя функцию exec()?
Вот пример моего ответа на аналогичную проблему. Я предполагаю, что это может быть адаптировано для использования в вашем цикле.
Pygame restart?
I have my game running in a while True loop and I would like to be able to ask the user to «Play again?» I already have the code for a rect to pop up with the text but I need a way for the user to click on the rect or hit y for yes and the code run its self again.
5 Answers 5
Inside your main program loop, make a new event.key if statement for whichever key you want the player to press to restart the game, then call main() inside the if statement. This will reset everything back to square 1.
Further down in the main loop I display some text asking the player to press the R key to respawn.
Have the loop it’s own method, call it from a main() run, when the game is over and ends, have main() ask the user if they want to play again, and if so recall the main loop after setting everything as its default
Just have the part that asks again clear and reinitialize all variables as there defaults and let the loop if the user wants to play again
To tell if the user clicked on the rect, just set a 1 by 1 rect at the mouse position then when they click, check if the rects are colliding. Then, just call the loop again by having it be its own function, like DeadChex said.
Run this function I’ve written especially. Tweak it to your heart’s content. If the player dies (or whatever happens to make the play again text appear) you only have to call play_again()
I hope this is the answer you were looking for.
I can think of this: at the end of the code put something like this to ask the user if he wants to play:
PyGame — шпаргалка для использования
Основные модули пакета Pygame
Модуль | Назначение |
---|---|
pygame.cdrom | Доступ к CD-приводам и управление ими |
pygame.cursors | Загружает изображения курсора |
pygame.display | Доступ к дисплею |
pygame.draw | Рисует фигуры, линии и точки |
pygame.event | Управление внешними событиями |
pygame.font | Использует системные шрифты |
pygame.image | Загружает и сохраняет изображение |
pygame.joystick | Использует джойстики и аналогичные устройства |
pygame.key | Считывает нажатия клавиш с клавиатуры |
pygame.mixer | Загружает и воспроизводит мелодии |
pygame.mouse | Управляет мышью |
pygame.movie | Воспроизведение видеофайлов |
pygame.music | Работает с музыкой и потоковым аудио |
pygame.overlay | Доступ к расширенным видеоизображениям |
pygame | Содержит функции Pygame высокого уровня |
pygame.rect | Управляет прямоугольными областями |
pygame.sndarray | Манипулирует звуковыми данными |
pygame.sprite | Управление движущимися изображениями |
pygame.surface | Управляет изображениями и экраном |
pygame.surfarray | Манипулирует данными пикселей изображения |
pygame.time | модуль pygame для управления временем и частотой кадров |
pygame.transform | Изменение размера и перемещение изображений |
Окно Pygame
Цикл игры, выход из игры
Рисование базовых элементов
модуль pygame.draw
pygame.draw.rect | нарисовать прямоугольную форму |
pygame.draw.polygon | фигуру с любым количеством сторон |
pygame.draw.circle | круг вокруг точки |
pygame.draw.ellipse | нарисовать круглую форму внутри прямоугольника |
pygame.draw.arc | нарисовать секцию эллипса |
pygame.draw.line | нарисовать сегмент прямой линии |
pygame.draw.lines | для рисования нескольких смежных отрезков |
pygame.draw.aaline | рисовать тонкую линию |
pygame.draw.aalines | нарисовать связанную последовательность сглаженных линий |
Загрузка изображения
Объект Rect
pygame.Rect
Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями. Rect может быть создан из комбинации значений слева, сверху, ширины и высоты. Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с именем «rect».
Методы работы с Rect
pygame.Rect.copy | Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал. |
pygame.Rect.move | Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным. |
pygame.Rect.move_ip | То же, что и метод Rect.move (), но работает на месте. |
pygame.Rect.inflate | увеличивать или уменьшать размер прямоугольника, на месте |
pygame.Rect.inflate_ip | увеличивать или уменьшать размер прямоугольника, на месте |
pygame.Rect.clamp | перемещает прямоугольник внутри другого |
pygame.Rect.clamp_ip | перемещает прямоугольник внутри другого, на месте |
pygame.Rect.clip | обрезает прямоугольник внутри другого |
pygame.Rect.union | соединяет два прямоугольника в один |
pygame.Rect.union_ip | соединяет два прямоугольника в один, на месте |
pygame.Rect.unionall | объединение многих прямоугольников |
pygame.Rect.unionall_ip | объединение многих прямоугольников, на месте |
pygame.Rect.fit | изменить размер и переместить прямоугольник учмиывая соотношение сторон |
pygame.Rect.normalize | корректировать отрицательные размеры |
pygame.Rect.contains | проверить, находится ли один прямоугольник внутри другого |
pygame.Rect.collidepoint | проверить, находится ли точка внутри прямоугольника |
pygame.Rect.colliderect | тест, пересекаются ли два прямоугольника |
pygame.Rect.collidelist | проверить, пересекается ли хоть один прямоугольник в списке |
pygame.Rect.collidelistall | пересекаются ли все прямоугольники в списке |
pygame.Rect.collidedict | проверить, если один прямоугольник в словаре пересекается |
pygame.Rect.collidedictall | пересекаются ли все прямоугольники в словаре |
Обработка событий
Событие — это то, как Pygame сообщает о том, что что-то случилось за пределами кода программы. События создаются, например, при нажатии клавиш клавиатуры, мыши и размещаются в очереди, дожидаясь обработки.
Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.
Объект event
Модуль pygame.event для обработки очереди событий
pygame.event.pump | Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия |
pygame.event.get | получает события из очереди |
pygame.event.poll | получить одно событие из очереди |
pygame.event.wait | ждёт одиночного события из очереди |
pygame.event.peek | проверить, ждут ли очереди события определённого типа |
pygame.event.clear | удалить все события из очереди |
pygame.event.event_name | возвращает имя для типа события. Строка находится в стиле WordCap |
pygame.event.set_blocked | проверяет, какие события не разрешены в очереди |
pygame.event.set_allowed | проверяет, какие события разрешены в очереди |
pygame.event.get_blocked | проверить, заблокирован ли тип события из очереди |
pygame.event.set_grab | проверяет совместное использование устройств ввода с другими приложениями |
pygame.event.get_grab | проверить, работает ли программа на устройствах ввода данных |
pygame.event.post | поместить новое событие в очередь |
pygame.event.Event | создать новый объект события |
pygame.event.EventType | Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов. |
Pygame отслеживает все сообщения о событиях через очередь событий. Процедуры в этом модуле помогают управлять этой очередью событий. Входная очередь сильно зависит от модуля отображения (display) pygame. Если дисплей не был инициализирован и видеорежим не установлен, очередь событий не будет работать.
Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.
Модуль pygame.mouse для работы с мышью
pygame.mouse.get_pressed | получить состояние кнопок мыши |
pygame.mouse.get_pos | получить позицию курсора мыши |
pygame.mouse.get_rel | получить количество движений мыши |
pygame.mouse.set_pos | установить позицию курсора мыши |
pygame.mouse.set_visible | скрыть или показать курсор мыши |
pygame.mouse.get_focused | проверяет, принимает ли дисплей ввод мыши |
pygame.mouse.set_cursor | установить изображение для курсора мыши |
pygame.mouse.get_cursor | получить изображение для курсора мыши |
Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.
Пример. Нарисовать курсор под текущей позицией мыши.
Определить какая кнопка была нажата на мышке можно используя значение event.button:
Пример. Перемещать картинку курсором мыши.
Клавиатура
Модуль pygame.key
Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.
Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.
Получить код клавиши:
Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:
KeyASCII | ASCII | CommonName |
---|---|---|
K_BACKSPACE | \b | backspace |
K_TAB | \t | tab |
K_CLEAR | clear | |
K_RETURN | \r | return |
K_PAUSE | pause | |
K_ESCAPE | ^[ | escape |
K_SPACE | space | |
K_EXCLAIM | ! | exclaim |
K_QUOTEDBL | « | quotedbl |
K_HASH | # | hash |
K_DOLLAR | $ | dollar |
K_AMPERSAND | & | ampersand |
K_QUOTE | quote | |
K_LEFTPAREN | ( | leftparenthesis |
K_RIGHTPAREN | ) | rightparenthesis |
K_ASTERISK | * | asterisk |
K_PLUS | + | plussign |
K_COMMA | , | comma |
K_MINUS | — | minussign |
K_PERIOD | . | period |
K_SLASH | / | forwardslash |
K_0 | 0 | 0 |
K_1 | 1 | 1 |
K_2 | 2 | 2 |
K_3 | 3 | 3 |
K_4 | 4 | 4 |
K_5 | 5 | 5 |
K_6 | 6 | 6 |
K_7 | 7 | 7 |
K_8 | 8 | 8 |
K_9 | 9 | 9 |
K_COLON | : | colon |
K_SEMICOLON | ; | semicolon |
K_LESS | less-thansign | |
K_EQUALS | = | equalssign |
K_GREATER | > | greater-thansign |
K_QUESTION | ? | questionmark |
K_AT | @ | at |
K_LEFTBRACKET | [ | leftbracket |
K_BACKSLASH | \ | backslash |
K_RIGHTBRACKET | ] | rightbracket |
K_CARET | ^ | caret |
K_UNDERSCORE | _ | underscore |
K_BACKQUOTE | ` | grave |
K_a | a | a |
K_b | b | b |
K_c | c | c |
K_d | d | d |
K_e | e | e |
K_f | f | f |
K_g | g | g |
K_h | h | h |
K_i | i | i |
K_j | j | j |
K_k | k | k |
K_l | l | l |
K_m | m | m |
K_n | n | n |
K_o | o | o |
K_p | p | p |
K_q | q | q |
K_r | r | r |
K_s | s | s |
K_t | t | t |
K_u | u | u |
K_v | v | v |
K_w | w | w |
K_x | x | x |
K_y | y | y |
K_z | z | z |
K_DELETE | delete | |
K_KP0 | keypad0 | |
K_KP1 | keypad1 | |
K_KP2 | keypad2 | |
K_KP3 | keypad3 | |
K_KP4 | keypad4 | |
K_KP5 | keypad5 | |
K_KP6 | keypad6 | |
K_KP7 | keypad7 | |
K_KP8 | keypad8 | |
K_KP9 | keypad9 | |
K_KP_PERIOD | . | keypadperiod |
K_KP_DIVIDE | / | keypaddivide |
K_KP_MULTIPLY | * | keypadmultiply |
K_KP_MINUS | — | keypadminus |
K_KP_PLUS | + | keypadplus |
K_KP_ENTER | \r | keypadenter |
K_KP_EQUALS | = | keypadequals |
K_UP | uparrow | |
K_DOWN | downarrow | |
K_RIGHT | rightarrow | |
K_LEFT | leftarrow | |
K_INSERT | insert | |
K_HOME | home | |
K_END | end | |
K_PAGEUP | pageup | |
K_PAGEDOWN | pagedown | |
K_F1 | F1 | |
K_F2 | F2 | |
K_F3 | F3 | |
K_F4 | F4 | |
K_F5 | F5 | |
K_F6 | F6 | |
K_F7 | F7 | |
K_F8 | F8 | |
K_F9 | F9 | |
K_F10 | F10 | |
K_F11 | F11 | |
K_F12 | F12 | |
K_F13 | F13 | |
K_F14 | F14 | |
K_F15 | F15 | |
K_NUMLOCK | numlock | |
K_CAPSLOCK | capslock | |
K_SCROLLOCK | scrollock | |
K_RSHIFT | rightshift | |
K_LSHIFT | leftshift | |
K_RCTRL | rightcontrol | |
K_LCTRL | leftcontrol | |
K_RALT | rightalt | |
K_LALT | leftalt | |
K_RMETA | rightmeta | |
K_LMETA | leftmeta | |
K_LSUPER | leftWindowskey | |
K_RSUPER | rightWindowskey | |
K_MODE | modeshift | |
K_HELP | help | |
K_PRINT | printscreen | |
K_SYSREQ | sysrq | |
K_BREAK | break | |
K_MENU | menu | |
K_POWER | power | |
K_EURO | Euro |
Направленное движение с помощью клавиш
Можно перемещать изображение на экране с клавиатуры, назначая клавиши для перемещений: вверх, вниз, влево, вправо.
Создать картинку, например:
Проверить очередь событий:
Проверить, является ли полученное событие нажатием на клавиши со стрелками:
Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:
И нарисовать картинку в новом месте:
Объект Surface
pygame.Surface — объект pygame для представления изображений
Наложение поверхностей, прозрачность.
Управление временем
Модуль pygame.time содержит объект Clock, который можно использовать для отслеживания
времени. Чтобы создать объект типа: время, вызывается конструктор pygame.time.Clock:
clock = pygame.time.Clock()
Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
time_passed = clock.tick ()
Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:
# Игра будет работать со скоростью не более 30 кадров в секунду
time_passed = clock.tick (30)
Звуки
Загружаем звуковой файл в формате *.wav
sound = pygame.mixer.Sound(«sound.wav»)
(загружаем до игрового цикла, т.к. это очень долгая операция)
Столкновения (collisions)
При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.
Эта задача может быть реализована разными способами.
Например, используя объект Rect
Или используя поверхности — surface