get rect pygame что это

Класс Rect

Еще одни ключевым классом в Pygame является Rect. Его экземпляры представляют собой прямоугольные области. Они не имеют графического представления в окне игры. Ценность класса заключается в свойствах и методах, позволяющих управлять размещением поверхностей, выполнять проверку их перекрытия и др.

Rect’ы можно передавать в функцию pygame.display.update(). В этом случае будут обновляться только соответствующие им области.

Экземпляры Rect создаются не только напрямую от класса. Однако начнем с этого варианта.

В конструктор класса Rect передаются четыре числа – координаты x и y, ширина и высота. Мы создаем два квадрата со сторонами в 30 пикселей. Верхний левый угол первого находится в точке (0, 0), второго – (30, 30).

У объектов Rect есть более десятка свойств, связанных с их координатами и размерами. Свойство bottomright одно из них, в нем хранится координата нижнего правого угла. Понятно, что если второй квадрат начинается в точке (30, 30) и его сторона равна 30, то нижний правый угол будет в точке (60, 60).

Кроме свойств, у объектов Rect есть множество методов. Метод move_ip() смещает прямоугольную область по оси x (первый аргумент) и y (второй аргумент) на указанное количество пикселей. В данном случае если второй прямоугольник смещается на 10 пикселей по обоим осям, то его левый верхний угол окажется в точке (40, 40).

Метод union_ip() присоединяет к тому прямоугольнику, к которому применяется, другой – который передается аргументом. Когда мы отодвинули второй прямоугольник на 10 пикселей, то область, заключающая в себе оба, уже будет шириной 70 пикселей, а не 60.

Методы, у которых есть суффикс _ip, изменяют тот экземпляр Rect, к которому применяются. Есть аналогичные методы без _ip (например, move(), union()), которые возвращают новый экземпляр, т. е. старый остается без изменений.

В метод blit() можно передавать не координаты места размещения Surface, а экземпляр Rect. Метод blit() сам возьмет из Rect координаты его верхнего левого угла:

Мы размещаем желтую поверхность на зеленой, а белую – на желтой. В обоих случаях – в координатах (70, 20). Однако в каждом случае точка берется относительно своей родительской поверхности.

Еще один момент, на который надо обратить внимание. Прямоугольная область была определена нулевой размерностью. При этом поверхности отобразились соответственно своим собственным размерам. Это значит, что поверхности не располагаются внутри rect’ов. Они к ним никакого отношения не имеют. Из прямоугольников blit() взял только координаты.

С другой стороны, экземпляры Rect предназначены для хранения не только координат, но и размеров поверхностей. Размеры в основном нужны для проверки коллизий. В большинстве случаев сначала создается поверхность. Далее с нее снимается «маска», т. е. создается экземпляр Rect, который будет иметь те же размеры, что и она. Все дальнейшее «взаимодействие» поверхности с другими объектами (размещение, проверка столкновений и вхождений) происходит через «связанный» с ней Rect.

Метод поверхности get_rect() возвращает экземпляр Rect, ширина и высота которого совпадают с таковыми поверхности. В примере метод get_width() возвращает ширину поверхности, также выводится ширина прямоугольника (rect.width), чтобы показать, что они равны.

Если в get_rect() не передавать аргументы, то верхний левый угол экземпляра Rect будет в точке (0, 0).

В цикле мы изменяем координату x прямоугольной области, после чего передаем уже измененный rect в метод blit(). В результате поверхность будет двигаться.

Мораль такова. Нам не нужно вводить множество переменных для хранения координат и размеров. Для каждой поверхности заводится свой rect, который хранит в себе множество свойств и включает ряд полезных методов.

В get_rect() можно передавать именованные аргументы, являющиеся свойствами Rect, и устанавливать им значения. Например, surf.get_rect(topleft=(100, 50)) вернет прямоугольник, чей левый угол будет в точке (100, 50), а размер совпадать с размерами surf. Выражение surf.get_rect(centerx=100) вернет прямоугольник, координата x центра которого будет иметь значение 100. При этом остальные координаты будут вычислены, исходя из размеров поверхности.

Перепишем программу с двумя ракетами из предыдущего урока, используя экземпляры Rect.

Главное, на что здесь следует обратить внимание, – вызов функции pygame.display.update() с аргументом-прямоугольником. Таким образом, на каждой итерации главного цикла while в памяти компьютера «перерисовывается» только часть окна, что экономит его ресурсы.

Создаются два экземпляра Rect. Левый начинается в верхнем левом углу окна, правый – от цента по оси x, вверху по оси y.

При создании экземпляров Surface мы указываем такую же ширину и высоту как у соответствующих им прямоугольников.

Левая и правая поверхности прорисовываются на главном окне. Координаты берутся из соответствующих экземпляров Rect.

Создаются два экземпляра нашего самописного класса Rocket. Конструктору надо передать поверхность и цвет.

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

Метод collidepoint() объекта Rect проверяет, находится ли точка, координаты которой были переданы в качестве аргумента, в пределах прямоугольника, к которому применяется метод. Здесь точкой являются координаты клика мыши. Если клик происходит в левом прямоугольнике, то в True устанавливается одна переменная, если в правом – то другая.

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

Практическая работа

Напишите программу по следующему описанию. В центре окна находится круг, изменяющий свой цвет на каждой итерации цикла. Окно условно поделено на четверти: верхнюю левую, верхнюю правую, нижнюю левую, нижнюю правую. Если нажимается клавиша 1, то обновляются только две четверти по диагонали. Если 2 – то только две другие. Нажатие нуля возобновляет обновление всей поверхность.

