Библиотека pygame / часть 2. работа со спрайтами

Введение

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

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

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

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

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

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

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

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

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

Как создать спрайт?

Сейчас можно приступать к созданию спрайта. В рассматриваемой нами библиотеки все они являются объектами, ибо Python — объектно-ориентированный язык программирования. Если прежде с этим типом данных вы не работали, то достаточно понимать, что с помощью объектов удобно осуществлять группировку объектов и кода в что-то единое.

Изначально это может запутывать, но через некоторое время станет понятно, насколько простая у объектов логика, и как они облегчают жизнь. И Pygame – отличный способ потренироваться в объектно-ориентированном программировании. 

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

Для начала попробуем определить новый спрайт. 

class Player(pygame.sprite.Sprite):

Class говорит Python, что нужно определить спрайт игрока, который будет выступать в качестве нового объекта. Его тип — pygame.sprite.Sprite. Это означает, что он базируется на Sprite по умолчанию в Pygame.

При определении класса в первую очередь необходима специальная функция __init__(), которая включает инструкции, которые будет выполнять интерпретатор Python при генерации объекта данного типа. Кроме того, каждый спрайт в Pygame должен иметь два свойства: image и rect

class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface((50, 50))

        self.image.fill(GREEN)

        self.rect = self.image.get_rect()

Первая строка Pygame.sprite.Sprite.__init__(self) обязательна в Pygame — она включает встроенный инициализатор класса Sprite. Затем вам нужно задать свойство image. А пока создаем квадрат 50×50 и заливаем его в зеленый цвет (то бишь, green). Чуть позже вы поймете, каким образом осуществляется изменение внешнего вида спрайта с помощью, например, человека или космического корабля, а пока хватит одного квадрата.

Затем вам нужно задать rect спрайта. Это означает прямоугольник. Они применяются в Pygame для понимания координат, в которых расположены конкретные объекты. Инструкция get_rect() оценивает изображение и вычисляет окружающий его прямоугольник.

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

