Что такое спрайты


Спрайт это

  Современный веб одним из приоритетов ставит скорость и оптимизацию сайтов.

  Так одним из методов оптимизации является использование на сайте изображений называемых спрайтами.

  Что такое спрайт, когда, зачем и как их используют, я постараюсь вам объяснить в этой записи.

 


Спрайт — это одно изображение, которое объединяет в себе два и более изображений.

Пример спрайта:

спрайт соцсетей

  Основная идея использование спрайтов — это сократить количество запросов к серверу, тем самым уменьшив время загрузки страницы сайта. А уже при помощи CSS можно вывести любой фрагмент из спрайта в нужном нам месте. При этом размер у объединённого изображения (у спрайта) будет меньше, чем сумма размеров исходных картинок.

  Если мы рассмотрим спрайт который я привёл выше в качестве примера, то он состоит из 60-ти иконок. Всего одним запросом спрайт загружается в браузер вместо 60-ти (если загружать каждую иконку по отдельности), а при помощи CSS мы можем вывести любую из иконок входящую в спрайт в нужном нам месте, при чём можем выводит одну и ту же иконку много раз.


Использование спрайтов


  Думаю всем понятно, что веб-страница содержащая много изображений, будет загружаться долго, генерируя при этом много запросов к серверу. Использование спрайтов уменьшает количество запросов серверу, в результате снижая время загрузки страницы сайта и сокращая потребляемый пользователем трафик.

  Спрайты можно использовать в самых разных местах, но наиболее распространённые случаи когда через спрайт выводят иконки для пунктов меню, разные кнопки и соцсети. Так же спрайты можно использовать в анимациях, играх и ещё много где.

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


Как работают спрайты

  Спрайты работают напрямую через CSS.

  Чтобы вывести изображение из спрайта, нужно задать к элементу в HTML class и в CSS задать этому классу стили.

Обязательные для спрайтов стили CSS :

background: url() — задаём путь к изображению (спрайту)

background-position — координаты выводимого фрагмента из спрайта

width и height — задаём размер (ширину и высоту) выводимого фрагмента

 


Пример вывода иконок из спрайта

  Я возьму спрайт который был выше в примере и сделаю из него меню. Чтобы не липить шестьдесят пунктов меню, возьму пять пунктов, иконки которых будут из разных участков спрайта.

 

  Итак, создаём меню у которого HTML следующего вида:

 

<ul> <li>Гугл</li> <li>Вордпресс</li> <li>Инстаграмм</li> <li>Ютуб</li> <li>Фотогалерея</li> </ul>

 

Получится следующий результат:

  • Гугл
  • Вордпресс
  • Инстаграмм
  • Ютуб
  • Фотогалерея

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

<ul>  	<li class="demoSpIcon">Гугл</li>  	<li class="demoSpIcon">Вордпресс</li>  	<li class="demoSpIcon">Инстаграмм</li>  	<li class="demoSpIcon">Ютуб</li>  	<li class="demoSpIcon">Фотогалерея</li>  </ul>

 

 Для заданного класса demoSpIcon пропишем CSS стили, где:

  • сразу к имени класса добавим псевдокласс ::before
  • бекграундом зададим ссылку на спрайт который выложен выше как примером
  • размер я подобрал в консоле браузера, он равен 38px в длину и ширину

Прописываем стили:

