Четверг, 21 Ноября 2024, 17:51

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

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Какую графическую систему API вы используете?
Всего ответов: 10249
Главная » Статьи » Движки и Гейммейкеры

PyGame. Геометрические примитивы. Часть 2.
Внимание эта статья является продолжением первой части

Часть третья. Практика и теория.

Для начала открываем pygame_template.py, и сохраняем его прд название simpleDraw.py, и изменяем значение переменной windows_title на “Simple Figure”. Первый метод в списке методов рисования это pygame.draw.rect(Surface, color, Rect, width=0): return Rect, где Surface – изображение на котором будет рисоваться прямоугольник, color – цвет прямоугольника, Rect – прямоугольная область в которой будет рисоваться прямоугольник, width – ширина обводки фигуры, если width принимает значение 0, то рисуется закрашенная фигура. Теперь нам надо инициализировать данные, которые будут использоваться в качестве параметров для этого метода. Давайте нарисуем два прямоугольника - один будет залитый, а второй с обводкой, для начала в блоке инициализации опишем две переменных, которые будут отвечать за цвет этих двух фигур, названия у них - rect_1_color и rect_1_color, первый будет фиолетовый, а второй – синим, пишем код инициализации в блоке инициализации данных:

Code
rect_1_color = (255,0,255)
rect_2_color = (0, 0, 255)

Теперь надо инициализировать область, в которой будет рисоваться прямоугольник, прямоугольная область это класс Rect, в его конструкторе используется два списка, в первом списке хранятся две координаты – это позиции по оси х и у, от которых будет рисоваться прямоугольник, во втором списке хранится два числа - это ширина и высота прямоугольника. Теперь настало время инициализировать эти прямоугольные области, в которых будут рисоваться фигуры, назовем их rect_1_rect и rect_2_rect, пишем код инициализации этих зон:
Code
rect_1_rect = Rect((10,10),(100,100))
rect_2_rect = Rect((150,150),(300,100))

Как видите, в этом коде инициализируются две прямоугольные области, первая начитается с координат 10х10 и имеет ширину в 100px и высоту в 100px, а вторая область начинается с координат 150х150 и имеет ширину 300px и высоту в 100px.
Теперь надо объявить переменные, которые будут отвечать за ширину обводки, так как первый прямоугольник будет закрашен, то его ширина равна 0, у второго ширина линии обводки будет равна 4, назовем эти переменные rect_1_width и rect_2_width, и пишем следующий код:
Code
rect_1_width = 0
rect_2_width = 4

Все данные для того чтобы нарисовать прямоугольники есть, теперь осталось только реализовать рисование, этот код следует писать в блоке формирования кадра:
Code

pygame.draw.rect(screen, rect_1_color, rect_1_rect, rect_1_width)
  pygame.draw.rect(screen, rect_2_color, rect_2_rect, rect_2_width)

Как видите, тут используются все данные, которые мы объявили. Давайте проверим что получилось, заходим в меню «Run» и выбираем пункт «Run Module», как видите на окне белого цвета нарисовано два прямоугольник, один закрашенный фиолетовым цветом, а второй имеет синею обводку размером 4px.

Прямоугольники это кончено круто, но рисовать различные фигуру только с помощь прямоугольника проблематично, особенно если надо нарисовать звезду или треугольник, поможет нам в этом метод polygon класса draw. Расмотрим этот метот pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect, здесь Surface – изображение на котором будет нарисована фигура, color – цвет фигуры, pointlist – коржет из списков, где у списка есть два значение – позиция на экране по двум осям х и у, минимальное количество списков в кортеже – 2, width – ширина обводки фигуры, если width принимает значение 0, то рисуется закрашенная фигура. Вроде бы все понятно и ничего трудного нет, если нет, то приступим. Первое что нам надо это определить цвет будущего полигона, сделаем его красным и дадим название переменной - poligon_color, пишем код в блок инициализации:
Code
poligon_color = (255, 0, 0)

Цвет полигона уже есть, теперь надо создать кортеж из списков, которые представляют собой координаты точек, по которым будет строиться полигон. В этом примере будет рисоваться простой треугольник, давайте опишем в блоке инициализации простой кортеж из трех списков, назовем кортеж poligon_points:
Code
poligon_points = [(200,200),(300,300),(400,150)]

Осталось только описать переменную poligon_width, которая отвечает за ширину обводки полигона, сделаем ее равной 0, а это значит то, что полигон будет полностью закрашен:
Code
poligon_width = 0