class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface((50, 50))

        self.image.fill(GREEN)

        self.rect = self.image.get_rect()

        self.rect.center = (WIDTH / 2, HEIGHT / 2

Теперь, после того, как мы определили спрайт игрока Player, необходимо создать его. Для этого инициализируется экземпляр одноименного класса. Помимо этого, необходимо в обязательном порядке добавить спрайт в группу с названием all_sprites

all_sprites = pygame.sprite.Group()

player = Player()

all_sprites.add(player)

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

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

Голубой джет

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

Спрайт — редкий вид грозовых разрядов

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

Эльф

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

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

Назначение

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

Наряду с ролью гида игрока спрайты также могут помочь в битве, поскольку они обладают возможностью создавать лучи энергии и/или предметы, которые можно использовать для атаки, лечить игрока и поднимать вещи с помощью телекинеза. Характер их способностей определяется прототипированием, например, создает еду и технику, связанную с домоводством, Кэлспрайт создает кукол, Дейвспрайт может использовать меч в своем животе как оружие, а Бекспрайт, похоже, способен увеличить мощность своих лучей энергии силами Первого хранителя. Спрайты могут также использовать свои колдунские силы и для прочих целей, помимо боя: Бабульспрайт, например, наколдовала кровать и духовку, а Дейвспрайт использовал свои спрайтовые способности, чтобы искалякать постер/письмо «Армагеддона» Джона . Еще спрайты могут проходить сквозь твердые тела, после чего иногда остаются пятна эктоплазмы.

Прототипированный спрайт сразу после входа в Медиум разделяется на ядро и спрайт, а затем и ядро, в свою очередь, делится на две части, содержащие в себе данные прототипирования для шпилей на Проспите и Дерсе. Таким образом, данные повлияют не только на спрайта, но и монстров, с которыми игроку предстоит встретиться, а также Монархов королевств света и тьмы. Например, Джон Эгберт прототипирует свой ядроспрайт куклой арлекина, в результате чего на бесах и ограх появляются арлекинские наряды. Они также заставляют расти : от каждого нового входа с прототипированным спрайтом оно становится больше. Конечную форму Поля битвы можно достигнуть только после прототипирования Ядроспрайта каждого игрока по меньшей мере один раз до входа, и эта форма Поля боя требуется для выращивания Лягушки Бытия и, таким образом, победы в игре.

Сеанс без прототипирований до входа называется . Отсутствие шпилей на Проспите и Дерсе в сеансе (как и сфер на кольцах Королев и скипетрах Правителей) является знаковым для Пустого сеанса. В этих случаях на Ядроспрайт вход в сеанс никак не влияет; они не теряют свое ядро, однако после прототипирования оно исчезает.

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

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

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

Зачем это нужно? Спрайты снижают количество запросов к странице от пользователя и уменьшают общий размер изображений. В итоге посетитель быстрее увидит сайт.

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

Чтобы было понятнее приведу аналогию. Представьте что вы смотрите в замочную скважину. Вы видите только какой то отдельный кусок помещеняи по ту сторону двери. Если вы чуть сдвинетесь в сторону и будете смотреть в скажину под другим углом, то увидите какой то другой кусок того же самого помещения.

Требования к спрайтам

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

Перед нами пример плохого спрайта. В чем его проблемы? Во-первых, очень плохо сделана форма. Во-вторых, расцветка. По всей видимости, автор спрайта просто сделал заливку при помощи инструмента, из-за чего получил две проблемы — слишком резкий переход между отдельными оттенками и слишком плоская форма. Задача шейдинга — добавить спрайту объем, тут же спрайтер добился прямо противоположного результата. Наконец, градиент на ручке, который вообще ни к селу ни к городу. Перейдем к следующему, куда более сложному примеру.

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

Размер. Почему-то многие начинающие спрайтеры считают своим долгом заполнить изображением все отведенное им пространство в 32х32 пиксела. Так вот, так делать не стоит. Конечно, масштаба в игре нет, но такой огромный спрайт будет странно смотреться (если, конечно, он не изображает что-то действительно большое, вроде стационарной машины).
Стиль. Старый спрайт изображал синее пластиковое ведро. Вдруг оно по непонятной причине превращается в помятое металлическое ведро серого цвета. Это изменение ничем не оправдано. Если вы собираетесь заменить спрайт на имеющийся, будьте последовательны и старайтесь, чтобы он был похож на старый. Далее, спрайт не подходит к стилистике игры. Несмотря на всю техническую отсталость, царящую в сеттинге, у нас все же космическая станция, а не дачный поселок, а это ведро выглядит так, что в нем только навоз носить

Наконец, оно просто слишком реалистично, что напрямую подводит нас к следующей проблеме.
Теперь самая главная проблема, на которой следует заострить внимание — это палитра. Увы, эту ошибку совершают многие люди, которые умеют рисовать, но не имеющие опыта рисования именно спрайтов

Чтобы подробнее разъяснить эту проблему, приведу цитату одного из спрайтеров /tg/ под ником veyver.

Вам редко когда понадобится более четырех оттенков одного цвета, чтобы спрайт выглядел хорошо. Понять, правильно ли вы подобрали палитру для спрайта, очень просто — попробуйте пересчитать вручную количество использованных цветов. Если у вас не получится — то ваш спрайт слишком детализирован. Автор этого спрайта, например, смог сократить количество использованных цветов до 10 без потери в качестве. В палитре и детализированности спрайта и кроется главная ловушка. Спрайт с чрезмерно большой палитрой будет смотреться не хуже спрайта с малой палитрой, но делая его, вы подкладываете свинью будущим спрайтерам, захотевшим сделать новый спрайт на его основе. В случае, если спрайтер захочет, например, перекрасить спрайт ведра, нарисованного небольшим количеством цветов, ему будет достаточно сделать несколько кликов мышкой, в случае же этого ведра ему придется, скорее всего, либо использовать фильтры и надеяться на то, что результат выйдет не слишком поганым, либо рисовать спрайт с нуля. А теперь вернемся к первому спрайту ведра.

Итак, мы вернулись к первому спрайту… Чтобы его исправить!

  1. Изменим форму ведра, чтобы оно было больше похоже на ведро, а не на цилиндр.
  2. Изменим расцветку на менее аляповатую.
  3. Изменим форму затенения, чтобы придать ведру объем.
  4. Уберем ужасный градиент с ручки

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

Спрайтовая графика

Один спрайт — это неподвижная картинка. Несколько быстро сменяющихся картинок из одной серии создают анимацию, то есть спрайтовую анимацию. Самой узнаваемой спрайтовой анимацией является 8-битный Марио; в состав его анимации входило всего 12 картинок:

  • 2 для левого прыжка,

  • 2 для правого прыжка,

  • 4 для передвижения влево,

  • 4 для передвижения вправо.

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

Спрайтовая анимация действует по принципу кинематографа. Многие пользователи знают, что кино состоит из множества кадров, есть даже цифра (24 кадра в секунду), которую способен уловить человеческий глаз. Фильм показывается на всем экране телевизора. А спрайтовая анимация — это такой же небольшой фильм, только в масштабах одного персонажа на большом экране, то есть это как отдельный экран с кино на большом экране устройства. А в этом небольшом кино крутятся изображения одного персонажа, создавая анимацию. Причем количество спрайтов в спрайтовой анимации не обязательно должно быть равно 24. Зацикливают любое количество изображений, начиная от 2-х.

Создание спрайтов

Спрайтовая графика создается в три этапа:

  1. Необходимо создать изображения для анимации.

  2. Далее эти изображения нужно объединить в одном кадре и наладить из них анимацию.

  3. Расположить анимацию на экране.

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

  • Paint;

  • Piskel;

  • GraphicsGale;

  • Aseprite;

  • GameMaker Studio, который является не просто редактором для спрайтов, но и полноценным движком для 2D-игр;

  • Фотошоп;

  • и др.

Спрайт — это 2D-изображение. Спрайтовая анимация часто используется именно в 2D-играх, поэтому анимировать свои спрайты можно по-разному:

  • для полноценных 2D-игр можно использовать соответствующие игровые движки;

  • для браузерных игр используют HTML5, JavaScript и CSS;

  • можно использовать знания Java или C++;

  • и др.

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

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

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

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

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

В этом вся суть CSS спрайтов.

Использование 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.picture.LoadFromFile('golem_start.bmp');

// Для вывода нужно использовать процедуру: 

DXImageList1.Items.draw(DXDraw1.Surface,0,0,6); 

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

Преимущество использования CSS Image Sprite

Веб-страница, особенно с небольшими изображениями, такими как иконки, значки, кнопки и т. д., может долго загружаться, т.к. генерирует много запросов к серверу.

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

Сокращение количества HTTP-запросов оказывает существенное влияние на сокращение времени отклика; это делает веб-страницу более отзывчивой для пользователя.

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

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

Весь процесс создания этого примера объясняется ниже.

Хорошо, теперь то я уже могу нарисовать свой спрайт?

Да, теперь можно приступить к рисованию спрайтов.

Создаём спрайт:

sf::Sprite sprite;
sprite.setTexture(texture);

Рисуем его:

// внутри главного цикла, между window.clear() и window.display()
window.draw(sprite);

Если вы не хотите что бы ваш спрайт отображал всю текстуру, вы можете выбрать прямоугольную область которую хотите взять у текстуры:

sprite.setTextureRect(sf::IntRect(10, 10, 32, 32));

Можно изменить цвет спрайта. Цвет, который вы установите модулируется (умножается) с текстурой спрайта. Это также может быть использовано для изменения глобальной прозрачности (альфа-канал) спрайта.

Все эти спрайты использовали одну и ту же текстуру, но имеют разные цвета:

Спрайты также могут быть преобразованы: они имеют положение, ориентацию и масштаб.

// позиция
sprite.setPosition(sf::Vector2f(10, 50)); // абсолютная позиция
sprite.move(sf::Vector2f(5, 10)); // смещение относительно текущей позиции

// поворот
sprite.setRotation(90); // абсолютный угол
sprite.rotate(15); // смещение относительно текущего угла

// масштаб
sprite.setScale(sf::Vector2f(0.5f, 2.f)); // абсолютный коэффициент масштабирования
sprite.scale(sf::Vector2f(1.5f, 3.f)); // коэффициент масштабирования относительно текущего масштаба

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

sprite.setOrigin(sf::Vector2f(25, 25));

Поскольку функции преобразования являются общими для всех объектов SFML, то они объясняются в отдельном уроке: Трансформация объектов.

Вкусы Sprite

В США вкусов гораздо больше, чем у нас, но даже для них некоторые остаются недоступными. В
2003 году в Гонконге был представлен набор Sprite Super Lemon/ Sprite Dry Lemon/ Sprite Lemon
Lime Herb, добавляющий новые оттенки лимона и лайма. Также в Гонконге продавался Sprite on
Fire — имбирная вариация, подающаяся как «обжигающая». Этот вкус до сих пор можно найти
под названием “Sprite Finger Lemon”. Sprite Ice — выпущенный в Южной Корее вкус с ароматом
мяты, который позже с разными вариациями добрался до Канады, Бельгии, Италии и Китая.

Забавный факт, что маркировка Zero, используемая сейчас для Coca-Cola Zero, прошла тестирование именно на “Спрайте” — версия с заменителем сахара и без калорий появилась в 1974 году как Sprite Zero, затем была переименована в Diet Sprite, но в 2006 вернулась к оригинальному названию. Возможно, что успешный опыт “Sprite со вкусом огурца” в России принесёт нам ещё много эксклюзивных вариаций — будем наблюдать за дальнейшими ходами борца с жаждой.

Спрайты изображений — создание списка навигации

Мы хотим использовать спрайтовое изображение («img_navsprites.gif») создание списка навигации.

Мы будем использовать список HTML, потому что это может быть ссылка, а также поддерживает фоновое изображение:

Пример

#navlist {    position: relative;}#navlist li {    margin: 0;    padding: 0;    list-style: none;
    position: absolute;    top: 0;}