.demoSpIcon::before {  	content: '';  	display: inline-block;  	width: 38px;  	height: 38px;  	background: url(https://inter-net.pro/images/css/sprajt-demo.jpg);  	vertical-align: middle;  }

 

  Получим результат:

  • Гугл
  • Вордпресс
  • Инстаграмм
  • Ютуб
  • Фотогалерея

  Как видно, возле пунктов появилась иконка, но у всех одна и не соответствует названию пунктов меню.

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

  Так как в спрайте все иконки из набора одинаковые по размеру, мы прописали через CSS для класса demoSpIcon те стили, которые будут повторятся для каждой иконки.


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

<ul>  	<li class="demoSpIcon sprajtGoogle">Гугл</li>  	<li class="demoSpIcon sprajtWordpress">Вордпресс</li>  	<li class="demoSpIcon sprajtInstagramm">Инстаграмм</li>  	<li class="demoSpIcon sprajtYoutube">Ютуб</li>  	<li class="demoSpIcon sprajtFotogallery">Фотогалерея</li>  </ul>  

 

и добавим стили с соответствующими координатами иконок:

.demoSpIcon::before {  	content: '';  	display: inline-block;  	width: 38px;  	height: 38px;  	background: url(https://inter-net.pro/images/css/sprajt-demo.jpg);  	vertical-align: middle;  }  .sprajtGoogle::before {background-position: 0px -112px;}  .sprajtWordpress::before {background-position: -41px -38px;}  .sprajtInstagramm::before {background-position: -328px -38px;}  .sprajtYoutube::before {background-position: -246px 0px}  .sprajtFotogallery::before {background-position: -451px -148px;}

Результат

  • Гугл
  • Вордпресс
  • Инстаграмм
  • Ютуб
  • Фотогалерея

 Как видим теперь возле пунктов отображаются нужные иконки из спрайта.

Дальше можем делать всё что захотим. Например, чтобы теперь сделать из нашего вертикального меню горизонтальное, мы к тегу ul добавим класс horizont и в CSS пропишем для него стили.

Получится следующий HTML макет:

<ul class="horizont">  	<li class="demoSpIcon sprajtGoogle">Гугл</li>  	<li class="demoSpIcon sprajtWordpress">Вордпресс</li>  	<li class="demoSpIcon sprajtInstagramm">Инстаграмм</li>  	<li class="demoSpIcon sprajtYoutube">Ютуб</li>  	<li class="demoSpIcon sprajtFotogallery">Фотогалерея</li>  </ul>  

 

А стили CSS теперь будут выглядеть так:

.horizont li {   display: inline-block;   border: solid 1px #888;   padding: 2px 10px 2px 2px;   border-radius: 4px;   cursor: pointer;  }  .horizont li:hover {   background: #3e5d75;   color: #fff;  }  .demoSpIcon::before {  	content: '';  	display: inline-block;  	width: 38px;  	height: 38px;  	background: url(https://inter-net.pro/images/css/sprajt-demo.jpg);  	vertical-align: middle;  }  .sprajtGoogle::before {background-position: 0px -112px;}  .sprajtWordpress::before {background-position: -41px -38px;}  .sprajtInstagramm::before {background-position: -328px -38px;}  .sprajtYoutube::before {background-position: -246px 0px;}  .sprajtFotogallery::before {background-position: -451px -148px;}

 

Результат:

  • Гугл
  • Вордпресс
  • Инстаграмм
  • Ютуб
  • Фотогалерея

Как видим — получилось горизонтальное меню.

Единственное что я упустил — это ссылки на пунктах меню. Я их не ставил чтобы они не мешали. Чтобы добавить ссылки, переделываем конструкцию на пунктах меню вот так:

<li><a class="demoSpIcon sprajtGoogle" href="https://google.com">Гугл</a></li>  

 


Координаты спрайта

  Координаты спрайта подбираются через консоль браузера. Для этого наводим курсор мышки на пункт меню где нужно определить координаты и жмём правую кнопку мышки.

  В меню выбираем Исследовать элемент (браузер мазила) или Просмотреть код (в гугл-хром).

 В консоле в поле HTML-кода выделяем псевдокласс ::before после чего в поле со стилями видим наш CSS класс отвечающий за вывод координат (background-position). Подбираем координаты — выделяем координату и стрелками вверх/вниз на клавиатуре ищем нашу иконку.

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

Опредиление координат в спрайте


Анимация из спрайта

Так же спрайты используют для анимации.

Например возьмём вот такую картинку-спрайт, которая состоит из шести фрагментов

спрайт для анимации идущего человечка

 

Теперь в HTML вставим div с айдишником marsch

<div id="marsch"></div>  

 

и пропишем следующие CSS стили:

#marsch {   width:112px;   height:156px;   margin:auto;    background:url(https://inter-net.pro/images/css/sprite-marsch.png) repeat-x;   animation:walk .8s steps(6) infinite;  }  @keyframes walk {   0% { background-position:0 }    100% { background-position:-672px }  }

 

  То в результате получим вот такого идущего человечка:

inter-net.pro

Как объединить изображения в спрайт

Существует два основных этапа создания CSS спрайтов. Сначала вы должны создать изображение и затем поместить его.

Объединение изображений

Предположим, у нас есть два изображения, которые мы хотим объединить в одно целое. Чтобы создать спрайт, мы должны знать размер изображений. Мы будем рассматривать пример, в котором оба изображения имеют одинаковый размер (50 на 50 пикселей):

Чтобы объединить их, нам нужно создать изображение размером 100 на 50 пикселей. Давайте назовем его «sprite.png«. Теперь, когда у нас есть объединенное изображение, мы можем использовать информацию о нем для правильного отображения на веб-странице.

Объединенное изображение имеет ширину 50 пикселей и высоту 100 пикселей. Таким образом, мы можем сказать, что первый рисунок (мегафон) расположен в верхних 50 пикселях нового изображения, а второй (смайлик) — в нижних 50 пикселях изображения. Мы будем показывать верхнюю половину изображения, когда нужно вывести мегафон, и нижнюю половину, когда нужно вывести смайлик. Реализация создания спрайтов CSS:


Позиционирование изображения на странице

В этом примере мы будем использовать рисунки в качестве фоновых изображений, размещенных в элементах div. Мы создадим пустые теги div для отображения изображений. Если на нашей странице нам нужно вывести изображение мегафона, мы используем CSS-класс «megaphone«:

Приведенный выше код CSS указывает ширину и высоту изображения мегафона (50 на 50 пикселей), он также вызывает изображение «sprite.png«, которое является объединенным. Часть кода «0 0px» отвечает за отображение спрайта. Указание начинать вывод изображения с «0 0px» означает, что оно должно отображаться с 0 пикселей по оси X и с 0 пикселей по оси Y. Это значит «начинать вывод изображения сверху» и «начинать вывод изображения слева«.

Так как в CSS мы определили ширину и высоту изображения, то будут отображаться только 50 его верхних пикселей (где расположен мегафон). Таким образом, смайлик не будет виден вовсе. Теперь давайте выведем смайлик и посмотрим, как изменится код CSS спрайта. Мы создадим класс CSS под названием «smile«:

Обратите внимание, что мы по-прежнему указываем те же ширину и высоту, вызываем то же изображение, но мы изменили эту часть: «0 -50px«. Так мы указываем, что изображение должно начинаться на 50 пикселей ниже начальной точки координат (-50px). Потому что рисунок смайлика начинается не в начале, а на 50 пикселей вниз от верхней части объединенного изображения.


Теперь, когда CSS-код указан, мы можем вызвать div везде, где нам нужно вывести изображение. Там, где нужно вывести мегафон, мы размещаем пустой блок div с классом «megaphone«:

Когда нужно вывести смайлик, мы размещаем div с классом «smile«:

Таков основной принцип, как сделать спрайт CSS. Существует много способов реализовать это, и лучше выбрать тот, который больше подходит вам. В этой статье мы показали, как работают спрайты, но не рассмотрели их углубленно.

Данная публикация представляет собой перевод статьи «How to use CSS sprites» , подготовленной дружной командой проекта Интернет-технологии.ру

www.internet-technologies.ru

Общие сведения

Спрайты – необычные молнии, которые способны удивить человека не только своей божественной красотой, но и нестандартным, как для молнии, поведением. Мы привыкли, что обычная молния бьет с облаков вниз на землю. Что касается спрайтов, то здесь дело обстоит иначе – они бьют вверх, создавая в небесной сфере потрясающе красивое зрелище.


Впервые спрайты были зафиксированы в 1989 году. Первым их увидел американский астроном-эксперт Джон Уинклер, который почти полвека проработал в NASA. Ученый обнаружил молнии случайно, когда в целях научных изысканий наблюдал за грозой. Впервые увидев эти направленные вертикально вверх молнии, он не поверил собственным глазам. Удивило Уинклера и то, что такой разряд появлялся на необычайно большой, как для обычной молнии, высоте. Направленный вертикально вверх он мог представлять опасность для аппаратов, запускаемых в космос, самолетов и прочих летательных машин. По этой причине Джон Уинклер решил продолжить изучение этого необычного явления.

В ночь с 22 на 23 сентября 1989 года мистер Уинклер, воспользовавшись высокоскоростной кинокамерой, умудрился заснять огромные вспышки света, которые простирались в небе по направлению снизу-вверх. Ученый, пользовавшийся устаревшей аппаратурой, посчитал, что эти молнии возникли на высоте 14 километров, что вполне допустимо и для обычных молний. Впоследствии, когда изучением спрайтов занялись современные научно-исследовательские центры и лаборатории, было доказано, что эти природные явления появляются на высоте не менее 55 км. На такой высоте вы не сможете встретить ни одного небесного разряда, который был бы направлен в сторону земли.

Механизм возникновения спрайтов

Заинтересовавшись данными о спрайтах, которые представил Уинклер сотрудникам NASA, ученые почти сразу же развернули крупномасштабную кампанию по изучению этого природного явления. В первую же ночь исследований они обнаружили около 200 вспышек молний в слоях ионосферы. Вспышки света возникали в основном в пределах 50-130 километров над поверхностью земли. Это зрелище одинаково восхищало и страшило ученых, поскольку в те времена многие из них еще не знали, чего толком можно ждать от спрайтов. Опасения ученых были понятны, так как спрайты имели все шансы на то, чтобы стать прямой угрозой для высотных летательных аппаратов. Чтобы исключить возможность этой угрозы, ученые решили изучить механизм возникновения спрайтов.

Проведя ряд наблюдения за спрайтами, ученые выяснили, что это явление возникает в основном только при очень сильной грозе, шторме или урагане. Большинство обычных молний, которые достигают земли, бьют из отрицательно заряженной части облака. Однако некий их процент берет свое начало в положительно заряженной части. Доказано, что молнии, берущие начало в этой области, обладают более сильным зарядом, а соответственно и силой. Считается, что в положительно заряженной части облака берут свое начало и спрайты.

Детальное исследование спрайтов показало, что они бьют снизу от облака вверх к ионосфере. В некоторых случаях часть этой молнии (хвост спрайта) уходит в низ по направлению к земле, но никогда не достигает ее. Наблюдение и анализ вспышек в верхних слоях атмосферы показали, что молнии, образующиеся в этой области, могут отличаться по цвету, форме, а также высоте, на которой они появляются. Исходя из этих критериев, ученые решили классифицировать верхние молнии, разделив на джеты, спрайты и эльфы.

Джеты, спрайты и эльфы

Джеты представляют собой вспышки света, наблюдаемые на наиболее близком расстоянии к земле, от 15 до 30 километров. Именно их, скорее всего, зафиксировал Джон Уинклер, который в 1989 году впервые произвел наблюдение вспышек молний в верхних слоях атмосферы. Джеты имеют трубчатую форму. Обычно они сине-белого или голубого оттенка. Известны случаи появления гигантских джетов, которые били в высоту на расстояние около 70 километров.

Спрайты – вид молний, о которых мы говорим в этой статье. Они появляются на высоте от 50 до 130 километров и бьют по направлению к ионосфере. Спрайты появляются через доли секунды после удара обычной молнии. Обычно они возникают группами, а не поодиночке. Длина спрайтов, как правило, держится в пределах нескольких десятков километров. Диаметр группы спрайтов может достигать 100 км в поперечнике. Спрайты – это красные вспышки света. Они быстро появляются и быстро исчезают «Продолжительность жизни» спрайта всего около 100 миллисекунд.

Эльфы – венец атмосферных молний. Они появляются на высоте свыше 100 км над земной поверхностью. Обычно эльфы появляются группами, напоминающими круг.

Диаметр такой группы может достигать 400 км в поперечнике. Также эльфы могут бить до 100 км в высоту – в самые верхние слои ионосферы. Зафиксировать эльфы крайне сложно, так как «живут» они не дольше пяти миллисекунд. Заснять такое явление можно только при помощи специальных, современных видеоприборов.

Как, где и когда можно наблюдать спрайты

Согласно Географической карте гроз, наибольшими шансами увидеть спрайты обладают жители экваториальной и тропической зоны Земного шара. Именно в этой области случается до 78% всех гроз. Жители России также могут наблюдать спрайты. Пик гроз в нашей стране приходится на июль-август месяц. Именно в это время любители астрономии могут увидеть такое красивое явление как спрайты.

Согласно американскому Справочнику наблюдения за спрайтами и гигантскими джетами, для того, чтобы увидеть спрайты, наблюдатель должен находиться на расстоянии примерно 100 километров от эпицентра грозы. Для того чтобы наблюдать джеты, ему следует навести оптику на 30-35 градусов по направлению к грозовой области. Тогда он сможет наблюдать часть ионосферы на высоте до 50 километров, именно в этой области чаще всего появляются джеты. Чтобы наблюдать спрайты, следует навести бинокль на угол 45-50 градусов, что будет соответствовать области неба на высоте около 80 км – месту, где рождаются спрайты.

Для лучшего и более детального изучения спрайтов, джетов, а тем более эльфов, наблюдателю лучше воспользоваться специальной киноаппаратурой, которая позволит детально зафиксировать небесные вспышки. Наиболее удачное время для охоты за спрайтами в России – период с середины июля по середину августа.

Интересные факты

  1. Спрайты, как и молнии, встречаются не только на Земле, но и на других планетах Солнечной системы. Предположительно именно спрайты были зафиксированы космическими исследовательскими аппаратами во время сильных штормов на Венере, Сатурне и Юпитере.
  2. Спрайты и эльфы возникают на такой большой высоте из-за сильной ионизации воздуха галактической пылью. На высоте свыше 80 километров проводимость тока в десять миллиардов раз выше, чем в приземных слоях атмосферы.
  3. Название «спрайты» происходит от наименования лесных духов, о которых идет речь в комедии Уильяма Шекспира «Сон в летнюю ночь».
  4. Спрайты были известны человечеству задолго до 1989 года. Люди высказывали разные гипотезы на счет природы этого явления, в том числе и то, что вспышки света являются инопланетными космическими кораблями. И только после того, как Джону Уинклеру удалось снять кадры спрайтов в ионосфере, ученые доказали, что они имеют электрическое происхождение.
  5. Цвет спрайтов, джетов и эльфов разнится от высоты, на которой они появляются. Дело в том, что в околоземной атмосфере сосредоточено больше воздуха, тогда как в верхних слоях ионосферы наблюдается высокая концентрация азота. Воздух горит синим и белым пламенем, азот – красным. По этой причине джеты, которые находятся ниже спрайтов, имеют преимущественно синий цвет, а сами спрайты и, более высокие, эльфы – красноватый оттенок.

comments powered by HyperComments

spacegid.com

Что такое спрайты css и зачем они нужны?

Спрайт представляет собой одну большую картинку, на которой объединены несколько других более мелких.

Используется эта картинка для задания фона для элементов на сайте при помощи CSS.

Для того чтобы задать для нужного блока определённую область спрайта используется позиционирование фона.
Например:

Допустим у нас есть 2 ссылки для которых нам нужно указать в качестве фона соответствующие социальные сети.

Вёрстка будет выглядеть так:

Теперь давайте загрузим спрайт с несколькими изображениями соцсетей на хостинг и в CSS зададим для них фон.

Для задания фона мы используем большое изображение с несколькими картинками и при помощи CSS свойства background-position смещаем фон как нам нужно.

При этом сначала мы указываем смещение по горизонтали и по вертикали.

Для второго блока это будет выглядеть так:

По сути всё то же самое, но меняется только значения CSS свойства background-position.

Раз уж мы заговорили об оптимизации, то имеет смысл присвоить всем элементам, для которых мы будем использовать спрайты CSS один общий класс. Это связано с тем что ряд CSS свойств у этих элементов будет повторяться (высота, ширина, фон и т.д.) и чтобы не писать их много раз для каждого элемента можно задать их сразу для всех один раз.

Вёрстка будет выглядеть так:

А так будет выглядеть CSS:

Видите разницу?

Зачем использовать CSS спрайты?

Согласитесь, использование спрайтов идея конечно интересная, но довольно хлопотная в реализации. И если бы у них не было преимуществ то навряд ли их бы кто-то использовал.

Преимущества :

  • позволяют уменьшить время загрузки за счёт того что обращение к серверу для загрузки изображения происходит только один раз. Когда у вас для каждого элемента задаётся отдельное фоновое изображение, то при загрузке страницы каждого изображения происходит обращение к серверу.
  • Сокращает суммарный вес изображений сайта, особенно если у них схожая палитра.
  • Загрузка изображений происходит быстрее.
  • Позволяют избежать эффекта пропадающего изображения при наведении. Подробнее об этом ниже.

Недостатки:

  • Нужно потратить определённое время на создание такого объединённого фонового изображения.
  • Сложнее задавать фон так как нужно вычислять значения для смещения.
  • Для того чтобы добавить, удалить или изменить одно изображение приходится править весь спрайт.

Использование CSS спрайтов для создания эффектов при наведении

Если вы решите создать эффект смены фонового изображения для элемента при наведении, то столкнётесь со следующей проблемой.

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

Как здесь:

Наведи на меня!

Для решения этой проблемы делаем следующее:

  1. 1.Подготавливаем спрайт с двумя картинками
  2. 2.Задаем верхнее изображение в качестве фона
  3. 3.Задаём смещение фона при наведении

    Получится вот так:

    Наведи на меня!
  4. 4.Для интереса можно ещё задать CSS свойство:

    Его добавляем и к селекторам .smile и .smile:hover и получаем довольно интересный эффект при наведении, а заодно и наглядно видим как происходит смещение фона.

В итоге получится так:

Наведи на меня!

В общем полезная штука эти CSS спрайты, но готовить и редактировать их довольно сложно!

К счастью, для облегчения этой задачи существуют специальные онлайн генераторы спрайтов.

Удобный генератор спрайтов CSS

Одним из таких сервисов является генератор спрайтов www.toptal.com

Для генерации спрайта нам нужно:

  1. 1.Переходим по ссылке и нажимаем на кнопку «CHOOSE FILE»
  2. 2.Загружаем с компьютера заранее подготовленные изображения, которые нужно объединить в спрайт и наживаем кнопку «Открыть».
  3. 3.Получаем готовый спрайт и фрагменты CSS кода, с указанием параметров смещения для каждого изображения! Скачиваем его себе на компьютер, нажав на кнопку «DOWNLOAD»
  4. 4.Далее загружаем полученный спрайт CSS на свой сайт. Это можно сделать через файловый менеджер на вашем хостинге или использовать FTP клиент FileZilla, для которого я недавно писала статью с инструкцией. Вот ссылка: «Как пользоваться FTP-клиентом FileZilla?»
  5. 5.Теперь для блоков, в которых вам нужно задать фоновое изображение, из спрайта используем указанные CSS свойства

    Класс вы можете использовать тот же что и здесь или задать свой.

  6. 6.Так же вы в любой момент можете удалить или добавить изображения на созданный спрайт.

    Для этого существуют специальные кнопки:

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

Если вы используете какие то более удобные генераторы спрайтов пишите их названия в комментариях.

Надеюсь моя статья помогла вам разобраться в теме спрайтов CSS! Оставляйте свои комментарии и делитесь статьёй в соцсетях. Вдруг мы с вами не одни такие сумасшедшие и тема CSS спрайтов будет интересна ещё кому то 🙂

Успехов вам! До скорой встречи в других моих статьях!

С уважением Юлия Гусарь

impuls-web.ru

Происхождение термина

Слово «спрайт» придумал в 1970-е годы кто-то из Texas Instruments: их новая микросхема TMS9918 могла аппаратно отображать небольшие картинки поверх неподвижного фона.[2]

Спрайты в двухмерной графике

Изначально под спрайтами понимали небольшие рисунки, которые выводились на экран с применением аппаратного ускорения. На некоторых машинах (MSX 1, NES) программная прорисовка приводила к определённым ограничениям, а аппаратные спрайты этого ограничения не имели. Впоследствии с увеличением мощности центрального процессора, от аппаратных спрайтов отказались, и понятие «спрайт» распространилось на всех двумерных персонажей. В частности, в видеоиграх Super Mario и Heroes of Might and Magic вся графика спрайтовая.

К аппаратно ускоренным спрайтам вернулись в середине 1990-х годов — когда развитие мультимедиа и взрывное повышение разрешения и глубины цвета потребовало специализированный процессор в видеоплате. Именно тогда, как обёртка над аппаратным 2D-ускорителем, вышел DirectDraw. DirectX 8 ввёл общий API для двух- и трёхмерной графики, и в современных спрайтовых играх двухмерные спрайты выводятся точно так же, как и трёхмерные — как текстурированный прямоугольник.

CSS-спрайты

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

CSS-спрайты экономят трафик и ускоряют загрузку — браузеру потребуется запрашивать меньше файлов.

Спрайты в трёхмерной графике

Движки первого поколения

В первых трёхмерных играх, например, Wolfenstein 3D (1992) и Doom (1993), персонажи представлялись в виде двумерных рисунков, изменяющих размер в зависимости от расстояния.

На 3D-акселераторах

На 3D-акселераторах применяется такая техника: объект рисуется в виде плоскости с наложенной на неё текстурой с прозрачными областями. Эта технология применяется в трёх случаях.

Оптимизация

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

  • Объекты, присутствующие в сцене в большом количестве и которые, будучи трёхмерными, имели бы большое количество граней и очень сильно влияли бы на производительность — например, публика (рис. 1), трава и т. д.
  • Удалённые объекты, которые вблизи рисуются полигональными моделями.

Спецэффекты

Некоторые спецэффекты (например, огонь) выполняются спрайтами, так как полигональный огонь плохо смотрится. Сравните, например, взрывы в Quake 2 (рис. 2) и Unreal Tournament (рис. 3).

Для большей правдоподобности изображения используется большое количество сравнительно маленьких спрайтов (так называемая система частиц).

Живая съёмка

Изредка спрайты применяются для добавления в игру живого фото или видео. Например:

  • Живые актёры, например в realMyst (рис. 4).
  • Рычаги управления в симуляторах самолётов, поездов и т. д., сфотографированные в реальной кабине.

Стоит заметить, что в некоторых спрайтовых играх, таких, как Rise of the Triad, спрайты фотографировались с актёров, а не с моделей, игрушек или рисунков.

Появление шейдеров частично снимает потребность в живой съёмке — многие нюансы фотоизображения уже можно передать полигональными моделями в реальном времени.

Разрушение иллюзии

Наблюдение спрайта под несоответствующим углом приводит к разрушению иллюзии. В зависимости от математического аппарата рендеринга («движка»), разрушение может происходить двумя способами.

  1. «Эффект портрета». Спрайтовый объект постоянно держится к наблюдателю нормалью к поверхности, что приводит к тому, что он визуально «поворачивается» все время к нему «лицом». В небольших пределах это незаметно, но при взгляде, скажем, на монстра сверху он может оказаться «лежащим на спине» на горизонтальном полу и при этом перебирающим ногами, да еще и бегущим в нужном направлении, не меняя более чем странной позы. Для борьбы с этим эффектом применяются наборы из большого числа спрайтов, снятых с разных направлений, которые подменяют друг друга в зависимости от угла наблюдения, но момент перехода от спрайта к спрайту также весьма заметен.
  2. «Эффект Ельцина»[источник не указан 1305 дней]. Назван из-за сходства спрайта с картонными портретами первого президента РФ, предназначенными для фотографий-сувениров и устанавливавшимися в людных местах в 90-е годы, совпавшие с расцветом спрайтовых игр. Возникает, если спрайт не поворачивается нормалью к поверхности к наблюдателю, выдавая «плоскостность» объекта даже при небольших изменениях угла наблюдения. Характерен для аппаратно-рендеримых спрайтов, введенных в полигональный «движок» как вспомогательные.

Терминология

  • Billboard — спрайт, постоянно повёрнутый лицом к камере (по аналогии с рекламными щитами на автодорогах, которые повёрнуты под наиболее выгодным углом).
  • Impostor — спрайт, который заменяет трёхмерную модель на большом удалении.

dic.academic.ru

Содержание

  • Введение
  • Спрайты c готовой маской
  • Cпрайты c программной маской Transparent
  • Использование TImageList
  • Использование Direct X
  • Список ссылок

Введение

Для начала нужно разобраться, что же такое спрайт. Вот такое описание я нашел в книге Андрэ Ла Мота:

» Знаете, есть такой газированный напиток… Снова шучу. На самом деле спрайты — это маленькие объектики, которые находятся на игровом поле и могут двигаться. Этот термин прижился с легкой руки программистов фирмы Atari и Apple в середине 70-х годов. Спрайты — это персонажи в играх для ПК, которые могут без труда перемещаться по экрану, изменять цвет и размер «

И так, спрайт это персонаж игры. Не углубляясь в дебри программирования, могу сказать что спрайт это массив из цветов — для простаты представим его как BMP файл или TBitmap, тем более что, этот формат поддерживаемый windows и не содержащий компрессии.

Что нам нужно от спрайта — заставить его появляться на экране и образовывать анимацию. Анимация это не только смена координаты спрайта, но и изменение самой картинки. Следовательно спрайт может иметь не одно изображение, а несколько. Смена их и приводит к анимации.

Как я уже говорил спрайт это матрица. При вписывании в кравдрат ( прямоугольник ) сложного объекта, например волшебника из рисунка ниже, остается свободное пространство. Его заполняют цветом, которого нет в изображении самого объекта. При простом копировании этой матрицы ( или для простоты BMP или TBitmap ) на экран выводится и волшебник и фон под ним. Но нам это не всегда, подчеркну не всегда, нужно. Если спрайт выводится на фон, то он затирает все квадратную область.

Как я уже говорил спрайт это матрица. При вписывании в кравдрат ( прямоугольник ) сложного объекта, например волшебника из рисунка ниже, остается свободное пространство. Его заполняют цветом, которого нет в изображении самого объекта. При простом копировании этой матрицы ( или для простоты BMP или TBitmap ) на экран выводится и волшебник и фон под ним. Но нам это не всегда, подчеркну не всегда, нужно. Если спрайт выводится на фон, то он затирает все квадратную область.

Что такое спрайты

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

1-й способ ( маг в белом квадрате ) основан на простом копировании одной области памяти в другую.

2-й способ ( маг на фоне ) то же копирование, но интеллектуальное. Копирование происходит по следующему алгоритму: Если цвет копируемого элементы матрицы ( область памяти ) соответствует значению цвета Transparent Color, то копирования не происходит, переходим к следующему элементу.

3-й способ так же основан на копирование области памяти, но с применением логических операций — маски.

Спрайты c готовой маской

Способов вывести спрайт на поверхность экрана много. Рассмотрим один из них. Это способ, когда отдельно рисуется спрайт и отдельно маска. Для этого нам понадобится сам спрайт, его маска и буфер.

Спрайт Что такое спрайты
Маска спрайта Что такое спрайты

И спрайт и маска должны иметь одинаковый размер, в данном примере 50×50. Для чего нужна маска? Она нужна для того, чтобы при выводе спрайта не затиралось изображение, которое находится под ним. Маску можно заготовить отдельно в BMP файле — более быстрый способ, а можно рассчитать программно.Спрайт и маску помещаем в TBitmap.

  Wizard:=Tbitmap.Create;  Wizard.Loadfromfile('spr1.bmp'); // Bitmap для спрайта  WizardMask:=Tbitmap.Create;  WizardMask.Loadfromfile('spr2.bmp'); // Bitmap для маски  

Ну вот, у нас есть спрайт, маска и нам это вывести его на экран. Для этого существует функция Win32Api:

BitBlt (param_1,X1,Y1,dX1,dY1,param_2,X2,Y2,param_3);

  • Param_1 — Handle на поверхность куда выводить.
  • X1,Y1 — Смещение от начала координат.
  • dX1,dY1 — Размер выводимого изображения.
  • Param_2 — Handle откуда брать.
  • X2,Y2 — Размер выводимого изображения.
  • Param_3 — Параметры копирования.

Для нашего случая:

BitBlt(Buffer.Canvas.Handle,X,Y,50,50, WizardMask.Canvas.Handle,0,0,SrcPaint); BitBlt(Buffer.Canvas.Handle,X,Y,50,50, Wizard.Canvas.Handle,0,0,SrcAnd);

  • SrcPaint — Копировать только белое.
  • SrcAnd — Копировать все кроме белого.

Сначала выводим маску с параметром SrcPaint, а затем в тоже место ( координаты X,Y) сам спрайт с параметром SrcAnd.

Осталось рассмотреть зачем же нужен буфер. При выводе одного спрайта вы не почувствуете мелькания изображения, но когда их будет 100-200 это будет заметно. По этому все спрайты копируются в буфер — это Tbitmap размером с экран или окно, короче изменяемой области. Вот как окончательно будет выглядеть фрагмент программы :

  ...  var  Wizard, WizardMask,Buffer:Tbitmap;  X,Y:integer;  ...  Wizard:=Tbitmap.Create;  Wizard.Loadfromfile('spr1.bmp');  WizardMask:=Tbitmap.Create;  WizardMask.Loadfromfile('spr2.bmp');  // Копируем маску в буфер BitBlt(Buffer.Canvas.Handle,X,Y,50,50,  Buffer:=Tbitmap.Create; :    WizardMask.Canvas.Handle,0,0,SrcPaint);  // Копируем спрайт в буфер  BitBlt(Buffer.Canvas.Handle,X,Y,50,50, Wizard.Canvas.Handle,0,0,SrcAnd);  ...  // Перемещаем буфер на форму BitBlt(Form1.Canvas.Handle,0,0,320,240,  // Buffer.Canvas.Handle,0,0,SrcCopy);  

Флаг SrcCopy означает копирование без изменения, аналогичен простому перемещению одного участка памяти в другой.

Не нужно думать, что готовая маска это прошлое компьютерных игр. В любом случае, маска создается, только иногда это делается программно, а иногда заготавливается в виде отдельного файла. Какой вариант лучше, нужно смотреть по конкретному примеру.

Я не буду расписывать все параметры BitBlt, если интересно смотрите сами в Delphi Help. Ну вот и все. Напоследок исходники и картина творчества.

Что такое спрайты

Cпрайты c программной маской — Transparent

Другой метод вывода спрайтов — методом программной маски. Этот способ, немного медленнее, но не требует возни с изготовлением масок. Это не значит, что маски вообще нет. Маска присутствует и создается в памяти.

Для счастливых обладателей Windows NT подойдет способ, который используется в самой ОС. Это функция MaskBlt. Судя по ее названию, она позволяет выводить растры используя битовые маски.

Привиду пример на спрайтах из игры Эпоха Империй I. Наша задача, как и во всех предыдущих примерах, вывести спрайт с Transparent Color (по русски плохо звучит). В игре он черный.

  var   Sprite,Mask:TBitmap;  begin   Sprite:=TBitmap.Create;   Sprite.LoadFromFile('G0100219.bmp');   Mask:=TBitmap.Create;   Mask.LoadFromFile('G0100219.bmp');   Mask.Mask(clBlack); // Создание маски   // Преобразование в маску, после этого получится Bitmap, представленный   // на Рис 2   MaskBlt(Form1.Canvas.Handle, 10,10, Sprite.Width, Sprite.Height,   Sprite.Canvas.Handle,0,0,Mask.MaskHandle,0,0,SRCPAINT);    // После вызова этой функции, экран выглядит как на рисунке 3.   BitBlt(Form1.Canvas.Handle, 10, 10, Sprite.Width, Sprite.Height,   Sprite.Canvas.Handle,0,0, SRCPAINT);  end;  

С Windows NT все понятно, но как быть в других ОС? ( Хотя возможно, эта функция появится(-лась) в Windows 2000 и Windows Me). Использовать библиотеки сторонних разработчиков. Если они поставляются с исходным кодом, то вы можете перенести необходимые вам процедуры в собственный модуль.

Я нашел самую быструю библиотеку для работы с графикой — Media Library Component Version 1.93. В примере используется только часть ее. Нам понадобится только одна процедура:

DrawBitmapTransparent(param_1,X,Y,param_2,param_3);

  • param_1 — Canvas, куда копировать
  • X,Y — Смещение
  • param_2 — TBitmap, что копировать.
  • param_3 — TColor, цвет Transparent — этот цвет не будет копироваться

Применение только данной библиотеки не принципиально. Практически в любом наборе VCL компонентов от сторониих производителей есть процедуры или функции для вывода Bitmap с использованием цвета прозрачности. Такие процедуры есть в библиотеке RXLib, LMD Tools, Cool Control и многих других.

Для нашего примера: DrawBitmapTransparent(Buffer.Canvas,WizardX,WizardY,Wizard,clRed); Спрайт должен выглядеть так:

Что такое спрайты

Небольшое замечание по поводу Transparent. Цвет надо выбирать такой, которого нет на самом спрайте, иначе неизбежны «дырки» в изображении. Лучше всего такой : #00FF00 — ярко зеленый, но можно использовать черный или белый.

В предыдущей главе «Работа спрайта c готовой маской» я подвесил передвижение спрайта на таймер:

  procedure TForm1.Timer1Timer(Sender: TObject);   begin    ... // тело цикла   end.   

Да cпособ хорош, но не так быстродейственен. Есть еще пара вариантов :

1. Создать поток TThread — в примере разобран именно он.
2. «Подвесить» на IDL

Рассмотрим сначала второй способ т.к. он наименее прогрессивен:) Пишем такую процедуру:

  procedure TForm1.Tic(Sender: TObject; var Done: Boolean);   begin    ...    // Сюда заносим, что надо исполнять.    ...   Done := false;   end;   

…. и еще немного:

  procedure TForm1.FormCreate(Sender: TObject);   begin    ...   Application.OnIdle := Tic;   end;  

Способ быстрее в 1-2 раз чем таймер, но не лишен недостатков. Не буду объяснять почему. Первый способ самый оптимальный для игры, как самой сложной так и простой. Реализуется он с помощью потоков. В игре их можно создать несколько — один для обработки графики, другой для AI, третий для музыки и т.д. У каждого потока свой приоритет, но высший только у одного. При работе с несколькими потоками не забывайте их «прибивать» при выходе из программы.

Сначала заводим новый класс:

  TGameRead=class(TThread) // класс для таймера игры   protected    procedure Execute;override; // Запуск    procedure Tic; // Один тик программы   end;  

Потом переменную :

  var   ...  T1:TGameRead;  ...  

Описываем процедуры класса :

  procedure TGameRead.execute;   begin    repeat    synchronize(Tic);    until Terminated   end;    procedure TGameRead.Tic;   begin   ...   // Тут пишем все как в TTimer - OnTime    ...  end;   

В событии Form1.Create инициализируем поток, и задаем приоритет. Расписывать все приоритеты не буду, читайте Delphi Help …и не забываем убрать за собой:

  ...  T1:=TGameRead.Create(false); // Создаем поток   T1.Priority:=TpHighest; // Ставим приоритет   ...    procedure TForm1.FormDestroy(Sender: TObject);   begin    T1.Suspend;// Приостановим    T1.Free; // и прибьем   end;  

Ну вот и все. Ах да, вас наверное заинтересовала строчка FPS. Так это тоже самое, что выдает Quake на запрос «showframerate» или что-то такого плана — количество кадров в секунду. Делается это так : заводится переменная:

  var   G:integer;  ...  

При каждом вызове потока Tic, она увеличивается на единицу:

  procedure TGameRead.Tic;   begin    ...    Inc(G); // Увеличиваем значение G   end;   

Создаем таймер с интервалом 1000 — это 1 секунда, и в событии OnTime выводим значение G в метку. В значении G будет количество вызовов процедуры DoSome за 1 секунду:

  procedure TForm1.Timer1Timer(Sender: TObject);   begin   label1.caption:='FPS :'+IntToStr(G);    G:=0; // Обнуляем G   end;  

На моем средненьком Pentium AMD 233 c Intel 740 8M — выдает 90-100 кадров в секунду, при окне 360X360. Для начала неплохо! Исходники тут, картинка перед вами.

P.S. У вас может возникнуть вопрос — почему передвижение спрайта за мышкой. Ответ: наименьшие затраты на писанину тест программы, при неплохом разнообразии движения.

Что такое спрайты

Использование внешних процедур для Transparent вывода спрайтов, хорошо но есть несколько минусов данного способа:

во первых эти процедуры не слишком оптимизированы — их основное предназначение вывод простеньких элементов приложения, таких как иконок, картинок кнопок и т.д. Хотя это не относится к некоторым библиотекам, код которых на 90% состоит из ассемблера.

во вторых хранить выводимое изображение нужно в bmp файле, хотя подойдет и любой другой, не применяющий компрессию с потерей ( Jpeg) . Если картинок более 1-й, а при нормальной анимации их набирается порядка 150-200 на один юнит, то сложно получать именно нужный участок файла.

Приведу пример.

В bmp файле содержатся 8 картинок — 64×64 пикселя. Нужно получить доступ к 6-й картинке ( на рисунке помечена розовым квадратом)- ее координаты будут 128,64

Что такое спрайты

Чтобы получить следующий кадр анимации, нужно снова ко номеру кадра считать координаты : Не совсем удобно. Все эти проблемы можно решить используя TImageList.

Использование TImageList

Используя этот компонент можно не думать о координатах картинки, цвете прозрачности — он решает сразу две проблемы.

Разберем что нужно сделать, для вывода спрайта с использованием TImageList. Во первых нужно загрузить набор спрайтов TImageList, для этого лучше всего использовать команду:

  TImageList.AddMasked(Image: TBitmap; MaskColor: TColor): Integer;  

Первый параметр — это Bitmap, второй Transparent Color — цвет прозрачности. Если Вам не нужно использовать цвет прозрачности, то нужно использовать процедуру Add. После загрузки всех картинок, можно приступать к их выводу на экран. Для этого существует процедура:

  procedure TImageList.Draw(Canvas: TCanvas; X, Y, Index: Integer);  

Первый параметр Canvas на который будет произведена отрисовка, второй и третий координаты для вывода X и Y а четвертый индекс или порядковый номер выводимого изображения.

Для примера:

  ImageList1.Draw(Canvas,0,0,6);   

Тот же самое, но с использованием BitBlt:

BitBlt(Canvas.Handle,0,0,64,64,Bitmap_Mask.Canvas.Handle,128,64,SrcPaint); — маска BitBlt(Canvas.Handle,0,0,64,64,Bitmap.Canvas.Handle,128,64,SrcAnd; — спрайт

  ImageList1.Draw(Canvas,0,0,6);   

Тот же самое, но с использованием BitBlt:

BitBlt(Canvas.Handle,0,0,64,64,Bitmap_Mask.Canvas.Handle,128,64,SrcPaint); — маска BitBlt(Canvas.Handle,0,0,64,64,Bitmap.Canvas.Handle,128,64,SrcAnd; — спрайт

Думаю пояснять нет нужды, что использовать TImageList лучше, и проще. Пример работы с TImageList описан в файле. Там показана анимация персонажа из игры WarCraft и Warlord III. Я так и не разобрался как работает механизм отрисовки в TImageList. Мои раскопки привели к такой функции :

  function ImageList_Draw(ImageList: HImageList; Index: Integer; Dest: HDC;   X, Y: Integer; Style: UINT): Bool; stdcall;  

и

  function ImageList_DrawEx(ImageList: HImageList; Index: Integer; Dest: HDC;   X, Y, DX, DY: Integer; Bk, Fg: TColorRef;   Style: Cardinal): Bool; stdcall;   

HImageList — Handle на TImageList.

Так как вызывается экспортируемая процедура, находящаяся в библиотеке Comctl32.dll то остается не понятным, какие алгоритмы используются при выводе изображения. Могу только сказать, что при добавлении нового изображения, добавляется как изображение так и маска.

Я заинтересовался данным вопросом и продолжал копать стандартные библиотеки Windows и компоненты. Возможно информация по данным вопросам содержится во многочисленных SDK, выпускаемых Microsoft. В компоненте TFastDIB я наткнулся на процедуру Draw:

  procedure TFastDIB.MaskDraw(fDC,x,y:Integer;c:TFColor);   begin    TransBlt(fDC,x,y,Width,Height,hDC,0,0,Width,Height,PDWord(@c)^);   end;   

Естественно меня заинтересовала процедура TransBlt и вот что я нашел:

  function TransBlt(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11:DWord):BOOL; stdcall;   ...   function CreateDIB; external 'gdi32.dll' name 'CreateDIBSection';   function TransBlt; external 'msimg32.dll' name 'TransparentBlt';   function AlphaBlt; external 'msimg32.dll' name 'AlphaBlend';   

Мне захотелось посмотреть, а что еще может библиотека ‘msimg32.dll’ и вот полный список:

  • AlphaBlend
  • GradientFill
  • TransparentBlt
  • DllInitialize
  • vSetDdrawflag

Все, хватит, а то некоторые читатели и так ничего не поняли. Но для интересующихся скажу — не все процедуры и функции описаны в Delphi, многое не документировано.

Использование Direct X

Чем плохи рассмотренные выше методы вывода спрайтов — они медленные. Хочу подчеркнуть, что для каждой программы нужно выбирать свои методы написания. Конкретное задание требует своих средств исполнения. То что Microsoft написал библиотеку Direct X не значит что тут же нужно писать всю графику используя ее.

Приведу пример. Самая популярная игра для Windows — Quake II, Warcraft, Diablo — нет САПЕР и ПАСЬЯНС. Можете не верить, но это факт. В первую категорию играют ограниченный контингент людей в последнюю играли ВСЕ. Я это говорю к тому, что если вы пишите графическое приложение, то нужно ориентироваться на его потребности и выбирать соответствующие технологию зависимости от них. Какие это потребности:

необходимость вывода большого количества часто сменяющихся изображений
большой объем графической информации
аппаратная поддержка
максимальное быстродействие

Используя Direct X можно получит все вышеперечисленное. Набор этих библиотек, изначально разрабатывался как средство для работы с графикой. Что было, когда писали под DOS: строили в участке памяти ( back buffer ) какое то изображение или копировали туда спрайты, а потом перемещали этот back buffer в область «экранной» памяти. Сразу отрисовывался весь экран. С приходом Windows, переместить участок памяти в экранную область не возможно. Приходится использовать Canvas, Handle.

DirectX позволяет решить все эти проблемы. Вы можете подготавливать изображение на так называемой поверхности, и потом FLIP и вся поверхность становится видимой — копируется в экранную область видеопамяти. Должен заметить, что алгоритм работы ничуть не меняется.

С появлением DirectX появились и аппаратные поддержки таких необходимых вещей как: Trancparent Color и Bit blitting.

Термин бит-блиттинг означает процесс перемещения группы битов (образа) из одного места экрана в другое или памяти. В играх на ПК нас интересует перемещение образа из области хранения вне экрана в область видеобуфера. Кто интересуется аппаратными возможностями своей видео карты, то их можно узнать достав Microsoft DirectX CPL. В ней можно просмотреть, какие функции в видео карте реализуются аппаратно, а какие програмно.

Итак процесс работы таков, загружаете спрайты на поверхность (ISurface) затем нужно вызвать процедуру BLT или BLTFAST, потом поменять буферную и видимую поверхность командой FLIP и все.

В начале раздела я написал Direct X, но я несколько обманул Вас. Я расскажу как выводить спрайты с помощью Direct X, но с использованием набора VCL компонентов DelphiX . Я это делаю по той простой причине, что если я напишу пример используя стандартные модули DirectX то их некоторые не поймут, отчаяться и бросят программировать вообще 🙂 Согласитесь не все сразу поймут, что делает данная процедура, хотя она всего лишь меняет поверхности.

  var   hRet : HRESULT;   begin    Result := False;    while True do    begin    hRet := FDDSPrimary.Flip(nil, 0);    if hRet = DD_OK then Break else    if hRet = DDERR_SURFACELOST then    begin    hRet := RestoreAll;    if hRet <> DD_OK then Exit;    end    else if hRet <> DDERR_WASSTILLDRAWING then Exit;    end;    Result := True;   end;   

По этому я и решил использовать DelphiX. Писать с помощью него очень просто. Нам потребуется всего два компонента. Первый TDXDraw — если объяснить коротко, то это аналог TCanvas. Еще один компонент это TDXImageList — прямой аналог TImageList, единственно все элементы являются TDIB и не содержат ни каких масок.

Что нужно сделать чтобы успешно создать и анимировать спрайт. Как и с TImageList нужно загрузить BMP файл в элемент TDXImageList. Элемент TImageList предварительно нужно создать в программе или создать из Object Inspector.

  DXImageList1.Items[0].picture.LoadFromFile('golem_start.bmp');    // Для вывода нужно использовать процедуру:     DXImageList1.Items[0].draw(DXDraw1.Surface,0,0,6);   

Вот и все. Прямая аналогия с TImageList … очень удобно переносить код. Пример использования можно посмотреть тут.

Что такое спрайты

Список ссылок

  • Исходный код примера с готовыми масками
  • Исходный код примера с програмными масками
  • Исходный код примера c использованием DirectX
  • Библиотека Media Library Component Version 1.93
  • Библиотека DelphiX
  • Библиотека FastDib / есть процедуры TransparentDraw
  • Статья «Обзор формата DIB и компонентов для работы с с ним»

Что такое спрайты

Пример работы со спрайтами : перемещение, создание, уничтожение ( смерть юнита ), перемещение в заданную точку, атака противника… Спрайты взяты из игры Diablo. Для компиляции потребуется DelphiX.

Комментарий:
 

www.codenet.ru

Шаг 1. Использовать background

Первый шаг к объединению изображений в «спрайт» – показывать их через background., а не через тег IMG.

В данном случае он уже сделан. Стиль для дерева:

Шаг 2. Объединить изображения

Составим из нескольких изображений одно icons.gif, расположив их, например, по вертикали.

Из Что такое спрайты, Что такое спрайты и Что такое спрайты получится одна картинка: Что такое спрайты

Шаг 3. Показать часть спрайта в «окошке»

А теперь самое забавное. Размер DIV'а для иконки – жёстко фиксирован:

Это значит, что если поставить background'ом объединённую картинку, то вся она не поместится, будет видна только верхняя часть:

Если бы высота иконки была больше, например, 16x48, как в примере ниже, то было бы видно и остальное:

…Но так как там всего 16px, то помещается только одно изображение.

Шаг 4. Сдвинуть спрайт

Сдвиг фона background-position позволяет выбирать, какую именно часть спрайта видно.

В спрайте icons.gif изображения объединены так, что сдвиг на 16px покажет следующую иконку:

Результат:

  • В спрайт могут объединяться изображения разных размеров, т.е. сдвиг может быть любым.
  • Сдвигать можно и по горизонтали и по вертикали.

Отступы

Обычно отступы делаются margin/padding, но иногда их бывает удобно предусмотреть в спрайте.

Тогда если элемент немного больше, чем размер изображения, то в «окошке» не появится лишнего.

Пример спрайта с отступами:

Иконка RSS находится в нём на координатах (90px, 40px):

Это значит, что чтобы показать эту иконку, нужно сместить фон:

При этом в левом-верхнем углу фона как раз и будет эта иконка:

Элемент, в котором находится иконка (в рамке), больше по размеру, чем картинка.

Его стиль:

Если бы в спрайте не было отступов, то в такое большое «окошко» наверняка влезли бы другие иконки.

Итого

Спрайты позволяют:

  1. Сократить количество обращений к серверу.
  2. Загрузить несколько изображений сразу, включая те, которые понадобятся в будущем.
  3. Если у изображений сходная палитра, то объединённое изображение будет меньше по размеру, чем совокупность исходных картинок.

Если фоновое изображение нужно повторять по горизонтали или вертикали, то спрайты тоже подойдут – изображения в них нужно располагать в этом случае так, чтобы при повторении не были видны соседи, т.е., соответственно, вертикально или горизонтально, но не «решёткой».

Далее мы встретимся со спрайтами при создании интерфейсов, чтобы кнопка при наведении меняла своё изображение. Один спрайт будет содержать все состояния кнопки, а переключение внешнего вида – осуществляться при помощи сдвига background-position.

Для автоматизированной сборки спрайтов используются специальные инструменты, например SmartSprites.

learn.javascript.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.