Основы PyGame. Прямоугольные области в PyGame. Часть вторая.
Внимание эта статья является продолжением первой части.
Теперь давайте рассмотрим метод Rect.clip(Rect): return Rect. Этот метод возвращает новый прямоугольник, который является пересечением аргумента и объекта, который вызвал этот метод. Если прямоугольники не пересекаются, то метод возвратит прямоугольник с нулевым размером. Для этого метода нет клона с окончанием “[/b]”. Давайте посмотрим как работает этот метод. Сначала определим два прямоугольника – rect_10 и rect_12, которые должны пересекаться. Также определим цвета для этих прямоугольников, для этого воспользуемся цветами первого и второго прямоугольника. Так что в раздел инициализации добавляем код:
Запускаем и смотрим, получилось ли у нас объявить два прямоугольника, которые пересекаются:
Как видно прямоугольники пересекаются, теперь давайте получим пересечение rect_9 и rect_10, для этого объявим прямоугольник rect_11 через метод Rect.clip , также объявим синий цвет для него:
Добавим код рисования прямоугольника в блок формирования кадра:
Code
pygame.draw.rect(screen, rect_11_color, rect_11)
Запускаем и смотрим:
Как видно область пересечения – rect_11 прямоугольников rect_10 и rect_9 рисуется синим цветом. Следующий метод это Rect.normalize(): return None, этот метод нормализирует стороны прямоугольника. Для того чтобы проверить это давайте объявим прямоугольник rect_12 с отрицательными размерами:
Code
rect_12 = Rect(550,150,-100,-100)
Цвет для этого прямоугольника мы указывать не будем (возьмем цвет для прямоугольника rect_11), поэтому пишем код в блоке формирования кадра:
Code
pygame.draw.rect(screen, rect_11_color, rect_12)
Запускаем код и смотрим, в каком месте рисуется прямоугольник:
Теперь давайте выполним метод normalize() этого прямоугольника, для этого в блоке инициализации данных после инициализации прямоугольника rect_12 добавим следующий код:
Code
rect_12.normalize()
…и запустим код:
Как видно ничего не произошло, да и ничего не должно было произойти, просто этот метод нормализирует стороны прямоугольника (делает их положительными) по отношению к центру, поэтому нам кажется, что ничего и не произошло. Может возникнуть вопрос, зачем это надо? Это надо для того чтобы методы определения столкновений между прямоугольниками работали исправно, к сожалению подобные методы некорректно работают с прямоугольниками которые имеют отрицательный размер. Теперь работа с файлом “pygame_rect.py” закончена, в итоге должен быть написан следующий код:
Мы просмотрели все методы для работы над прямоугольниками, далее мы рассмотрим методы обнаружения столкновений между прямоугольными областями.
Часть четвертая. Пересечение и столкновение прямоугольных областей.
Теперь давайте разберем теперь методы для обнаружений пересечения и столкновений между прямоугольниками. Начнем с метода Rect.contains(Rect): return bool, этот метод возвращает логическое значение в зависимости от того находится ли аргумент внутри прямоугольника. Давайте рассмотрим его на маленьком примере. Открываем файл “pygame_template.py” и сохраняем его под именем “pygame_rect_contains.py”, также меняем заголовок окна на “Rect Contains”. Теперь объявим два прямоугольника, где второй прямоугольник находится внутри первом:
Запустим теперь код и посмотрим, какое сообщение выводится в окно интерпретатора:
Визуально видно как второй прямоугольник находится внутри первого, и выводится следующее сообщение:
Code
rect_1 contains rect_2 – True
Это говорит о том, что второй прямоугольник действительно находится внутри первого. Давайте теперь изменим объявление второго прямоугольника на:
Code
rect_2 = Rect(350,110, 180,180)
Теперь запускаем и смотрим:
Как видно второй прямоугольник теперь не находится в внутри первого прямоугольника, также сообщение в окне интерпретатора:
Code
rect_1 contains rect_2 – False
…говорит о том что второй прямоугольник действительно не находится внутри первого. В итоге должен быть написан следующий код: Исходный код можно просмотреть тут. Теперь разберем метод Rect.collidepoint, но для начала опять откроем “pygame_template.py” и сохраним его под именем “pygame_rect_cp.py”, также изменим заголовок окна на “Rect Collidepoint”. Сам метод Rect.collidepoint((x,y)): return bool – возвращает логическое значение в зависимости от того находится точка внутри прямоугольника или нет. Давайте рассмотрим этот метод на маленьком примере – в зависимости от того находится ли курсор в прямоугольнике или нет он будет он будет рисоваться различными цветами. Для начала объявим прямоугольник rect_1:
Code
rect_1 = Rect(200,100,200,200)
Теперь объявим два цвета, цвет rect_1_color_over – когда курсор находится внутри прямоугольника и rect_1_color_normal – когда курсор не находится в прямоугольнике. Также объявим сам цвет для прямоугольника:
Теперь в формировании кадра будем узнавать, находится курсор в прямоугольнике rect_1, и будем присваивать цвету прямоугольника цвета, в зависимости от положения курсора:
Code
if rect_1.collidepoint(pygame.mouse.get_pos()): rect_1_color = rect_1_color_over
else: rect_1_color = rect_1_color_normal[/code] Ну а теперь рисуем этот прямоугольник в формировании кадра:
Code
pygame.draw.rect(screen, rect_1_color, rect_1)
В итоге в файле “pygame_rect_cp.py” должен быть написан следующий код:
Теперь можно запустить программу и посмотреть что получилось:
Если навести на прямоугольник, то он будет рисоваться голубым цветом, а если отвести – синим. Следующий метод это Rect.colliderect(Rect): return bool, этот метод возвращает True, если какая-либо часть прямоугольника перекрыта прямоугольником который указанный в параметре. Если имеется больше чем два прямоугольника, и нам требуется определить, какой именно прямоугольник сталкивается с определенным прямоугольником, то нам в этом помогут следующие четыре метода. Первый – это Rect.collidelist(list): return index, где list – список прямоугольников, которых надо проверить на перекрывание. Ну а сам метод возвращает индекс первого прямоугольника, который перекрывает прямоугольник, вызвавший метод. Давайте рассмотрим этот метод на маленьком примере. Опять откроем “pygame_template.py” и сохраним его под именем “pygame_rect_cl.py”, также изменим заголовок окна на “Collide detected”. Теперь надо импортировать модуль random:
Code
import random
Далее объявим прямоугольник размером 200х200 и разместим его по середине экрана, также объявим синий цвет для него. Поэтому в блоке инициализации пишем:
Теперь объявим два цвета, один - color_normal будет использоваться для прямоугольников, которые не пересекают rect_1, а color_collide – для прямоугольников которые пересекают rect_1:
Далее объявим пустой список, в который мы добавим прямоугольники:
Code
rect_list = []
Теперь запустим цикл с числом итерация – 10, и в этом цикле будем добавлять прямоугольники в список:
Code
x = 0 while x<10: rect_list.append(Rect(500 * random.random(), 300 * random.random(), 100, 100)) print x x+=1
Далее получим индекс первого прямоугольника, который пересекает прямоугольник в центре:
Code
collide_index = rect_1.collidelist(rect_list)
Ну а теперь, в блоке формирования кадра мы должны пройтись полностью по всему списку, и в зависимости от того какой индекс у прямоугольника в списке - мы будем рисовать его определенным цветом:
Code
while x<10: if x in collide_index: temp_color = color_collide else: temp_color = color_normal pygame.draw.rect(screen, temp_color, rect_list[x],4) x+=1
Теперь можем запустить и посмотреть что получилось:
Как видно, только один перекрывающий прямоугольник рисуется красным цветом, ну а для того чтобы этим цветом рисовались все перекрывающие прямоугольники мы будем использовать метод Rect.collidelistall(list): return indices, где list – список прямоугольников. Сам метод возвращает список индексов пересекающих прямоугольников. Теперь изменим строчку получения индекса:
Code
collide_index = rect_1.collidelist(rect_list)
на:
Code
collide_index = rect_1.collidelist(rect_list)
…и в цикле изменим условие:
Code
if x = collide_index:
на:
Code
if x in collide_index:
Этим условием мы можем узнать есть ли индекс цикла в списке или нет, и в зависимости от этого рисовать прямоугольник нужными для нас цветами. Теперь можно запустить код и посмотреть что получилось:
.
Как видно все прямоугольники, которые перекрывают синий прямоугольник в центре - рисуются красным цветом. На этом работа с файлом “pygame_rect_cl.py” закончена, в итоге он должен содержать в себе следующий код:
Теперь рассмотрим методы Rect.collidedict(dict): return (key, value) и Rect.collidedictall(dict): return [(key, value), ...]. Первый метод возвращает ключ и значение элемента в словаре, который сталкивается с Rect. В этом словаре все значения – это прямоугольники. Если не одно столкновение не найдено - возвращается None. Следующий метод - это Rect.collidedictall(dict): return [(key, value), ...]. Этот метод возвращает список всех пар (ключ /значение), которые пересекаются с Rect. Если столкновения не найдены, то возвращается пустой словарь. Rect объекты не хешируются и не могут быть использованы в качестве ключей в словаре, только в качестве значения. Ну как же без заданий, попробуйте изменить пример выше только с использованием Rect.collidedictall, это будет хорошим закреплением материала.
Часть 5. Заключение.
Ну, вот и все, мы с вами полностью рассмотрели все методы модуля Rect. Мы научились изменять некоторые параметры объектов, научились определять пересечения между прямоугольниками. Надеюсь на то, что домашнее задания будет не очень трудным для Вас, а то у меня есть кое какие сомнения. Ну а в следующей статье мы с вами рассмотрим как загружать изображения, которые хранятся в файлах. Все всем пока, желаю удачи в геймдеве. Спасибо за внимание с вами был noTformaT.
P.S.
Если вы просто скопируете программный код с этой статьи то он возможно не запустится, связано это с тем что табуляций и пробелы в Python имеют определенный смысл. Если это произошло, и программа зависла, то требуется перезагрузить терминал интерпретатора открыв в терминале меню «Shell» и выбрав пункт «Restart Shell».
Категория: Создание игр | Добавил: noTformaT (20 Марта 2011)
| Автор: Карпенко Евгений
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Основы PyGame. Прямоугольные области в PyGame. Часть вторая.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]