Читайте также:  при какой температуре пьют саке

Примечание. Функция pygame.display.update() может принимать не только один экземпляр Rect, но и список таковых.

Шапошникова С. (plustilino) © 2020

Pygame. Введение в разработку игр на Python

Источник

Get rect pygame что это

Pygame uses Rect objects to store and manipulate rectangular areas. A Rect can be created from a combination of left, top, width, and height values. Rects can also be created from python objects that are already a Rect or have an attribute named «rect».

Any pygame function that requires a Rect argument also accepts any of these values to construct a Rect. This makes it easier to create Rects on the fly as arguments to functions.

The Rect functions that change the position or size of a Rect return a new copy of the Rect with the affected changes. The original Rect is not modified. Some methods have an alternate «in-place» version that returns None but affects the original Rect. These «in-place» methods are denoted with the «ip» suffix.

The Rect object has several virtual attributes which can be used to move and align the Rect:

All of these attributes can be assigned to:

Assigning to size, width or height changes the dimensions of the rectangle; all other assignments move the rectangle without resizing it. Notice that some attributes are integers and others are pairs of integers.

The coordinates for Rect objects are all integers. The size values can be programmed to have negative values, but these are considered illegal Rects for most operations.

There are several collision tests between other rectangles. Most python containers can be searched for collisions against a single Rect.

The area covered by a Rect does not include the right- and bottom-most edge of pixels. If one Rect’s bottom border is another Rect’s top border (i.e., rect1.bottom=rect2.top), the two meet exactly on the screen but do not overlap, and rect1.colliderect(rect2) returns false.

New in pygame 1.9.2: The Rect class can be subclassed. Methods such as copy() and move() will recognize this and return instances of the subclass. However, the subclass’s __init__() method is not called, and __new__() is assumed to take no arguments. So these methods should be overridden if any extra attributes need to be copied.

Returns a new rectangle having the same position and size as the original.

Returns a new rectangle that is moved by the given offset. The x and y arguments can be any integer value, positive or negative.

Same as the Rect.move() method, but operates in place.

Same as the Rect.inflate() method, but operates in place.

Sets the position and size of the rectangle, in place. See parameters for pygame.Rect() pygame object for storing rectangular coordinates for the parameters of this function.

Returns a new rectangle that is moved to be completely inside the argument Rect. If the rectangle is too large to fit inside, it is centered inside the argument Rect, but its size is not changed.

Same as the Rect.clamp() method, but operates in place.

Returns a new rectangle that is cropped to be completely inside the argument Rect. If the two rectangles do not overlap to begin with, a Rect with 0 size is returned.

Источник

Work with imagesВ¶

Load an imageВ¶

The pyagme.image module provides methods for loading and saving images. The method load() loads an image from the file system and returns a Surface object. The method convert() optimizes the image format and makes drawing faster:

Download the image bird.png to the same folder where your program resides:

The method get_rect() returns a Rect object from an image. At this point only the size is set and position is placed at (0, 0). We set the center of the Rect to the center of the screen:

To recapitulate, we are working with 3 objects:

To display the image we fill the screen with a background color (GRAY). Then we blit the image, draw a red rectangle around it and finally update the screen:

Move the image with the mouseВ¶

At the beginning of the programm we set a boolean variable moving to False. Only when the mouse button is pressed, and when the mouse position is within the image (collidepoint) we set it to True:

When the mouse button is released, we set it to False again:

When the mouse moves, and the flag moving is True, then we move the image by the amount of relative movement (event.rel):

This is the whole code:

Rotate and Scale the imageВ¶

The pygame.transform module provides methods for scaling, rotating and flipping images. As we are going to modify the image img we keep the original image in a variable called img0:

In order to show the image rectangle, we add a green border to the original image:

Then we place the place the image in the center of the screen:

Читайте также:  elementary что это за плагин

First we define the global variables scale and angle:

We use the R key to increment rotation by 10 degrees and (decrement if the SHIFT key is pressed). The function rotozoom() allows to combine rotation and scaling. We always transform the orignial image (img0). Repeated rotation or scaling of an image would degrade its quality:

We use the S key to increment the scale by 10% (decrease if the SHIFT key is pressed):

As the image is transformed the bounding rectangle changes size. It must be recalulated and placed at the center again:

Reset the image to the originalВ¶

We use the O key to reset the image to its original state:

Flip the imageВ¶

We use the H key to flip the image horizontally:

and the V key to flip the image vertically:

Detect edges with the LaplacianВ¶

The fonction laplacien(img) allows to detect the outline of the image:

The fonction scale2x(img) doubles the size of a pixel:

Transform the image with the mouseВ¶

In this section we show how to use the mouse to scale and rotate an image. At the beginning we import the math module:

At the beginning we store the initial mouse position:

When the mouse moves we update the mouse position mouse and calculate the x, y coordinates from the center of the image. We also calculate the center-mouse distance d

The atan2(y, x) math function allows to find the rotation angle. We need to transform radians in degrees. From the distance mouse-center we calculate the scale argument:

To finally draw the transformed image we first fille the whole screen background (GRAY), blit the transformed image, surround it with a red rectangle.

In order to give visual feedback for the mouse action when transforming an image, we

draw a green line between the center of the image and the mouse position,

place two circles on the center and on the mouse position:

Источник

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

Источник

Сказочный портал