Вот и все, для метода Draw.poligon у нас есть все данные, теперь осталось только в блоке формирования кадра написать код который рисует полигон:
Code
pygame.draw.polygon(screen, poligon_color, poligon_points, poligon_width)

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

Следующий в очереди это метод рисования круга pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect, где Surface – изображение в котором будет рисоваться круг, color – цвет фигуры, pos – позиция центра фигуры, radius – радиус круга. Для начала в блоке инициализации данных опишем цвет круга, назовем его circle_color, и пусть он будит синего цвета:
Code
circle_color = (0,0,255)

В школе нас учили тому, что чтобы нарисовать круг нам надо знать координаты его центра и радиус, координаты в PyGame как мы уже поняли это список из двух чисел, радиус это обычное число, для радиуса введем переменную circle_radius, а для позиции список circle_pos, вот код из блока инициализации данных:
Code
circle_pos = (100,300)
circle_radius = 75

Круг будет залитым это значит, то, что переменная circle_width которая отвечает за ширину обводки фигуры должна иметь значение 0:
Code
circle_width = 0

Все данные, которые должны участвовать в методе pygame.draw.circle готовы, теперь мы можем написать следующий код в блоке формирования кадра:
Code
pygame.draw.circle(screen, circle_color, circle_pos, circle_radius, circle_width)

Запустим программу и проверим, что у нас получилось:

Как видно круг синего цвета нарисуется на ура.
Теперь пришло время для рисования эллипса, за это отвечает метод pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect, где Surface – изображение на котором будет рисоваться фигура, color – цвет фигуры, Rect – прямоугольная область в которой будет рисоваться эллипс , width – ширина обводки фигуры, если принимает значение 0, то фигура закрашена. Ну что, приступим к инициализации данных для этого метода, вначале описываем цвет, для этого введем переменную ellipse_color, эллипс будет зеленого цвета:
Code
ellipse_color = (0,255,0)

Теперь надо инициализировать прямоугольную область, в которой будет рисоваться эллипс, как мы помним, прямоугольная область - это объект класса Rect, назовем этот объект ellipse_rect, вот код инициализации для него:
Code
ellipse_rect = Rect((200,10),(350,150))

Ни и в конце осталось описать размер линии обводки, как и в предыдущем примере будем использовать залитую фигуры, для этого переменная ellipse_width которая отвечает за ширину обводки должна принять значение 0:
Code
ellipse_width = 0

Для метода Draw.ellipse все данные готовы, теперь можем нарисовать этот эллипс, пишем код в блоке формирования кадра:
Code
pygame.draw.ellipse(screen, ellipse_color, ellipse_rect, ellipse_width)

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

Теперь настало время для самой странной функции рисования примитивов, это функция рисования части эллипса, давайте ее рассмотрим - pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect – здесь, Surface – изображение на котором будем рисоваться фигура, Rect – прямоугольная область в котором будет нарисован эллипс, start_angle – начальный угол рисования, stop_angle – конечный угол рисования, width – ширина линии обводки, по умолчанию равно 1, если будет задано 0 то фигура не рисуется. Практически это полная копия метода Draw.ellipse, но есть два дополнительных параметра - начальный угол и конечный, эти значения в системе радиан, для этого нам понадобится модуль math, находим код, где находится импортирование библиотеки PyGame, и перед этим кодом вставляем вот этот код:
Code
import math

Теперь надо задать цвет обводки, назовем его arc_color и сделаем черным цветом, пишем код в блоке инициализации:
Code
arc_color = (0,0,0)

Теперь надо задать прямоугольную область для рисования эллипса, назовем эту область arc_rect:
Code
arc_rect = Rect((200,250),(300,100))

Теперь пришло время для задания начального угла, как известно значения в радианах могут быть в диапазоне – ПИ..ПИ, где ПИ – математическая константа, это значит то что если начальный угол будет –ПИ, а конечный ПИ, то будет нарисована полная обводка фигуры, в нашем случае начальный угол будет равен ПИ а конечный ПИ*0.5, назовем начальный и конечный угол следующими именами - arc_start_angle и arc_end_angle, вот код инициализации этих переменных:
Code
arc_start_angle = -math.pi
arc_end_angle = math.pi * 0.5

Все готово для того чтобы написать код рисования сегмента эллипса в блоке формирования кадра:
Code
pygame.draw.arc(screen, arc_color, arc_rect, arc_start_angle, arc_end_angle)

Давайте запустим и посмотрим что получилось:

Как видите, нарисован сегмент эллипса вернее обводка сегмента ширенной в 1px, параметр width мы не указывали.
Теперь пришло время разобрать методы, которые рисуют линии. Давайте рассмотрим два метода, которые практически идентичны, первый рисует обычный отрезок - pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect, а второй рисует сглаженный отрезок - pygame.draw.aaline(Surface, color, start_pos, end_pos, blend=1): return Rect. Практически все параметры похожи кроме последнего, давайте рассмотрим все эти параметры. Surface – изображение, на котором будет рисоваться отрезок, color – цвет отрезка, start_pos – координата начальной точки отрезка, end_pos – координата последней точки отрезка, ну а теперь два разных параметра, у первого метода это width – ширина отрезка, у второго это – blend – коэффициент сглаживания отрезка. Теперь настало время инициализировать данные для этих методов, для начала нам понадобятся координаты начальных и конечных точек отрезка:
Code
line_start_pos = (100,100)
line_end_pos = (300,300)
aaline_start_pos = (110,100)
aaline_end_pos = (310,300)

Еще нам понадобится цвет отрезка, но я решил для всех отрезков использовать черный цвет и назвал переменную lines_color, осталось только написать ее инициализацию:
Code
lines_color = (0,0,0)

Ширину линии для первого метода мы указывать не будем, по умолчанию рисуется линия размером в 1px, а для второго оставим тоже по умолчанию коэффициент сглаживания, чтобы посмотреть, чем отличаются эти методы, так что пишем код в блоке формирования кадра:
Code
pygame.draw.line(screen, lines_color, line_start_pos, line_end_pos)
  pygame.draw.aaline(screen, lines_color, aaline_start_pos, aaline_end_pos, 0)

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

Теперь пришло время рассмотреть последний метод. Но как последний, ведь есть еще aalines? Дело в том, что смысл методов аа* нам уже понятен, да и два эти последние методы очень похожи, так что не вижу смысла полностью описывать метод aalines, так что рассмотрим только метод pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect, здесь Surface – изображение на котором будет рисоваться набор отрезков, color – цвет отрезков, closed – флаг, по которому определяется соединять последнею точку последнего отрезка с начальной точкой первого отрезка, то есть возможность замкнуть все отрезки, pointlist – кортеж из координат отрезков, минимальное количество координат - 2, width – ширина отрезков. Теперь начнем инициализацию данных, цвет отрезков уже есть, осталось только описать кортеж координат, назовем его lines_width, вот код инициализации этого кортежа:
Code
lines_points = [(40,50),(300,90),(70,300),(400, 232),(245,100)]

Так же еще понадобится флаг замкнутости отрезков, назовем его lines_closed но присвоим ему значение False, в этом примере отрезки не будут замкнуты:
Code
lines_closed = False

Теперь осталось описать ширину отрезков, пусть отрезки будут шириной в 8px:
Code
lines_width = 8

Все готово, осталось только добавить код в блок формирование кадра:
Code
pygame.draw.lines(screen, lines_color, lines_closed,lines_points,lines_width)

На этом все, теперь можно запустить и посмотреть, что же вышло:

В итоге должен быть написан следующий код:

Часть четвертая. Заключение.

В итоге мы рассмотрели полностью класс Draw библиотеки PyGame, поняли, что из себя представляет класс Surface и написали шаблон, который мы будем использовать в следующих статьях. В следующей статье мы поговорим об событиях в PyGame.
Если есть, вопросы или проблемы по статье обращайтесь ко мне в Л.С.
Все всем пока, желаю удачи в геймдеве. Спасибо за внимание с вами был noTformaT.

P.S.

Если вы просто скопируете программный код с этой статьи то он возможно не запустится, связано это с тем что табуляций и пробелы в Python имеют определенный смысл. Если это произошло, и программа зависла, то требуется перезагрузить терминал интерпретатора открыв в терминале меню «Shell» и выбрав пункт «Restart Shell».
И на последок для тех, кто ничего не узнал нового для себя в этой статье, введите в поиске google фразу «скорость света в попугаях/сек», узнаете для себя очень много. И что будет, если в слове гугл, заменить все буквы «г» на букву «ф»? Толком ничего, убедитесь в этом и попробуйте зайти на сайт foofle.com

Категория: Движки и Гейммейкеры | Добавил: noTformaT (06 Февраля 2011) | Автор: Карпенко Евгений
Просмотров: 33834 | Рейтинг: 3.9/15 |
Теги: Python, кодинг, Урок, Pygame, Геометрические примитивы, Скелет программы, программирование, ЯП, основы, Hello Word
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

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

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Dynami
  • Devana
  • Grit
  • DragonRuby
  • C4 Engine
  • ZDaemon
  • Away3D
  • Diligent
  • Simulant
  • GLScene
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг