Воскресенье, 25 июня 2017, 01:26

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [301]
Статьи об общих понятиях связанных с созданием игр.
Программирование [66]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [120]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [8]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [8]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [65]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [53]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Сколько всего игр вы прошли?
Всего ответов: 3333
Главная » Статьи » Создание игр

Основы PyGame. Прямоугольные области в PyGame. Часть вторая.
Внимание эта статья является продолжением первой части.

Теперь давайте рассмотрим метод Rect.clip(Rect): return Rect. Этот метод возвращает новый прямоугольник, который является пересечением аргумента и объекта, который вызвал этот метод. Если прямоугольники не пересекаются, то метод возвратит прямоугольник с нулевым размером. Для этого метода нет клона с окончанием “[/b]”. Давайте посмотрим как работает этот метод. Сначала определим два прямоугольника – rect_10 и rect_12, которые должны пересекаться. Также определим цвета для этих прямоугольников, для этого воспользуемся цветами первого и второго прямоугольника. Так что в раздел инициализации добавляем код:

Code
rect_9 = Rect(300,150,100,100)
rect_10 = Rect(350,200,100,100)
rect_9_color = rect_1_color
rect_10_color = rect_2_color

Теперь давайте нарисуем эти два прямоугольника:
Code
pygame.draw.rect(screen, rect_9_color, rect_9)
pygame.draw.rect(screen, rect_10_color, rect_10)

Запускаем и смотрим, получилось ли у нас объявить два прямоугольника, которые пересекаются:

Как видно прямоугольники пересекаются, теперь давайте получим пересечение rect_9 и rect_10, для этого объявим прямоугольник rect_11 через метод Rect.clip , также объявим синий цвет для него:
Code
rect_11 = rect_9.clip(rect_10)
rect_11_color = rect_3_color

Добавим код рисования прямоугольника в блок формирования кадра:
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 = Rect(100,100,200,200)
rect_2 = Rect(110,110, 180,180)

Дальше объявим цвета для этих прямоугольников:
Code
rect_1_color = (255,0,0)
rect_2_color = (0,255,0)

Теперь выведем сообщение, по которому можно узнать содержит ли rect_1 внутри себя rect_2:
Code
print "rect_1 contains rect_2 -", bool(rect_1.contains(rect_2))

Дальше нарисуем эти два прямоугольника, теперь в блок формирования кадра добавим код отрисовки прямоугольников:
Code
pygame.draw.rect(screen, rect_1_color, rect_1)
pygame.draw.rect(screen, rect_2_color, rect_2)

Запустим теперь код и посмотрим, какое сообщение выводится в окно интерпретатора:

Визуально видно как второй прямоугольник находится внутри первого, и выводится следующее сообщение:
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 – когда курсор не находится в прямоугольнике. Также объявим сам цвет для прямоугольника:
Code
rect_1_color_normal = (0,0,255)
rect_1_color_over = (0, 255,255)
rect_1_color = 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 и разместим его по середине экрана, также объявим синий цвет для него. Поэтому в блоке инициализации пишем:
Code
rect_1 = Rect(200,100,200,200)
rect_1_color = (0,0,255)

Теперь объявим два цвета, один - color_normal будет использоваться для прямоугольников, которые не пересекают rect_1, а color_collide – для прямоугольников которые пересекают rect_1:
Code
color_normal = (0,255,0)
color_collide = (255,0,0)

Далее объявим пустой список, в который мы добавим прямоугольники:
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) | Автор: Карпенко Евгений
Просмотров: 5037 | Рейтинг: 5.0/3 |
Теги: Основы Pyame, Pygame, Анимация в Pygame, Уроки по PyGame, noTformaT
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Основы PyGame. Прямоугольные области в PyGame. Часть вторая.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
10 случайных движков
  • Platfinity
  • Ray Game Designer
  • Sauerbraten
  • DGLEngine
  • Astra Gift Maker
  • Yake
  • LKI-Creator 3D
  • G3D Engine
  • Gideros Studio
  • Silent Walk: RENAISSANCE
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    GameDev, Уроки OpenGL, Программирование, Создать Minecraft
    Все права сохранены. GcUp.ru © 2008-2017 Рейтинг