#navlist li, #navlist a {    height: 44px;    display: block;}#home {    left: 0px;    width: 46px;    background: url(‘img_navsprites.gif’)
0 0;}#prev {    left: 63px;    width: 43px;
    background: url(‘img_navsprites.gif’) -47px 0;}#next {    left: 129px;    width: 43px;    background: url(‘img_navsprites.gif’)
-91px 0;}

Объяснение примера:

  • — положение установлено по отношению абсолютного расположени внутри его

  • для полей и отступов задано значение 0, стиль списка удаляется, а все элементы списка располагаются в абсолютном порядке
  • — высота всех изображений 44px

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

  • — Расположен полностью влево, а ширина изображения 46 пикселей

  • Определяет фоновое изображение и его положение (слева 0 пикселей, сверху 0 пикселей)

  • Расположенный вправо 63px (#home ширина 46px + некоторое дополнительное пространство между элементами), а ширина 43 пикселей.

  • Определяет фоновое изображение справа 47px (#home ширина 46px + 1px делитель линии)

  • Расположенный справа 129px (сначало: #prev 63px + #prev ширина 43px + дополнительное место), а ширина 43 пикселей.

  • Определяет фоновое изображение справа 91 пикселей (#home ширина 4 пикселей + 1 пикселей делитель линии + #prev ширина 43 пикселей + 1 пикселей делитель линии)
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Медиа эксперт
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: