Рисуем квадратиками: Игры Раскраски по Клеточкам — Онлайн Бесплатно
06.12.2020 Разное
Игра Раскраска по Клеточкам с Цифрами
Игра Раскраска по Клеточкам с Цифрами — Играть Онлайн!- игры на 2
- стрелялки
- симулятор
- головоломки
- гонки
- io
- стратегии
- майнкрафт
- тесты
- гта
- поиск предметов
- танки
- огонь и вода
- бродилки
- марио
- рисовалки
- когама
- футбол
- зомби
- ферма
- аниме
- снайпер
- одевалки
- раскраски
- пазлы
Игра Раскраски по Клеточкам — Играть Онлайн!
Игра Раскраски по Клеточкам — Играть Онлайн!- игры на 2
- стрелялки
- симулятор
- головоломки
- гонки
- io
- стратегии
- майнкрафт
- тесты
- поиск предметов
- танки
- огонь и вода
- бродилки
- марио
- рисовалки
- когама
- футбол
- зомби
- ферма
- аниме
- снайпер
- одевалки
- раскраски
- пазлы
Canvas HTML. Основы создания фигур на javascript
Автор статьи: admin
Метки: Canvas / JavaScriptВ этой статье рассмотрим основы canvas, а точнее создания фигур, от обычных квадратов, до рисования линий и кругов.
Рисуем обычную фигуру:
Для начала надо создать HTML элемент canvas, пишем код который ниже.
<canvas></canvas> |
В элементе canvas мы и будем рисовать фигуры, атрибуты width и height, нужны чтобы задать размер, иначе ширина и высота будут равны нулю и мы не чего там не увидим, по атрибуту id, будем получать сам элемент в JavaScript.
Canvas в JavaScript:
Алгоритм рисования фигуры очень простой, берём canvas элемент, и рисуем в нем фигуру, вот как рисовать квадрат.
// Получаем элемент canvas let canvas = document.getElementById(«canvas»);
// Назначаем тип рисования let ctx = canvas.getContext(‘2d’); // Назначаем цвет рисования ctx.fillStyle = «red»; // Рисуем квадрат ctx.fillRect(100, 50, 100, 100); |
Вот что получилось.
Теперь рассмотрим одну функцию по подробнее, это функция getContext('2d')
, она делает контекст для рисования, то есть в нашем случае будем рисовать 2d графику, также можно работать и с 3d графикой, но об этом в другой раз.
базовые функции для рисования квадрата:
- fillStyle — Назначает цвет для заливки;
- strokeStyle — Назначает цвет для контуров или линий;
- fillRect(x, y, width, height) — Создаёт квадрат или прямоугольник с заливкой;
- strokeRect(x, y, width, height) — Создаёт квадрат или прямоугольник без заливки, то есть контуры;
- clearRect(x, y, width, height) — стирает область заданную в параметрах;
Давайте подробнее рассмотрим параметры функций, если с width и height всё понятно, это ширина и высота прямоугольника соответственно, а вот с x и y не всё так однозначно как хотелось бы, в том дело, что расчёт ведётся не так как мы привыкли в математики, там наоборот y идёт с верху вниз, x с лева на права, думаю схема которая нарисована ниже поможет в этом разобратся.
Эта схема может не много кривая, но суть на мой взгляд ясна, но надо сказать что «px» не надо писать, когда задаёте параметр, задаёте просто число.
Рисуем линии:
Для линий точно также создаём элемент canvas.
Сanvas линии в JavaScript:
Алгоритм рисования линий таков, берём первую позицию и рисуем линии до второй позиции.
let canvas = document.getElementById(«canvas»);
let ctx = canvas.getContext(‘2d’); ctx.fillStyle = «green»; ctx.beginPath(); ctx.moveTo(50, 70); ctx.lineTo(100, 20); ctx.lineTo(150, 70); ctx.fill();
ctx.moveTo(50, 80); ctx.lineTo(150, 80); ctx.lineTo(100, 130); ctx.closePath() ctx.stroke(); |
Вот что получилось.
Рассмотрим функции, которые могут пригодится для создания линий и своих фигур, например, треугольник.
- beginPath() — Создаёт новый путь;
- moveTo(x, y) — Добавляет начальную позицию пути;
- lineTo(x, y) — Следующая позиция, можно использовать после moveTo и после lineTo;
- fill() — Заливает фигуру, цветом заданным fillStyle;
- stroke() — Добавляет линиям цвет загаданный strokeStyle, иначе их не будет видно или если не задан, то делает их чёрными;
- closePath() — Делает линию между первоначальной позицию и последней позицией;
Это все базовые функции которые вам пригодятся для работы с линиями в canvas.
Рисуем круги:
С кругами всё точно также, как и с линиями, только одна функция отличается.
let canvas = document.getElementById(«canvas»);
let ctx = canvas.getContext(‘2d’); ctx.fillStyle = «blue»; ctx.beginPath(); ctx.arc(75, 75, 50, 0, Math.PI*2, true); ctx.fill(); ctx.moveTo(110, 75); ctx.arc(75, 75, 35, 0, Math.PI, false); ctx.closePath() ctx.stroke(); |
Вот что получилось.
Как видите единственное что отличается от линий, это функция arc(), которая рисует дуги, рассмотрим её по подробнее.
arc(x, y, radius, startAngle, endAngle, anticlockwise):
- x и y — С этими параметрами всё понятно, это позиция центра окружности:
- radius — Это просто радиус;
- startAngle — Угол начала дуги, измеряется по часовой стрелке от положительной оси Х, выражается в радианах;
- endAngle — Угол завершения дуги, всё остальное точно также как у параметра srartAngle;
- anticlockwise — Задаёт направление рисования дуги. Если true — против часовой, false — по часовой;
Вот как то так работать с дугами.
Вывод:
Здесь было показано основы работы с canvas, а точнее работа с прямоугольниками, линиями и дугами, надеюсь вам было это полезно, ещё скачайте файл, в нём будет код из статьи.
Если вы всё поняли в этой статье и готовы продолжать дальше учить Canvas, то прочитайте это: Canvas анимация на JavaScript, простыми словами и без воды.
Подписываетесь на соц-сети:
Оценка:
Количество оценивших: 2
Средняя оценка: 3,50
Также рекомендую:
Онлайн игра Пиксельная Графика: Раскраска по номерам (Color Pixel Art Classic — Paint by Pixels)
Пиксельная Графика: Раскраска по номерам
запустить игру
Пропустить рекламу
Поделиться игрой:
Описание
Рисуй пикселями онлайн в игре «Пиксельная Графика: Раскраска по номерам», и ты можешь стать пиксельным художником! Определись с категорией и начни создавать красочные иллюстрации. Выбирай цвет с номером и закрашивай соответствующую область по одному пикселю или удерживайте и закрашивайте несколько стразу. Погрузись в красочный мир пикселей вместе с онлайн игрой «Color Pixel Art Classic — Paint by Pixels»!
Скриншоты
Как играть в игру Пиксельная Графика: Раскраска по номерам?
Управление в игре «Пиксельная Графика: Раскраска по номерам» на ПК осуществляется при помощи мышки, а на сенсорных экранах при помощи тапов. Рисуйте по пикселям и получайте красочные рисунки.
Видео прохождение
Подписывайтесь на наш YouTube-канал!
Раскраска по цифрам, клеточкам и номерам 1.4
«Раскраска по цифрам, клеточкам и номерам» — игра, в которой нужно раскрашивать рисунки, выполненные в пиксельном формате. С выбором карандашей сложностей не возникает — сориентироваться помогут цифры в квадратиках. Скачав на Андроид «Раскраску по цифрам, клеточкам и номерам», можно получить бесплатную раскраску, помогающую снять стресс. Использование приложения доступно без подключения интернета на телефоне.
Разделы
Рисунки для раскрашивания отсортированы по восьми следующим тематикам:
- Fashion — сердечки, губы и глаза.
- People — фотографии людей и мультяшные персонажи.
- Animals — животные, рыбки и птицы.
- Fantasy — фантастические герои.
- Nature — деревья, цветы и ягоды.
- Food — еда.
- Cars — транспорт и летательная техника.
- Other — разное.
Имеющиеся рисунки распределены по категориям Popular и All.
Процесс разукрашивания
Необходимо выбрать картинку, заполнить все сектора, обозначенные числами, которым соответствуют определенные цвета. Зарисовываются клеточки одиночным нажатием. Возможен специальный режим, позволяющий рисовать пальцем на больших участках. Неправильно заполненные сектора очищаются с помощью ластика. Для удобства рисунок можно увеличивать.
Готовые и незаконченные картины хранятся в разделе My Works. Работу над незавершенными изображениями можно продолжить. Доступна отправка результатов творчества с помощью мессенджеров и социальных сетей.
Приложение «Раскраска по цифрам, клеточкам и номерам» для Андроид позволит побыть в роли художника, а полученными шедеврами можно поделиться с друзьями.
Вы можете скачать Раскраска по цифрам, клеточкам и номерам на Андроид бесплатно по прямой ссылке ниже.
Если у Вас появилась какая-то ошибка во время загрузки файла или есть вопросы, пожалуйста, напишите подробно об этом в комментариях к данной новости.
СКОРО В ШКОЛУ. ДЕКОРАТИВНОЕ РИСОВАНИЕ НА КВАДРАТЕ
СКОРО В ШКОЛУ. ДЕКОРАТИВНОЕ РИСОВАНИЕ
НА КВАДРАТЕ
Реализация содержания программы в образовательных областях: «Речевое развитие», «Физическое развитие», «Художественно-эстетическое развитие», «Социально-коммуникативное развитие».
Виды детской деятельности: игровая, коммуникативная, изобразительная, восприятие художественной литературы и фольклора, самообслуживание и элементарный бытовой труд.
Цели: закреплять умение составлять рассказ по памяти на тему «Что я видел в школе», оформлять декоративную композицию на квадрате, используя цветы, листья, дуги; учить подбирать обобщающие слова для группы предметов; развивать фонематический слух, эстетические чувства, воображение; упражнять в рисовании кистью (концом, плашмя и т. д.); воспитывать инициативу, самостоятельность, активность.
Целевые ориентиры дошкольного образования: умеет составлять рассказ, употребляя в речи сравнительные прилагательные и образные выражения; владеет навыком диалогической речи, формулирует ответы на наводящие вопросы педагога в процессе пересказа; умеет отгадывать загадки; различает жанры литературного произведения; самостоятельно выполняет рисунок декоративного орнамента.
Материалы и оборудование
: картинки с изображением школьных принадлежностей; квадрат белой бумаги или любого светлого тона размером 20 × 20 см, гуашь, кисти.Содержание
организованной деятельности детей
1. Введение игрового момента.
– У нас в гостях Мальвина. Она очень любит учиться, поэтому приглашает нас в школу.
2. Развитие речи «Скоро в школу».
– 1 сентября – праздник первого звонка. Это самый долгожданный день для тех, кто впервые переступит школьный порог. Это праздник и для первоклашек, и для всех школьников. Этот день для них самый волнующий и запоминающийся. Отгадайте загадки о школьных принадлежностях и расскажите, зачем нужны эти предметы ученикам?
Буквы-значки, как бойцы на парад,
В строгом порядке построились в ряд.
(Алфавит.)
Новый дом несу в руке,
Дверцы дома – на замке.
Тут жильцы бумажные,
Все ужасно важные.
(Портфель.)
По черному белым
Пишут то и дело.
Протрут тряпицей –
Чиста страница.
(Доска.)
Я – твой товарищ, капитан,Когда разгневан океан,
И ты скитаешься во мгле
На одиноком корабле, –
Зажги фонарь во тьме ночной
И посоветуйся со мной:
Я закачаюсь, задрожу –
И путь на север укажу.
(Компас.)
Не похож на человека,
Но имеет он сердечко.
И работе круглый год
Он сердечко отдает.
Пишет он, когда диктуют,
А сегодня вечерком
Он и чертит, и рисует.
Он раскрасил мой альбом.
(Карандаш.)
Я люблю прямоту,
Я сама прямая.
Сделать новую черту
Вам я помогаю.
Что-нибудь без меня
Начертить сумей-ка.
Угадайте-ка, друзья,
Кто же я?.. (Линейка.)
То я в клетку, то в линейку, –
Написать по ним сумей-ка,
Можешь и нарисовать,
Называюсь я… (тетрадь).
На столе передо мной
Закрутился шар земной:
Арктика, экватор, полюс, –
Уместил всю землю… (глобус).
Свою косичку без опаски
Она обмакивает в краски.
Потом окрашенной косичкой
В альбоме водит по страничке.
(Кисть.)
3. Декоративное рисование на квадрате.
– Давайте сделаем для Мальвины подарок – платочки. Рассмотрите цветы, народные орнаменты, платки, ткани, оформленные цветами и листьями.
– Какие цветы и листья можно использовать? Как получить из имеющихся красок светлые оттенки красного, голубого?
Дети изображают орнамент на квадратных листах бумаги.
4. Итог занятия.
– Рассмотрите все рисунки и выберите наиболее интересные. Что на них изображено?
Рисование круга, прямоугольника, линии и т. Д. С помощью Python, Pillow
Модуль ImageDraw
библиотеки обработки изображений Python Pillow (PIL) предоставляет ряд методов для рисования фигур, таких как круг, квадрат и прямая линия.
См. Следующую статью для получения информации об установке и базовом использовании Pillow (PIL).
Схема рисунков
Создать объект рисования
Подготовьте объект Image
фонового изображения (изображение для рисования фигуры) и используйте его для создания объекта Draw
.Не забудьте импортировать Image
и ImageDraw
.
из PIL import Image, ImageDraw
im = Image.new ('RGB', (500, 300), (128, 128, 128))
draw = ImageDraw.Draw (im)
Здесь создайте сплошное изображение с помощью Image.new ()
. Режим, размер и цвет заливки указываются в параметрах.
Нарисуйте фигуру методом рисования
Вызовите метод рисования из объекта Draw
, чтобы нарисовать фигуру.
Нарисуйте для примера эллипс, прямоугольник и прямую линию.Параметры будут описаны позже.
draw.ellipse ((100, 100, 150, 200), fill = (255, 0, 0), outline = (0, 0, 0))
draw.rectangle ((200, 100, 300, 200), fill = (0, 192, 192), контур = (255, 255, 255))
draw.line ((350, 200, 450, 100), fill = (255, 255, 0), width = 10)
im.save ('data / dst / Pillow_imagedraw.jpg', качество = 95)
Метод нанесения
Общие параметры
Хотя метод различается в зависимости от метода, следующие параметры являются общими.
xy
Задайте прямоугольную область для рисования фигуры.
Укажите в одном из следующих форматов:
-
(((Координата x вверху слева, координата y вверху слева), (координата x внизу справа, координата y внизу справа))
-
(верхняя левая координата x, верхняя левая координата y, нижняя правая координата x, нижняя правая координата y)
В line ()
, polygon ()
и point ()
указывается несколько координат вместо двух точек, представляющих прямоугольную область.
-
(x1, y1, x2, y2, x3, y3 ...)
-
((x1, y1), (x2, y2), (x3, y3) ...)
line ()
рисует прямую линию, соединяющую каждую точку, polygon ()
рисует многоугольник, в котором каждая точка соединяется, а point ()
рисует точку размером 1 пиксель в каждой точке.
заливка
Установите цвет заливки формы.
Формат спецификации различается в зависимости от режима изображения (объект Изображение
).
-
RGB
: Установите каждое значение цвета (0-255) в виде(R, G, B)
-
L
(оттенки серого): установите значение (0-255) как целое число
По умолчанию Нет
(без заполнения).
наброски
Установите цвет границы рисунка.
Формат спецификации цвета такой же, как заливка
выше. По умолчанию Нет
(без рамки).
Начиная с версии 4.4.0
, нет возможности установить ширину линии (толщину линии), кроме line ()
.
Пример метода
Подробности см. В официальном документе.
Эллипс, прямоугольник
- Эллипс (круг):
эллипс (xy, заливка, контур)
- Прямоугольник (квадрат):
прямоугольник (xy, заливка, контур)
ellipse ()
рисует эллипс, касательный к прямоугольной области, заданной аргументом xy
. Указание квадрата дает истинный круг.
Выходные результаты показаны в приведенном выше примере.
Линия, многоугольник, точка
- Линия:
линия (xy, заливка, ширина)
-
xy
- Задайте несколько координат двух или более точек как
((x1, y1), (x2, y2), (x3, y3). ..)
. - Отрисовываются линии, соединяющие каждую точку.
- Задайте несколько координат двух или более точек как
-
width
: Ширина линии (толщина линии)- Обратите внимание, что если вы увеличите ширину линии до
width
, указав 3 точки или более сxy
, соединение будет выглядеть непривлекательно.
- Обратите внимание, что если вы увеличите ширину линии до
-
- Многоугольник:
многоугольника (xy, заливка, контур)
-
xy
- Задайте несколько координат трех или более точек как
((x1, y1), (x2, y2), (x3, y3) .. .)
. - Нарисован многоугольник, в котором каждая точка соединена.
- Задайте несколько координат трех или более точек как
-
- Точка:
точка (xy, заливка)
-
xy
- Установить несколько координат одной или нескольких точек как
((x1, y1), (x2, y2), (x3, y3)...)
. - Для каждой точки рисуется одна точка пикселя.
- Установить несколько координат одной или нескольких точек как
-
Пример линий ( line ()
), многоугольника ( polygon ()
), точки ( point ()
) выглядит следующим образом. Поскольку точка составляет 1 пиксель, ее трудно увидеть, но она нарисована с правой стороны.
im = Image.new ('RGB', (500, 250), (128, 128, 128))
draw = ImageDraw.Draw (im)
draw.line (((30, 200), (130, 100), (80, 50)), fill = (255, 255, 0))
draw.line (((80, 200), (180, 100), (130, 50)), fill = (255, 255, 0), width = 10)
рисовать.многоугольник (((200, 200), (300, 100), (250, 50)), fill = (255, 255, 0), outline = (0, 0, 0))
draw.point (((350, 200), (450, 100), (400, 50)), fill = (255, 255, 0))
Дуга, хорда, круг
Рисуются дуга, пояс (дуга) и круг, касающийся прямоугольной области, заданной аргументом xy
.
- Дуга:
дуга (xy, начало, конец, заполнение)
-
начало
,конец
- Задайте угол дуги в градусах.
- 0 градусов — это направление на 3 часа. по часовой стрелке.
-
- Хорда (смычок):
Хорда (xy, начало, конец, заливка, контур)
- Начальная и конечная точки дуги соединяются прямой линией.
- Круговая диаграмма:
круговая диаграмма (xy, начало, конец, заливка, контур)
- Начальная и конечная точки дуги соединены прямой линией с центром круга.
Пример дуги ( arc ()
), хорды ( chord ()
), пирога ( pieslice ()
) выглядит следующим образом.
im = Image.new ('RGB', (600, 250), (128, 128, 128))
draw = ImageDraw.Draw (im)
draw.arc ((25, 50, 175, 200), начало = 30, конец = 270, заполнение = (255, 255, 0))
draw.chord ((225, 50, 375, 200), начало = 30, конец = 270, заливка = (255, 255, 0), контур = (0, 0, 0))
draw.pieslice ((425, 50, 575, 200), начало = 30, конец = 270, заполнение = (255, 255, 0), контур = (0, 0, 0))
Рисунок
В предыдущих примерах фигуры нарисованы на сплошном изображении, созданном Image.новый ()
. Если существующий файл изображения читается Image.open ()
, он может быть нарисован на нем.
im = Image.open ('data / src / lena.jpg')
draw = ImageDraw.Draw (im)
draw.pieslice ((15, 50, 140, 175), начало = 30, конец = 330, заполнение = (255, 255, 0))
Рисование графики — Изучение веб-разработки
Браузер содержит несколько очень мощных инструментов программирования графики, от языка масштабируемой векторной графики (SVG) до API для рисования на элементах HTML (см. Canvas API и WebGL).В этой статье представлено введение в Canvas и дополнительные ресурсы, которые позволят вам узнать больше.
Как мы говорили в нашем модуле HTML-мультимедиа и встраивания, Интернет изначально был просто текстом, что было очень скучно, поэтому были введены изображения — сначала через элемент
, а затем через свойства CSS, такие как background-image
и SVG.
Однако этого было недостаточно. Хотя вы могли использовать CSS и JavaScript для анимации (и иного управления) векторных изображений SVG — поскольку они представлены разметкой — по-прежнему не было возможности сделать то же самое для растровых изображений, а доступные инструменты были довольно ограничены.В Интернете по-прежнему не было возможности эффективно создавать анимацию, игры, 3D-сцены и другие требования, которые обычно выполняются языками более низкого уровня, такими как C ++ или Java.
Ситуация начала улучшаться, когда браузеры начали поддерживать элемент и связанный с ним Canvas API — Apple изобрела его примерно в 2004 году, а другие браузеры внедрили его в последующие годы. Как вы увидите ниже, холст предоставляет множество полезных инструментов для создания 2D-анимации, игр, визуализации данных и других типов приложений, особенно в сочетании с некоторыми другими API-интерфейсами, предоставляемыми веб-платформой.
В приведенном ниже примере показана простая двухмерная анимация прыгающих мячей на основе холста, которую мы изначально встречали в нашем модуле «Введение в объекты JavaScript»:
Примерно в 2006–2007 годах Mozilla начала работу над экспериментальной реализацией трехмерного холста. Им стал WebGL, завоевавший популярность среди производителей браузеров и стандартизированный примерно в 2009–2010 годах. WebGL позволяет создавать настоящую трехмерную графику в вашем веб-браузере; в приведенном ниже примере показан простой вращающийся куб WebGL:
В этой статье основное внимание будет уделено 2D-холсту, поскольку исходный код WebGL очень сложен.Однако мы покажем, как использовать библиотеку WebGL для более простого создания 3D-сцены, и вы можете найти учебное пособие, посвященное необработанному WebGL, в другом месте — см. Начало работы с WebGL.
Примечание : Базовая функциональность холста хорошо поддерживается во всех браузерах, за исключением IE 8 и ниже для 2D-холста и IE 11 и ниже для WebGL.
Если вы хотите создать 2D-сцену или 3D на веб-странице, вам нужно начать с элемента HTML .Этот элемент используется для определения области на странице, в которой будет нарисовано изображение. Это так же просто, как добавить на страницу элемент:
Это создаст холст на странице размером 320 на 240 пикселей.
Внутри тегов холста вы можете поместить резервный контент, который отображается, если браузер пользователя не поддерживает холст.
<холст>
Ваш браузер не поддерживает холст.Бу-у-у!
Конечно, это сообщение бесполезно! В реальном примере вам нужно связать резервное содержимое с содержимым холста. Например, если вы визуализируете постоянно обновляемый график цен на акции, резервным контентом может быть статическое изображение последнего графика акций с альтернативным текстом, указывающим цены в тексте.
Создание и изменение размера нашего холста
Давайте начнем с создания нашего собственного холста, на котором мы будем проводить будущие эксперименты.
Сначала создайте локальную копию нашего файла 0_canvas_start.html и откройте ее в текстовом редакторе.
Добавьте в него следующий код сразу под открывающим тегом
<холст>
Добавьте сюда подходящий запасной вариант.
Мы добавили
класс
к элементу, чтобы было легче выбрать, если у нас есть несколько холстов на странице, но мы удалили атрибуты
width
иheight
на данный момент (вы могли добавьте их обратно, если хотите, но мы установим их с помощью JavaScript в разделе ниже).Холсты без явной ширины и высоты по умолчанию составляют 300 пикселей в ширину на 150 пикселей в высоту.Теперь добавьте следующие строки JavaScript в элемент
const canvas=document.querySelector('. MyCanvas');const width=canvas.width=window.innerWidth;const height=canvas.height=window.innerHeight;
Здесь мы сохранили ссылку на холст в константе
холста
.Во второй строке мы устанавливаем как новую постоянную ширину,так и свойство холста
width
равнымWindow.innerWidth
(что дает нам ширину области просмотра).В третьей строке мы устанавливаем новую константуheight
и свойство холстаheight
равнымWindow.innerHeight
(что дает нам высоту области просмотра).Итак,теперь у нас есть холст,занимающий всю ширину и высоту окна браузера!Вы также увидите,что мы связываем назначения вместе с несколькими знаками равенства-это разрешено в JavaScript,и это хороший метод,если вы хотите сделать несколько переменных равными одному и тому же значению.Мы хотели сделать ширину и высоту холста легко доступными в переменных ширины/высоты,так как они являются полезными значениями,которые можно будет использовать позже(например,если вы хотите нарисовать что-то ровно посередине ширины холста).
Если вы сохраните и загрузите свой пример в браузере сейчас,вы ничего не увидите,и это нормально,но вы также увидите полосы прокрутки-это проблема для нас,потому что элемент
имеет
margin
,которое,добавленное к нашему холсту во весь размер окна,дает документ,который шире,чем окно.Чтобы избавиться от полос прокрутки,нам нужно удалить поле,а также установить
overflow
наhidden
.Добавьте следующее ввашего документа:
<стиль>body{маржа:0;переполнение:скрыто;}
Полосы прокрутки должны исчезнуть.
Примечание:Обычно размер изображения следует устанавливать с помощью атрибутов HTML или свойств DOM,как описано выше.Вы можете использовать CSS,но проблема в том,что изменение размера выполняется после рендеринга холста,и,как и любое другое изображение(визуализированный холст-это просто изображение),изображение может стать пиксельным/искаженным.
Получение контекста холста и окончательная настройка
Нам нужно сделать одну последнюю вещь,прежде чем мы сможем считать наш шаблон холста готовым.Чтобы рисовать на холсте,нам нужно получить специальную ссылку на область рисования,называемую контекстом.Это делается с помощьюHTMLCanvasElement.getContext()
,который для базового использования принимает одну строку в качестве параметра,представляющего тип контекста,который вы хотите получить.
В данном случае нам нужен двухмерный холст,поэтому добавьте следующую строку JavaScript под другими внутри элемента:
const ctx=canvas.getContext('2d');
Примечание:другие значения контекста,которые вы можете выбрать,включаютwebgl
для WebGL,webgl2
для WebGL 2 и т.Д.,но в этой статье они нам не понадобятся.
Вот и все-наш холст загрунтован и готов к рисованию!Переменнаяctx
теперь содержит объектCanvasRenderingContext2D
,и все операции рисования на холсте будут включать манипулирование этим объектом.
Давайте сделаем еще одно,прежде чем двигаться дальше.Мы окрасим фон холста в черный цвет,чтобы вы впервые почувствовали API холста.Добавьте следующие строки внизу вашего JavaScript:
CTX.fillStyle='rgb (0, 0, 0)';ctx.fillRect(0,0,ширина,высота);
Здесь мы устанавливаем цвет заливки,используя свойствоfillStyle
холста(оно принимает значения цвета,как и свойства CSS),затем рисуем прямоугольник,который покрывает всю область холста с помощью методаfillRect
(первые два параметры-это координаты верхнего левого угла прямоугольника;последние два-это ширина и высота,на которых вы хотите нарисовать прямоугольник-мы сказали вам,что эти переменныеwidth
иheight
будут полезны)!
Хорошо,наш шаблон готов,и пора двигаться дальше.
Как было сказано выше,все операции рисования выполняются путем манипулирования объектомCanvasRenderingContext2D
(в нашем случаеctx
).Многим операциям необходимо задать координаты,чтобы точно указать,где что-то рисовать-верхний левый угол холста-это точка(0,0),горизонтальная ось(x)проходит слева направо,а вертикальная ось(y)идет от сверху вниз.
Рисование фигур обычно выполняется с использованием примитива прямоугольной формы или путем обведения линии вдоль определенного пути с последующим заполнением формы.Ниже мы покажем,как это сделать.
Простые прямоугольники
Начнем с простых прямоугольников.
Прежде всего,сделайте копию недавно закодированного шаблона холста(или сделайте локальную копию 1_canvas_template.html,если вы не выполнили вышеуказанные шаги).
Затем добавьте следующие строки в конец вашего JavaScript:
ctx.fillStyle='rgb (255, 0, 0)';ctx.fillRect(50,50,100,150);
При сохранении и обновлении вы должны увидеть красный прямоугольник на холсте.Его верхний левый угол находится на расстоянии 50 пикселей от верхнего и левого края холста(как определено первыми двумя параметрами),и он имеет ширину 100 пикселей и высоту 150 пикселей(как определено третьим и четвертым параметрами).
Давайте добавим еще один прямоугольник в микс,на этот раз зеленый.Добавьте следующее внизу вашего JavaScript:
ctx.fillStyle='rgb (0, 255, 0)';ctx.fillRect(75,75,100,100);
Сохраните и обновите,и вы увидите новый прямоугольник.Это поднимает важный вопрос:графические операции,такие как рисование прямоугольников,линий и т.Д.,Выполняются в том порядке,в котором они происходят.Думайте об этом как о росписи стены,где каждый слой краски накладывается друг на друга и может даже скрыть то,что находится под ним.Вы не можете ничего сделать,чтобы это изменить,поэтому вам нужно тщательно продумать порядок,в котором вы рисуете графику.
Обратите внимание,что вы можете рисовать полупрозрачную графику,задав полупрозрачный цвет,например,используя
rgba()
.Значениеи
определяет так называемый «альфа-канал» или степень прозрачности цвета.Чем выше его значение,тем больше он скрывает то,что стоит за ним.Добавьте в свой код следующее:ctx.fillStyle='rgba (255, 0, 255, 0,75)';ctx.fillRect(25,100,175,50);
А теперь попробуйте нарисовать еще несколько собственных прямоугольников;радоваться,веселиться!
Обводки и ширина линий
До сих пор мы рассматривали рисование закрашенных прямоугольников,но вы также можете рисовать прямоугольники,которые представляют собой просто контуры(в графическом дизайне они называютсяштрихами).Чтобы задать цвет обводки,используйте свойствоstrokeStyle
;рисование прямоугольника обводки выполняется с помощьюstrokeRect
.
Добавьте следующее к предыдущему примеру,снова под предыдущими строками JavaScript:
ctx.strokeStyle='rgb (255, 255, 255)';ctx.strokeRect(25,25,175,200);
Ширина штрихов по умолчанию-1 пиксель;вы можете настроить значение свойства
lineWidth
,чтобы изменить это(требуется число,представляющее ширину штриха в пикселях).Добавьте следующую строку между двумя предыдущими строками:ctx.lineWidth=5;
Теперь вы должны увидеть,что ваш белый контур стал намного толще!На этом пока все.На данный момент ваш пример должен выглядеть так:
Рисование контуров
Если вы хотите нарисовать что-нибудь более сложное,чем прямоугольник,вам нужно нарисовать путь.По сути,это включает в себя написание кода,чтобы точно указать,по какому пути должно двигаться перо на холсте,чтобы обвести форму,которую вы хотите нарисовать.Canvas включает функции для рисования прямых линий,кругов,кривых Безье и т.Д.
Давайте начнем с создания раздела,сделав новую копию нашего шаблона холста(1_canvas_template.html),в которой будем рисовать новый пример.
Мы будем использовать некоторые общие методы и свойства во всех следующих разделах:
beginPath()
-начать рисование пути в точке,где перо в данный момент находится на холсте.На новом холсте перо начинается с(0,0).moveTo()
-переместить перо в другую точку холста,не записывая и не отслеживая линию;перо"перескакивает"в новое положение.fill()
-нарисуйте форму с заливкой,заполнив путь,который вы уже проследили.stroke()
-нарисуйте контурную фигуру,проведя обводку по уже нарисованному пути.- Вы также можете использовать такие функции,как
lineWidth
иfillStyle
/strokeStyle
,с контурами и прямоугольниками.
Типичная простая операция рисования пути будет выглядеть примерно так:
ctx.fillStyle='rgb (255, 0, 0)';ctx.beginPath();ctx.moveTo(50,50);ctx.fill();
Рисование линий
Нарисуем на холсте равносторонний треугольник.
Прежде всего,добавьте следующую вспомогательную функцию в конец вашего кода.Это преобразует значения градусов в радианы,что полезно,потому что всякий раз,когда вам нужно указать значение угла в JavaScript,оно почти всегда будет в радианах,но люди обычно думают в градусах.
function degToRad(градусы){вернуть градусы*Math.PI/180;};
Затем начните свой путь,добавив следующее ниже вашего предыдущего добавления;здесь мы устанавливаем цвет для нашего треугольника,начинаем рисовать путь,а затем перемещаем перо на(50,50),ничего не рисуя.Здесь мы начнем рисовать наш треугольник.
ctx.fillStyle='rgb (255, 0, 0)';ctx.beginPath();ctx.moveTo(50,50);
Теперь добавьте следующие строки внизу вашего скрипта:
CTX.lineTo(150,50);пусть triHeight=50*Math.tan(degToRad(60));ctx.lineTo(100,50+triHeight);ctx.lineTo(50,50);ctx.fill();
Давайте рассмотрим это по порядку:
Сначала мы рисуем линию до(150,50)-теперь наш путь проходит на 100 пикселей вправо по оси x.
Во-вторых,мы вычисляем высоту нашего равностороннего треугольника,используя небольшую простую тригонометрию.По сути,мы рисуем треугольник,направленный вниз.Углы в равностороннем треугольнике всегда равны 60 градусам;чтобы вычислить высоту,мы можем разделить его посередине на два прямоугольных треугольника,каждый из которых будет иметь углы 90 градусов,60 градусов и 30 градусов.По сторонам:
- Самая длинная сторона называется гипотенузой
- Сторона рядом с углом 60 градусов называетсясмежным,что,как мы знаем,составляет 50 пикселей,так как это половина линии,которую мы только что нарисовали.
- Сторона,противоположная углу 60 градусов,называетсяпротивоположной,которая представляет собой высоту треугольника,который мы хотим вычислить.
Одна из основных тригонометрических формул гласит,что длина смежного элемента,умноженная на тангенс угла,равна противоположному,поэтому мы получаем
50*Math.загар(degToRad(60))
.Мы используем нашу функциюdegToRad()
для преобразования 60 градусов в радианы,посколькуMath.tan()
ожидает входное значение в радианах.Рассчитав высоту,мы рисуем еще одну линию до
(100,50+triHeight)
.Координата X проста;он должен быть посередине между двумя предыдущими значениями X,которые мы установили.С другой стороны,значение Y должно быть 50 плюс высота треугольника,поскольку мы знаем,что вершина треугольника находится на расстоянии 50 пикселей от верха холста.Следующая линия возвращает линию к начальной точке треугольника.
Наконец,мы запускаем
ctx.fill()
,чтобы завершить путь и заполнить форму.
Круги для рисования
Теперь давайте посмотрим,как нарисовать круг на холсте.Это достигается с помощью методаarc()
,который рисует весь круг или его часть в указанной точке.
Давайте добавим дугу к нашему холсту-добавьте в конец кода следующее:
CTX.fillStyle='rgb (0, 0, 255)';ctx.beginPath();ctx.arc(150,106,50,degToRad(0),degToRad(360),ложь);ctx.fill();
arc()
принимает шесть параметров.Первые два определяют положение центра дуги(X и Y соответственно).Третий-это радиус круга,четвертый и пятый-начальный и конечный углы,под которыми следует рисовать круг(поэтому указание 0 и 360 градусов дает нам полный круг),а шестой параметр определяет,следует ли рисовать круг против часовой стрелки(против часовой стрелки)или по часовой стрелке(ложь
по часовой стрелке).Примечание:0 градусов по горизонтали вправо.
Попробуем добавить еще одну дугу:
ctx.fillStyle='желтый';ctx.beginPath();ctx.arc(200,106,50,degToRad(-45),degToRad(45),истина);ctx.lineTo(200,106);ctx.fill();
Схема здесь очень похожа,но с двумя отличиями:
- Мы установили последний параметр
arc()
наtrue
,что означает,что дуга рисуется против часовой стрелки,что означает,что даже если дуга задана как начинающаяся с-45 градусов и заканчивающаяся на 45 градусов,мы рисуем дуга вокруг 270 градусов не внутри этой части.Если вы изменитеtrue
наfalse
,а затем повторно запустите код,будет нарисован только 90-градусный срез круга. - Перед вызовом
fill()
мы проводим линию к центру круга.Это означает,что мы получаем довольно симпатичный вырез в стиле Pac-Man.Если вы удалите эту строку(попробуйте!),А затем повторно запустите код,вы получите только край круга,отрубленный между начальной и конечной точкой дуги.Это иллюстрирует еще один важный момент холста-если вы попытаетесь заполнить неполный путь(т.е.тот,который не закрыт),браузер заполняет прямую линию между начальной и конечной точкой,а затем заполняет ее.
- Мы установили последний параметр
На этом все;ваш последний пример должен выглядеть так:
Примечание:Чтобы узнать больше о расширенных функциях рисования контуров,таких как кривые Безье,ознакомьтесь с нашим руководством по рисованию фигур с помощью холста.
Текст
Canvas также имеет функции для рисования текста.Давайте кратко рассмотрим их.Начните с создания еще одной новой копии нашего шаблона холста(1_canvas_template.html),в котором нужно нарисовать новый пример.
Текст рисуется двумя способами:
Оба они принимают три свойства в их основном использовании:текстовую строку для рисования и координаты X и Y точки,в которой начинается рисование текста.Это работает как нижний левый уголтекстового поля(буквально,поле,окружающее текст,который вы рисуете),что может сбить вас с толку,поскольку другие операции рисования,как правило,начинаются с левого верхнего угла-имейте это в виду.
Существует также ряд свойств,помогающих управлять отрисовкой текста,напримерfont
,который позволяет вам указать семейство шрифтов,размер и т.Д.Он принимает в качестве значения тот же синтаксис,что и свойство CSSfont
.
Попробуйте добавить следующий блок в конец вашего JavaScript:
ctx.strokeStyle='белый';ctx.lineWidth=1;ctx.font='36px arial';ctx.strokeText('Текст холста',50,50);ctx.fillStyle='красный';ctx.font='48px грузия';ctx.fillText('Текст холста',50,150);
Здесь мы рисуем две строки текста,одну контурную и другую обводку.Последний пример должен выглядеть так:
Поиграйте и посмотрите,что вы можете придумать!Дополнительную информацию о параметрах,доступных для текста холста,можно найти в разделе «Рисование текста».
Нанесение изображений на холст
Можно визуализировать внешние изображения на вашем холсте.Это могут быть простые изображения,кадры из видеороликов или контент других полотен.На данный момент мы просто рассмотрим случай использования нескольких простых изображений на нашем холсте.
Как и раньше,сделайте еще одну новую копию нашего шаблона холста(1_canvas_template.html),в которой будет рисовать новый пример.В этом случае вам также необходимо сохранить копию нашего образца изображения-firefox.png-в том же каталоге.
Изображения выводятся на холст с помощью метода
drawImage()
.Самая простая версия принимает три параметра-ссылку на изображение,которое вы хотите визуализировать,и координаты X и Y левого верхнего угла изображения.Давайте начнем с создания источника изображения для встраивания в наш холст.Добавьте следующие строки в конец вашего JavaScript:
пусть изображение=новое изображение();image.src='firefox.png';
Здесь мы создаем новый объект
HTMLImageElement
,используя конструкторImage()
.Возвращаемый объект имеет тот же тип,что и тот,который возвращается при захвате ссылки на существующий элемент).Затем мы устанавливаем его атрибут
src
,равный нашему изображению логотипа Firefox.На этом этапе браузер начинает загрузку изображения.Теперь мы можем попытаться встроить изображение с помощью
drawImage()
,но нам нужно убедиться,что файл изображения был загружен первым,иначе код не будет работать.Мы можем добиться этого с помощью обработчика событийonload
,который будет вызываться только после завершения загрузки изображения.Добавьте следующий блок под предыдущим:image.onload=function(){ctx.drawImage(изображение,50,50);}
Если вы сейчас загрузите свой пример в браузер,вы должны увидеть изображение,встроенное в холст.
Но это еще не все!Что,если мы хотим отобразить только часть изображения или изменить его размер?Мы можем сделать и то,и другое с более сложной версией
drawImage()
.Обновите строкуctx.drawImage()
следующим образом:ctx.drawImage(изображение,20,20,185,175,50,50,185,175);
- Первый параметр,как и раньше,-ссылка на изображение.
- Параметры 2 и 3 определяют координаты верхнего левого угла области,которую вы хотите вырезать из загруженного изображения,относительно верхнего левого угла самого изображения.Ничего слева от первого параметра или выше второго не отображается.
- Параметры 4 и 5 определяют ширину и высоту области,которую мы хотим вырезать из исходного загруженного изображения.
- Параметры 6 и 7 определяют координаты,в которых вы хотите нарисовать верхний левый угол вырезанной части изображения относительно верхнего левого угла холста.
- Параметры 8 и 9 определяют ширину и высоту для рисования вырезанной области изображения.В этом случае мы указали те же размеры,что и исходный фрагмент,но вы можете изменить его размер,указав другие значения.
Последний пример должен выглядеть так:
До сих пор мы рассмотрели некоторые очень простые способы использования 2D-холста,но на самом деле вы не ощутите всю мощь холста,если не обновите или не оживите его каким-либо образом.В конце концов,холст предоставляет изображения с возможностью создания сценариев!Если вы не собираетесь ничего менять,то можете просто использовать статические изображения и сэкономить себе всю работу.
Создание цикла
Играть с циклами на холсте довольно весело-вы можете запускать команды холста внутри цикладля
(или другого типа)точно так же,как любой другой код JavaScript.
Построим простой пример.
Сделайте еще одну новую копию нашего шаблона холста(1_canvas_template.html)и откройте ее в редакторе кода.
Добавьте следующую строку в конец вашего JavaScript.Он содержит новый метод
translate()
,который перемещает исходную точку холста:ctx.translate(ширина/2,высота/2);
При этом начало координат(0,0)перемещается в центр холста,а не в верхний левый угол.Это очень полезно во многих ситуациях,например,в этой,когда мы хотим,чтобы наш дизайн рисовался относительно центра холста.
Теперь добавьте следующий код в конец JavaScript:
function degToRad(градусы){вернуть градусы*Math.PI/180;};function rand(min,max){вернуть Math.floor(Math.random()*(max-min+1))+(min);} пусть длина=250;пусть moveOffset=20;for(var i=0;i
Здесь мы реализуем ту же функцию
degToRad()
,которую мы видели в примере с треугольником выше,функциюrand()
,которая возвращает случайное число между заданными нижней и верхней границами,длины
ипеременных moveOffset
(которые мы узнаем об этом позже),и пустой циклдля
.Идея здесь в том,что мы нарисуем что-нибудь на холсте внутри цикла
для
и будем повторять его каждый раз,чтобы создать что-то интересное.Добавьте следующий код в циклдля
:ctx.fillStyle='rgba ('+(длина 255)+', 0,'+(длина 255)+', 0,9)';ctx.beginPath();ctx.moveTo(moveOffset,moveOffset);ctx.lineTo(moveOffset+length,moveOffset);пусть triHeight=length/2*Math.tan(degToRad(60));ctx.lineTo(moveOffset+(длина/2),moveOffset+triHeight);ctx.lineTo(moveOffset,moveOffset);ctx.fill();длина-;moveOffset+=0,7;ctx.rotate(degToRad(5));
Итак,на каждой итерации мы:
- Задайте для
fillStyle
оттенок слегка прозрачного пурпурного,который меняется каждый раз в зависимости от значенияlength
.Как вы увидите позже,длина становится меньше при каждом запуске цикла,поэтому в результате цвет становится ярче с каждым последующим нарисованным треугольником. - Начать путь.
- Переместите перо на координату
(moveOffset,moveOffset)
;Эта переменная определяет,как далеко мы хотим двигаться каждый раз,когда рисуем новый треугольник. - Нарисуйте линию с координатой
(moveOffset+length,moveOffset)
.Это рисует линию длинойи длиной
,параллельную оси X. - Вычислите высоту треугольника,как раньше.
- Проведите линию до направленного вниз угла треугольника,затем проведите линию до начала треугольника.
- Позвоните по номеру
fill()
,чтобы заполнить треугольник. - Обновите переменные,описывающие последовательность треугольников,чтобы мы могли быть готовы нарисовать следующий.Мы уменьшаем значение
length
на 1,поэтому треугольники с каждым разом становятся меньше;увеличьтеmoveOffset
на небольшую величину,чтобы каждый последующий треугольник находился немного дальше,и используйте другую новую функцию,rotate()
,которая позволяет нам вращать весь холст!Поворачиваем его на 5 градусов перед тем,как нарисовать следующий треугольник.
- Задайте для
Вот и все!Последний пример должен выглядеть так:
На этом этапе мы хотели бы предложить вам поиграть с примером и сделать его своим!Например:
- Рисуйте прямоугольники или дуги вместо треугольников или даже вставляйте изображения.
- Поиграйте со значениямидлины
и moveOffset
.
- Введите несколько случайных чисел,используя функцию
rand()
,которую мы включили выше,но не использовали.
Анимации
Пример цикла,который мы построили выше,был забавным,но на самом деле вам нужен постоянный цикл,который продолжает работать и продолжается для любых серьезных приложений холста(таких как игры и визуализации в реальном времени).Если вы думаете о своем холсте как о фильме,вы действительно хотите,чтобы отображение обновлялось на каждом кадре,чтобы отображать обновленный вид,с идеальной частотой обновления 60 кадров в секунду,чтобы движение казалось красивым и плавным для человеческого глаза.
Есть несколько функций JavaScript,которые позволят вам запускать функции несколько раз в секунду,лучшая из которых для наших целей-это окно.requestAnimationFrame()
.Требуется один параметр-имя функции,которую вы хотите запускать для каждого кадра.В следующий раз,когда браузер будет готов обновить экран,будет вызвана ваша функция.Если эта функция рисует новое обновление вашей анимации,а затем снова вызываетrequestAnimationFrame()
непосредственно перед завершением функции,цикл анимации продолжит выполняться.Цикл заканчивается,когда вы прекращаете вызыватьrequestAnimationFrame()
или вызываетеwindow.cancelAnimationFrame()
после вызоваrequestAnimationFrame()
,но до вызова кадра.
Примечание:Хорошая практика-вызыватьcancelAnimationFrame()
из основного кода,когда вы закончите использовать анимацию,чтобы гарантировать,что никакие обновления еще не ожидают запуска.
Браузер обрабатывает сложные детали,например,заставляет анимацию работать с постоянной скоростью и не тратит ресурсы на анимацию невидимых вещей.
Чтобы увидеть,как это работает,давайте еще раз посмотрим на наш пример Bouncing Balls(посмотрите его вживую,а также посмотрите исходный код).Код цикла,в котором все движется,выглядит так:
function loop(){ctx.fillStyle='rgba (0, 0, 0, 0,25)';ctx.fillRect(0,0,ширина,высота);for(let i=0;i
Мы запускаем функциюloop()
один раз в конце кода,чтобы запустить цикл,отрисовывая первый кадр анимации;затем функцияloop()
берет на себя ответственность за вызовrequestAnimationFrame(loop)
для запуска следующего кадра анимации снова и снова.
Обратите внимание,что на каждом кадре мы полностью очищаем холст и все перерисовываем.Для каждого имеющегося шара мы рисуем его,обновляем его положение и проверяем,не сталкивается ли он с другими шарами.После того,как вы нарисовали графику на холсте,вы не сможете управлять этим графиком индивидуально,как с элементами DOM.Вы не можете перемещать каждый шар на холсте,потому что после того,как он нарисован,он является частью холста,а не отдельным доступным элементом или объектом.Вместо этого вам нужно стирать и перерисовывать,либо стирая весь кадр и перерисовывая все,либо имея код,который точно знает,какие части нужно стереть,и стирает и перерисовывает только минимальную необходимую площадь холста.
Оптимизация анимации графики-это целая специальность программирования с множеством умных приемов.Однако это выходит за рамки того,что нам нужно для нашего примера!
Как правило,процесс создания анимации холста включает следующие шаги:
- Очистите содержимое холста(например,с помощью
fillRect()
илиclearRect()
). - Сохранить состояние(при необходимости)с помощью
save()
-это необходимо,когда вы хотите сохранить обновленные настройки на холсте перед продолжением,что полезно для более сложных приложений. - Нарисуйте графику,которую вы анимируете.
- Восстановите настройки,сохраненные на шаге 2,используя
restore()
- Вызовите
requestAnimationFrame()
,чтобы запланировать рисование следующего кадра анимации.
Примечание:Мы не будем рассматривать здесьsave()
иrestore()
,но они хорошо объяснены в нашем руководстве по преобразованиям(и в последующих).
Простая анимация персонажа
Теперь давайте создадим нашу собственную простую анимацию-мы заставим персонажа из одной довольно классной компьютерной игры в стиле ретро ходить по экрану.
Сделайте еще одну новую копию нашего шаблона холста(1_canvas_template.html)и откройте ее в редакторе кода.Сделайте копию walk-right.png в том же каталоге.
В нижней части JavaScript добавьте следующую строку,чтобы снова установить начало координат в середине холста:
ctx.translate(ширина/2,высота/2);
Теперь давайте создадим новый объект
HTMLImageElement
,установим егоsrc
на изображение,которое мы хотим загрузить,и добавим обработчик событияonload
,который вызовет срабатывание функцииdraw()
при загрузке изображения:пусть изображение=новое изображение();образ.src='walk-right.png';image.onload=рисовать;
Теперь мы добавим некоторые переменные,чтобы отслеживать положение,в котором спрайт должен быть нарисован на экране,и номер спрайта,который мы хотим отобразить.
пусть спрайт=0;пусть posX=0;
Давайте объясним изображение таблицы спрайтов(которое мы почтительно позаимствовали из книги Майка Томаса «Создать цикл обхода таблицы спрайтов с использованием CSS-анимации»).Изображение выглядит так:
Он содержит шесть спрайтов,составляющих всю последовательность ходьбы-каждый имеет ширину 102 пикселя и высоту 148 пикселей.Чтобы правильно отобразить каждый спрайт,нам нужно будет использовать
drawImage()
,чтобы вырезать одно изображение спрайта из таблицы спрайтов и отображать только его часть,как мы делали выше с логотипом Firefox.Координата X среза должна быть кратной 102,а координата Y всегда будет равна 0.Размер среза всегда будет 102 на 148 пикселей.Теперь давайте вставим в конец кода пустую функцию
draw()
,готовую к заполнению некоторым кодом:function draw(){};
,остальной код в этом разделе находится внутри
draw()
.Сначала добавьте следующую строку,которая очищает холст для подготовки к рисованию каждого кадра.Обратите внимание,что мы должны указать верхний левый угол прямоугольника как-(ширина/2),-(высота/2)
,потому что ранее мы указали исходную позицию какширина/2,высота/2
.ctx.fillRect(-(ширина/2),-(высота/2),ширина,высота);
Затем мы нарисуем наше изображение с помощью drawImage-9-параметрической версии.Добавьте следующее:
CTX.drawImage(изображение,(спрайт*102),0,102,148,0+posX,-74,102,148);
Как видите:
- Мы указываем
image
как изображение для встраивания. - Параметры 2 и 3 определяют верхний левый угол фрагмента,который нужно вырезать из исходного изображения,при этом значение X равно
спрайту
,умноженному на 102(гдеспрайт
-это номер спрайта от 0 до 5)и Y значение всегда 0. - Параметры 4 и 5 определяют размер вырезанного фрагмента-102 на 148 пикселей.
- Параметры 6 и 7 определяют верхний левый угол поля,в котором нужно рисовать срез на холсте-позиция X составляет 0+
posX
,что означает,что мы можем изменить положение рисования,изменив значениеposX
. - Параметры 8 и 9 определяют размер изображения на холсте.Мы просто хотим сохранить его исходный размер,поэтому указываем 102 и 148 как ширину и высоту.
- Мы указываем
Теперь мы изменим значениеспрайтапосле каждого рисования-ну,по крайней мере,после некоторых из них.Добавьте следующий блок в конец функции
draw()
:if(posX%13===0){if(sprite===5){спрайт=0;}else{спрайт++;}}
Мы оборачиваем весь блок в
if(posX%13===0){...}
.Мы используем оператор по модулю(%
)(также известный как оператор остатка),чтобы проверить,можно ли точно разделить значениеposX
на 13 без остатка.Если это так,мы переходим к следующему спрайту,увеличиваяспрайта
(сбрасывается до 0 после того,как мы закончили со спрайтом № 5).Фактически это означает,что мы обновляем спрайт только в каждом 13-м кадре,или примерно 5 кадров в секунду(requestAnimationFrame()
вызывает нас со скоростью до 60 кадров в секунду,если это возможно).Мы намеренно снижаем частоту кадров,потому что у нас есть только шесть спрайтов для работы,и если мы отображаем один каждые 60 секунд,наш персонаж будет двигаться слишком быстро!Внутри внешнего блока мы используем оператор
if...else
,чтобы проверить,соответствует ли значениеспрайта5(последний спрайт,учитывая,что номера спрайтов идут от 0 до 5).Если мы уже показываем последний спрайт,мы сбрасываем
спрайт
обратно на 0;если нет,мы просто увеличиваем его на 1.Затем нам нужно решить,как изменить значение
posX
в каждом кадре-добавьте следующий блок кода чуть ниже вашего последнего.if(posX>width/2){newStartPos=-((ширина/2)+102);posX=Math.ceil(newStartPos);console.log(posX);}else{posX+=2;}
Мы используем еще
if...else
,чтобы увидеть,стало ли значениеposX
больше,чемwidth/2
,что означает,что наш персонаж ушел за правый край экрана.Если это так,мы вычисляем позицию,при которой персонаж помещается слева от левой стороны экрана.Если наш персонаж еще не отошел от края экрана,мы увеличиваем
posX
на 2.Это заставит его сдвинуться немного вправо в следующий раз,когда мы его нарисуем.Наконец,нам нужно создать цикл анимации,вызвав
requestAnimationFrame()
внизу функцииdraw()
:окно.requestAnimationFrame(рисовать);
Вот и все!Последний пример должен выглядеть так:
Простое приложение для рисования
В качестве последнего примера анимации мы хотели бы показать вам очень простое приложение для рисования,чтобы проиллюстрировать,как цикл анимации может быть объединен с пользовательским вводом(например,движением мыши в данном случае).Мы не заставим вас пройти и построить эту;мы просто исследуем самые интересные части кода.
Пример можно найти на GitHub как 8_canvas_drawing_app.html,и вы можете поиграть с ним вживую ниже:
Давайте рассмотрим самые интересные детали.Прежде всего,мы отслеживаем координаты X и Y мыши,а также то,нажимается ли она или нет,с помощью трех переменных:curX
,curY
инажата
.Когда мышь перемещается,мы запускаем функцию,установленную как обработчик событийonmousemove
,которая фиксирует текущие значения X и Y.Мы также используем обработчики событийonmousedown
иonmouseup
,чтобы изменить значениеloaded
наtrue
при нажатии кнопки мыши и снова наfalse
при отпускании.
let curX;let curY;пусть нажата=ложь;document.onmousemove=function(e){curX=(window.Event)?e.pageX:e.clientX+(document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft);curY=(window.Event)?e.pageY:e.clientY+(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop);}
canvas.onmousedown=function(){нажата=правда;};canvas.onmouseup=function(){нажата=ложь;}
Когда нажата кнопка «Очистить холст»,мы запускаем простую функцию,которая очищает весь холст обратно до черного,как мы видели раньше:
clearBtn.onclick=function(){ctx.fillStyle='rgb (0, 0, 0)';ctx.fillRect(0,0,ширина,высота);}
Цикл рисования на этот раз довольно прост-если нажатоtrue
,мы рисуем круг со стилем заливки,равным значению в палитре цветов,и радиусом,равным значению,заданному во входном диапазоне.Мы должны нарисовать круг на 85 пикселей выше того места,откуда мы его измерили,потому что вертикальное измерение берется из верхней части области просмотра,но мы рисуем круг относительно верхней части холста,который начинается ниже 85 пикселей в высоту.панель инструментов.Если бы мы нарисовали его сcurY
в качестве координаты y,он оказался бы на 85 пикселей ниже,чем позиция мыши.
function draw(){if(нажато){ctx.fillStyle=colorPicker.value;ctx.beginPath();ctx.arc(curX,curY-85,sizePicker.value,degToRad(0),degToRad(360),false);ctx.fill();}
requestAnimationFrame(рисовать);}
рисовать();
Примечание:range
иcolor Типы
довольно хорошо поддерживаются в браузерах,за исключением версий Internet Explorer менее 10;также Safari еще не поддерживает,цвет
.Если ваш браузер не поддерживает эти поля ввода,они вернутся к простым текстовым полям,и вам просто нужно будет самостоятельно ввести допустимые значения цвета/числа.
Пришло время оставить 2D позади и взглянуть на 3D-холст.Содержимое 3D-холста указывается с помощью API WebGL,который является полностью отдельным API от API 2D-холста,даже если они оба отображаются в элементах.
WebGL основан на OpenGL(открытая графическая библиотека)и позволяет напрямую взаимодействовать с графическим процессором компьютера.Таким образом,написание необработанного WebGL ближе к языкам низкого уровня,таким как C++,чем к обычному JavaScript;это довольно сложно,но невероятно мощно.
Использование библиотеки
Из-за ее сложности большинство людей пишут код трехмерной графики с использованием сторонней библиотеки JavaScript,такой как Three.js,PlayCanvas или Babylon.js.Большинство из них работают аналогичным образом,обеспечивая функциональные возможности для создания примитивных и нестандартных форм,расположения камер наблюдения и освещения,покрытия поверхностей текстурами и многого другого.Они обрабатывают WebGL за вас,позволяя вам работать на более высоком уровне.
Да,использование одного из них означает изучение другого нового API(в данном случае стороннего),но они намного проще,чем кодирование необработанного WebGL.
Воссоздание нашего куба
Давайте посмотрим на простой пример того,как создать что-то с помощью библиотеки WebGL.Мы выберем Three.js,так как он один из самых популярных.В этом уроке мы создадим трехмерный вращающийся куб,который мы видели ранее.
Для начала создайте локальную копию index.html в новой папке,затем сохраните копию metal003.png в той же папке.Это изображение мы будем использовать в качестве текстуры поверхности для куба позже.
Затем создайте новый файл с именем
main.js
,снова в той же папке,что и раньше.Если вы откроете
index.html
в редакторе кода,вы увидите,что он содержит два элемента-первый прикрепляет
three.min.js
к странице,а второй прикрепляет нашосновной.js
на страницу.Вам необходимо скачать библиотеку three.min.js и сохранить ее в том же каталоге,что и раньше.Теперь у нас есть
three.js
,прикрепленных к нашей странице,мы можем начать писать JavaScript,который использует его вmain.js
.Начнем с создания новой сцены-добавьте в файл main.js следующее:const scene=new THREE.Scene();
Конструктор
Scene()
создает новую сцену,которая представляет весь трехмерный мир,который мы пытаемся отобразить.Далее нам понадобится камера,чтобы мы могли видеть сцену.С точки зрения трехмерного изображения камера представляет положение зрителя в мире.Чтобы создать камеру,добавьте следующие строки:
const camera=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0,1,1000);camera.position.z=5;
Конструктор
PerspectiveCamera()
принимает четыре аргумента:- Поле зрения:насколько широкая область перед камерой,которая должна быть видна на экране,в градусах.
- Соотношение сторон:Обычно это отношение ширины сцены к ее высоте.Использование другого значения исказит сцену(что может быть тем,что вы хотите,но обычно нет).
- Ближайшая плоскость:насколько близко могут быть объекты камеры до того,как мы перестанем их отображать на экране.Подумайте о том,как,когда вы перемещаете кончик пальца все ближе и ближе к пространству между глазами,в конечном итоге вы больше не видите его.
- Дальняя плоскость:насколько далеко объекты находятся от камеры до того,как они перестанут отображаться.
Мы также установили положение камеры на 5 единиц расстояния от оси Z,которая,как и в CSS,находится за пределами экрана по направлению к вам,зрителю.
Третий жизненно важный компонент-это средство визуализации.Это объект,который отображает данную сцену с точки зрения данной камеры.Сейчас мы создадим его с помощью конструктора
WebGLRenderer()
,но мы не будем использовать его позже.Добавьте следующие строки:const renderer=новый ТРИ.WebGLRenderer();renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);
Первая строка создает новое средство визуализации,вторая строка устанавливает размер,при котором средство визуализации будет рисовать вид камеры,а третья строка добавляет элемент
,созданный средством визуализации,к
документа.Теперь все,что рисует рендерер,будет отображаться в нашем окне.
Затем мы хотим создать куб,который мы будем отображать на холсте.Добавьте следующий фрагмент кода в конец вашего JavaScript:
пусть кубик;let loader=new THREE.TextureLoader();loader.load('metal003.png',function(texture){texture.wrapS=THREE.RepeatWrapping;texture.wrapT=THREE.RepeatWrapping;texture.repeat.set(2,2);let geometry=new THREE.BoxGeometry(2.4,2.4,2.4);let material=new THREE.MeshLambertMaterial({карта:текстура,затенение:THREE.FlatShading});cube=new THREE.Mesh(геометрия,материал);сцена.добавить(куб);рисовать();});
Здесь есть еще кое-что,поэтому давайте рассмотрим это поэтапно:
- Сначала мы создаем глобальную переменную
cube
,чтобы мы могли получить доступ к нашему кубу из любой точки кода. - Затем мы создаем новый объект
TextureLoader
,затем вызываем для негоload()
.load()
в этом случае принимает два параметра(хотя может потребоваться и больше):текстура,которую мы хотим загрузить(наш PNG),и функция,которая будет запускаться после загрузки текстуры. - Внутри этой функции мы используем свойства объекта
texture
,чтобы указать,что мы хотим,чтобы изображение повторялось 2 x 2,обернутое вокруг всех сторон куба.Затем мы создаем новый объектBoxGeometry
и новый объектMeshLambertMaterial
и объединяем их вMesh
,чтобы создать наш куб.Для объекта обычно требуется геометрия(какой это формы)и материал(как выглядит его поверхность). - Наконец,мы добавляем наш куб в сцену,затем вызываем нашу функцию
draw()
,чтобы запустить анимацию.
- Сначала мы создаем глобальную переменную
Прежде,чем мы перейдем к определению
draw()
,мы добавим в сцену пару источников света,чтобы немного оживить ситуацию;добавьте следующие блоки:let light=new THREE.AmbientLight('rgb (255, 255, 255)');scene.add(свет);пусть spotLight=new THREE.SpotLight('rgb (255, 255, 255)');spotLight.position.set(100,1000,1000);spotLight.castShadow=true;scene.add(spotLight);
Объект
AmbientLight
-это своего рода мягкий свет,который немного освещает всю сцену,как солнце,когда вы находитесь на улице.С другой стороны,объектSpotLight
представляет собой направленный луч света,больше похожий на фонарик/фонарик(или,по сути,прожектор).Наконец,давайте добавим нашу функцию
draw()
в конец кода:function draw(){cube.rotation.x+=0,01;cube.rotation.y+=0,01;renderer.render(сцена,камера);requestAnimationFrame(рисовать);}
Это довольно интуитивно понятно;на каждом кадре мы слегка поворачиваем наш куб по осям X и Y,затем визуализируем сцену так,как ее видит наша камера,а затем,наконец,вызываем
requestAnimationFrame()
,чтобы запланировать рисование нашего следующего кадра.
Давайте еще раз посмотрим,как должен выглядеть готовый продукт:
Готовый код можно найти на GitHub.
Примечание:В нашем репозитории на GitHub вы также можете найти еще один интересный пример 3D-куба-Three.js Video Cube(также смотрите его вживую).Это используетgetUserMedia()
,чтобы взять видеопоток с веб-камеры компьютера и спроецировать его на сторону куба в виде текстуры!
На этом этапе у вас должно быть полезное представление об основах программирования графики с использованием Canvas и WebGL и о том,что вы можете делать с этими API,а также хорошее представление о том,куда обращаться за дополнительной информацией.Радоваться,веселиться!
Здесь мы рассмотрели только настоящие основы холста-есть еще много чего,чему можно научиться!В следующих статьях вы узнаете больше.
- Canvas tutorial-серия очень подробных руководств,в которых гораздо более подробно объясняется,что вы должны знать о 2D-холсте,чем было описано здесь.Основное чтение.
- Учебник по WebGL-серия,в которой преподаются основы программирования на чистом WebGL.
- Создание базовой демонстрации с помощью Three.js-базовое руководство по Three.js.У нас также есть аналогичные руководства для PlayCanvas или Babylon.js.
- Разработка игр-целевая страница для разработки веб-игр на MDN.Здесь есть несколько действительно полезных руководств и приемов,связанных с 2D и 3D холстами-см.Пункты меню «Приемы» и «Учебники».
- Жестокий термин-использует API веб-аудио для генерации звука и холст для создания красивой визуализации,сопровождающей его.
- Voice change-o-matic-использует холст для визуализации аудиоданных в реальном времени из Web Audio API.
Квадрат,прямоугольник,ромб,трапеция,параллелограмм
Четырехугольник означает «четыре стороны»
(четырехугольник,означает четыре,боковой,означает сторону).
Четырехугольник имеетчетырех сторон,двумерный(плоская форма),замкнутый(линии соединяются)и имеетпрямыхсторон.
Попробуйте сами
(См.Также в интерактивных четырехугольниках)
Недвижимость
В четырехугольнике:
- четыре стороны(края)
- четыре вершины(углы)
- внутренних углов,которые добавляют к360 градусов:
Попробуйте нарисовать четырехугольник и измерить углы.Они должны добавить к360 °
Типы четырехугольников
Есть особые виды четырехугольника:
Некоторые типы также включены в определение других типов!Например,квадрат,ромбипрямоугольниктакже являютсяпараллелограммами.Подробности смотрите ниже.
Рассмотрим каждый вид по очереди:
Прямоугольник
маленькие квадратики в каждом углу означают «прямой угол»
Прямоугольник-это четырехсторонняя форма,каждый угол которой является прямым(90 °).
Такжепротивоположных сторонпараллельны и равной длины.
Площадь
маленькие квадратики в каждом углу означают «прямой угол»
У квадрата равные стороны(отмечены буквой"s"),и каждый угол представляет собой прямой угол(90 °)
Также противоположные стороны параллельны.
Квадрат также соответствует определению прямоугольника(все углы равны 90 °)и ромба(все стороны равной длины).
Ромб
Ромб-это четырехгранная форма,все стороны которой имеют одинаковую длину(обозначены буквой «s»).
Также противоположные стороны параллельныиравны противоположные углы.
Еще один интересный момент-диагонали(пунктирные линии)пересекаются посередине под прямым углом.Другими словами,они «разрезают» друг друга пополам под прямым углом.
Ромб иногда называют ромбомили ромбом.
Параллелограмм
У параллелограмма противоположные стороны параллельны и равны по длине.Также противоположные углы равны(углы «А» такие же,а углы «В» подобные).
ПРИМЕЧАНИЕ.Квадраты,прямоугольники и ромбы-это все Параллелограммы!
Пример:
Параллелограммс:
- все стороны равны и
- углов"А" и"B"в виде прямых углов
-этоквадрат!
Трапеция(UK:Trapezium)
Трапеция | Равнобедренная трапеция |
Трапеция(в Великобритании называется трапецией)имеет пару параллельных противоположных сторон.
И трапеция(в Великобритании она называется трапецией)-четырехугольник без параллельных сторон:
Трапеция | Трапеция | |
В США: | пара параллельных сторон | НЕТ параллельных сторон |
В Великобритании: | НЕТ параллельных сторон | пара параллельных сторон |
(определения для США и Великобритании поменяны местами!) |
ТрапецияРавнобедренная,как показано выше,имеет левую и правую стороны равной длины,которые соединяются с основанием под равными углами.
Воздушный змей
Эй,похоже на воздушного змея(обычно).
Имеетдве парысторон:
Каждая пара состоит из двух соединяющихся сторон равной длины.
Также:
- углы,где встречаются две пары равны.
- :диагонали,показанные выше пунктирными линиями,пересекаются в под прямым углом.
- одна из диагоналейделитпополам(делит пополам)другую.
...вот и все специальные четырехугольники.
Неправильные четырехугольники
Единственный правильный четырехугольник(все стороны равны и все углы равны)-это квадрат.Итак,все остальные четырехугольникинеправильные.
Схема «Семейное древо»
Четырехугольник:,включая.
Пример:квадрат также является прямоугольником.
Итак,мывключаемквадрат в определение прямоугольника.
(Мыне говорим:«Наличие всех углов 90 ° делает его прямоугольником,за исключением случая,когда все стороны равны,тогда это квадрат».)
Это может показаться странным,поскольку в повседневной жизни мы думаем о квадрате как о,а не окак о прямоугольнике...но в математике эторавно.
Используя приведенную ниже таблицу,мы можем ответить на такие вопросы,как:
- Квадрат-это тип прямоугольника?(Да)
- Прямоугольник-это разновидность воздушного змея?(Нет)
Сложные четырехугольники
О да!когда две стороны пересекаются,мы называем это"сложным"или"самопересекающимся"четырехугольником,например:
У них все еще есть 4 стороны,но две стороны пересекаются.
Многоугольник
Четырехугольник-это многоугольник.Фактически,это четырехсторонний многоугольник,точно так же,как треугольник-это трехсторонний многоугольник,пятиугольник-пятисторонний многоугольник и так далее.
Играй с ними
Теперь,когда вы знаете различные типы,вы можете играть с интерактивными четырехугольниками.
Другие названия
Четырехугольник иногда можно назвать:
- aQuadrangle(" четыре угла "),поэтому звучит как"треугольник"
- aTetragon(«четыре многоугольника»),поэтому звучит как «пятиугольник»,«шестиугольник» и т.Д.
Лучшая цена для розыгрыша квадрата-Отличные предложения на розыгрыш от глобальных продавцов розыгрыша
Отличные новости!!!Вы попали в нужное место для рисования квадрата.К настоящему времени вы уже знаете,что что бы вы ни искали,вы обязательно найдете это на AliExpress.У нас буквально тысячи отличных продуктов во всех товарных категориях.Ищете ли вы товары высокого класса или дешевые и недорогие оптовые закупки,мы гарантируем,что он есть на AliExpress.
Вы найдете официальные магазины торговых марок наряду с небольшими независимыми продавцами со скидками,каждый из которых предлагает быструю доставку и надежные,а также удобные и безопасные способы оплаты,независимо от того,сколько вы решите потратить.
AliExpress никогда не уступит по выбору,качеству и цене.Каждый день вы будете находить новые онлайн-предложения,скидки в магазинах и возможность сэкономить еще больше,собирая купоны.Но вам,возможно,придется действовать быстро,так как этот квадрат с верхней сеткой в кратчайшие сроки станет одним из самых востребованных бестселлеров.Подумайте,как вам будут завидовать друзья,когда вы скажете им,что получили свой квадрат на AliExpress.Благодаря самым низким ценам в Интернете,дешевым тарифам на доставку и возможности получения на месте вы можете еще больше сэкономить.
Если вы все еще не уверены в том,чтобы рисовать квадрат,и думаете о выборе аналогичного товара,AliExpress-отличное место для сравнения цен и продавцов.Мы поможем вам разобраться,стоит ли доплачивать за высококачественную версию или вы получаете столь же выгодную сделку,приобретая более дешевую вещь.А если вы просто хотите побаловать себя и потратиться на самую дорогую версию,AliExpress всегда позаботится о том,чтобы вы могли получить лучшую цену за свои деньги,даже сообщая вам,когда вам будет лучше дождаться начала рекламной акции.и ожидаемая экономия.AliExpress гордится тем,что у вас всегда есть осознанный выбор при покупке в одном из сотен магазинов и продавцов на нашей платформе.Реальные покупатели оценивают качество обслуживания,цену и качество каждого магазина и продавца.Кроме того,вы можете узнать рейтинги магазина или отдельных продавцов,а также сравнить цены,доставку и скидки на один и тот же продукт,прочитав комментарии и отзывы,оставленные пользователями.Каждая покупка имеет звездный рейтинг,и предыдущие клиенты часто оставляют комментарии,описывающие свой опыт транзакций,поэтому вы можете покупать с уверенностью каждый раз.Короче говоря,вам не нужно верить нам на слово-просто слушайте миллионы наших довольных клиентов.
А если вы новичок на AliExpress,мы откроем вам секрет.Непосредственно перед тем,как вы нажмете «купить сейчас» в процессе транзакции,найдите время,чтобы проверить купоны-и вы сэкономите еще больше.Вы можете найти купоны магазина,купоны AliExpress или собирать купоны каждый день,играя в игры в приложении AliExpress.Вместе с бесплатной доставкой,которую предлагают большинство продавцов на нашем сайте,вы сможете приобрести draw square по самой выгодной цене.
У нас всегда есть новейшие технологии,новейшие тенденции и самые обсуждаемые лейблы.На AliExpress отличное качество,цена и сервис всегда в стандартной комплектации.Начните самый лучший шоппинг прямо здесь.
Руководств по программированию на Python
Рисование объектов с PyGame
Для простых вещей мы можем обнаружить,что просто хотим использовать встроенные функции PyGame для рисования различных форм на поверхности.Рисование в PyGame встроено,так что это достаточно просто.Мы можем рисовать круги,квадраты,прямоугольники или произвольные многоугольники по нашему выбору с координатами.
Вот наш новый код:
импортировать pygame время импорта случайный импорт pygame.init() display_width=800 display_height=600 черный=(0,0,0) белый=(255,255,255) красный=(255,0,0) car_width=73 gameDisplay=pygame.display.set_mode((display_width,display_height)) pygame.display.set_caption('Немного гоночный') часы=pygame.time.Часы() carImg=pygame.image.load('racecar.png') #######def вещи(thingx,thingy,thingw,thingh,color):pygame.draw.rect(gameDisplay,цвет,[вещь,вещь,вещь,вещь]) #######def car(x,y):gameDisplay.blit(carImg,(x,y)) def text_objects(текст,шрифт):textSurface=font.render(текст,True,черный) вернуть textSurface,textSurface.get_rect() def message_display(текст):largeText=pygame.font.Font('freesansbold.ttf',115) TextSurf,TextRect=текстовые_объекты(текст,большой текст) TextRect.центр=((display_width/2),(display_height/2)) gameDisplay.blit(TextSurf,TextRect) pygame.display.update() время сна(2) game_loop() def сбой():message_display('Вы разбились') def game_loop():x=(ширина_ дисплея*0,45) y=(display_height*0,8) x_change=0 ######вещь_стартx=random.randrange(0,display_width) вещь_starty=-600 вещь_speed=7 вещь_ширина=100 thing_height=100 ######gameExit=Ложь пока нет игрыВыход:для события в pygame.event.get():если event.type==pygame.QUIT:pygame.quit() уволиться() если event.type==pygame.KEYDOWN:если event.key==pygame.K_LEFT:x_change=-5 если event.key==pygame.K_RIGHT:x_change=5 если event.type==pygame.KEYUP:если event.key==pygame.K_LEFT или event.key==pygame.K_RIGHT:x_change=0 x+=x_change gameDisplay.заливка(белый) ###########штуки(штука,штука,штука,штука,цвет) вещи(thing_startx,thing_starty,thing_width,thing_height,черный) thing_starty+=thing_speed автомобиль(x,y) ##########если x>display_width-car_width или x display_height:thing_starty=0-thing_height вещь_стартx=random.randrange(0,display_width) pygame.display.update() часы.tick(60) game_loop() pygame.уволиться() уволиться()
Итак,первое,что мы видим,это:
def вещи(thingx,thingy,thingw,thingh,color):pygame.draw.rect(gameDisplay,цвет,[вещь,вещь,вещь,вещь])
Эта функция принимает начальные точки x,y,переменные ширины и высоты и,наконец,цвет.
Далее мы используем pygame.draw.rect(),чтобы нарисовать многоугольник в соответствии с нашими требованиями.Параметры этой функции:где,какой цвет,а затем координаты x,y,за которыми следуют ширина и высота.
Затем в нашем game_loop мы видим:
вещь_стартx=random.randrange(0,display_width) вещь_starty=-600 вещь_speed=7 вещь_ширина=100 thing_height=100
Мы хотим,чтобы начальная позиция объекта была случайной в его диапазоне x,от 0 до ширины нашего дисплея.Помните,что X слева направо,поэтому в основном это позволяет нам запускать блок в произвольной позиции между краями экрана.
Затем мы определяем начальную позицию y с помощью thing_starty.Мы указываем это как-600.Мы делаем это,чтобы у игрока было время расположиться до того,как на экране появится блок,которого следует избегать.
Затем мы указываем скорость объекта.На сколько пикселей он будет перемещаться.Сейчас за кадр этот блок будет перемещаться на 7 пикселей.Мы можем увеличить или уменьшить это число,чтобы напрямую повлиять на сложность.
Наконец,мы определяем ширину и высоту блоков.
Все эти переменные являются «начальными» переменными.По ходу игры мы будем соответственно изменять эти значения.Итак,в основной логике нашего скрипта мы видим добавление:
вещи(thing_startx,thing_starty,thing_width,thing_height,черный) thing_starty+=thing_speed
Здесь происходит то,что мы повторно вызываем функцию для запуска с начальными переменными,и мы также добавляем «thing_speed»(то есть 7 пикселей,которые он перемещает каждый раз)к позиции y,thing_starty,блока.Итак,при 60 FPS мы перемещаем блок вниз на 7 пикселей каждый кадр.
Если бы мы просто остановились здесь,мы бы обнаружили,что генерируется только 1 блок,и,как только он пройдет нас,он будет продолжать работать вечно.Нам нужна некоторая обработка,такая как обработка,которую мы использовали с нашей машиной,чтобы создать еще один блок,как только он уйдет за пределы экрана.
Вот где:
если thing_starty>display_height:thing_starty=0-thing_height вещь_стартx=random.randrange(0,display_width)
пригодится!Итак,мы просто спрашиваем,больше ли положение объекта по оси y(помните,в компьютерах,что x,y=0,0 означает верхний левый угол!)Display_height,поэтому он полностью переместился за пределы экрана.Если это так,то мы хотим создать еще один блок.Сначала мы повторно присваиваем блоку значение y,где мы используем 0-thing_height.Почему это?Мы делаем это так,чтобы блок снова появлялся «за пределами» экрана,чтобы создать иллюзию того,что мы только что наткнулись на него,а не на его создание.
Leave a Comment