Динамический фон для баннеров и flash-игр
24.06.2009, автор Stormit, рубрики: ActionScript, Flash игры, Игровые баннерыУрок от ANIMEFISH.COM
Привет!
Представляю вниманию очередную хитрость для флеш девелоперов - “Создание динамических текстур во флеш”. О чем это я? Частенько в играх, в анимации, существует необходимость использовать качественные текстуры для различных заливок (для фонов, объектов и т.д.) Однако, найти такую текстурку достаточно сложно, подготовить ее к использованию в ролике - тоже сложно (если вы к тому же не владеете растровыми редакторами - это еще проблематичней), импортируемая текстура имеет вес (и не малый) а для вашей игры, например, необходимо много текстур. Но самое важное - это найти ту текстуру, которая бы гармонировала бы с вашей графикой.
Что же делать? Какие пути выхода?
- Нарисовать всю картинку целиком - ну тут даже не каждый художник сможет справиться, даже профи
- Предлагаю воспользоваться моим способом - динамически создавать свою текстуру прямо во Flash!
Начнем.
Суть метода состоит в заполнении ограниченной области различным графическим “мусором”. На 2-м слайде изображены элементы из которых составлен фон на 1-м слайде. Это битмапка для заливки, клип с изображением камня и функция Math.random(). Код примера:
particle._visible = false; for (z = 0; z < 200; z++) { var dupe = particle.duplicateMovieClip("s" + z, z); dupe._x = Math.random() * 550; dupe._y = Math.random() * 200; dupe._xscale = dupe._yscale = Math.random() * 50 + 50; dupe._rotation = Math.random() * 360; dupe._alpha = Math.random() * 100; }
Что мы сделали - залили прямоугольную область текстурой травы, а наш камень (клип particle) размножили - разбросали его по всему клипу, изменили ему свойства: вращение, прозрачность, размер.
Теперь усложняем наш фон (слайд 3), добавляем различные варианты “мусора” (в данном случае костяшки и тени). В коде цикла добавляем ещё одну строку, которая переводит символ particleв случайный кадр.
dupe.gotoAndStop(int(Math.random() * dupe._totalframes + 1));
Получаем пример - слайд 4. Такая жуть получилась
Ну все это хорошо, скажете вы, но ведь нам все равно нужно некое фоновое заполнение - какая-то текстурка для заливки общего фона. Да, вы правы! В данном примере нужна, а в следующем - нет. Если вы желаете полностью отказаться от чужих растровых заливок - продолжим.
Слайд 5 - создаем “элемент мусора” которым будем заполнять наш фон, его изображение может выглядеть как угодно, главное - цвета подбирать близкие друг к другу, но отличные по тональности (темнее или светлее). Так же можно его размыть (так даже лучше)
Слайд 6 - создаем несколько подобных различных “элементов” и размещаем их в разных кадрах клипа particle. И заполняем наш фон - это первая составляющая будущей текстуры (слайд 7). Слайд 8 - создаем элементы которые составляют второй и третий “этажи” заливки. Для удобства, также поместим их в клип particleв кадры 4, 5 и 6 соответственно. Все эти элементы находятся выше предыдущих элементов составляющих первый “этаж”. На слайде 9 - результат, достаточно миленькая лужайка с ромашками :), код примера:
//трансформация одинакова для всех - выносим в отдельную функцию function _fill(obj) { obj._x = Math.random() * 550; obj._y = Math.random() * 200; obj._xscale = obj._yscale = Math.random() * 50 + 50; obj._rotation = Math.random() * 360; obj._alpha = Math.random() * 100; } // заполняем первый этаж "мусором" for (z = 1; z < 200; z++) { var tmp = particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(Math.round(Math.random() * 2) + 1); } // второй этаж - травой for (z = 201; z < 400; z++) { var tmp = particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(Math.round(Math.random() * 2) + 4); } // третий этаж ромашками for (z = 401; z < 500; z++) { var tmp = particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(6); }
Все прекрасно, все красиво, а тормоза? Все теперь это будет тормозить наш ролик! О нет! Хотя, есть же прекрасный пример с растеризацией вектора. Применим его к нашей картинке (для этого пришлось символ particle, обернуть в символ bg). В этом случае код выглядит так:
function _fill(obj) { obj._x = Math.random() * 550; obj._y = Math.random() * 200; obj._xscale = obj._yscale = Math.random() * 50 + 50; obj._rotation = Math.random() * 360; obj._alpha = Math.random() * 100; } // заполняем первый этаж "мусором" for (z = 1; z < 200; z++) { var tmp = bg.particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(Math.round(Math.random() * 2) + 1); } // второй этаж - травой for (z = 201; z < 400; z++) { var tmp = bg.particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(Math.round(Math.random() * 2) + 4); } // третий этаж ромашками for (z = 401; z < 500; z++) { var tmp = bg.particle.duplicateMovieClip("s" + z, z); _fill(tmp); tmp.gotoAndStop(6); } var tmp_bitmap = new flash.display.BitmapData(550, 200, false, 0x00000000); bg_rastr1 = this.createEmptyMovieClip("bg2", 10000); bg_rastr2 = this.createEmptyMovieClip("bg3", 10001); tmp_bitmap.draw(bg); bg_rastr1.attachBitmap(tmp_bitmap,10002); bg_rastr2.attachBitmap(tmp_bitmap,1003); bg_rastr2._xscale = 400; bg_rastr2._yscale = 400; //маскируем увеличенную копию bg_rastr2.setMask(this._mask); //И удаляем оригинал с векторным изображением нашего фона bg.swapDepths(10004); bg.removeMovieClip();
Где tmp_bitmap временный клип в который мы производим конвертацию bg_rastr1 и bg_rastr2 - динамически созданные клипы которые будут содержать наше растрировнное изображение. bg_rastr1 - основной клип, а bg_rastr2 - не обязательный, создан для наглядности (его мы увеличим в 4 раза (400%) и закинем под маску _mask).
Дальшея думаю понятно, _mask - клип нашей маски который содержит скрипт
onClipEvent(enterFrame){ _x=_parent._xmouse; _y=_parent._ymouse; }
Все - слайд 10, показывает результат нашей деятельности.
Что можно придумать еще? Да можно все, можно попробовать сгенерить текстуру дерева, металла, травку посимпотичней, все что хотите. Плюс, можно сделать текстуру для фонов находящихся под влиянием перспективы (псевдо-трехмерные фоны), создать тайлы, и многое другое.
На этом все, спасибо за внимание, ваш animefish.
Интересно на 97%




Офигенно! Спасибо за ценную хитрость!
Прикольно нарисованно, хороший урок
А еще это можно использовать в будущем уроке про подвижный фон)
О да! Блог снова ожил!
Для тех, кто использует не AS2, а AS3, для концертации в растр нужно вместо строк
//as2 sample
var tmp_bitmap = new flash.display.BitmapData(550, 200, false, 0×00000000);
bg_rastr1 = this.createEmptyMovieClip(”bg2″, 10000);
tmp_bitmap.draw(bg);
bg_rastr1.attachBitmap(tmp_bitmap,10002);
//
использовать следующие:
//as3 sample
var tmp_bitmap = new flash.display.BitmapData(550, 400, false, 0×00000000);
tmp_bitmap.draw(bg);
var bm:Bitmap = new Bitmap(tmp_bitmap);
addChild(bm);
//
так же при удалении нужно удалить всех чайлдов мувика bg и ссылки на них.
Извините, ошибся в строчке
var tmp_bitmap = new flash.display.BitmapData(550, 400, false, 0×00000000);
- должно быть не 400, а 200.
Впрочем, если кому интересно, могу выложить полный as3 код.
To: Platon
Если можно, выложите весь AS3.
статья - суперская !
А возможно ли таким способом нарисовать, например, звёздное небо?
Саша - можно и звездное небо. Все что ваша фантазия пожелает - рисуйте вместо камешка звездочку + синий фон и вуаля!
исходник на as3 + фильтр blur и смена картинки по клику.
http://narod.ru/disk/10292096000/dynafone.rar.html
Интересно на 25%
Спасибо!
Респект за статью! Вы лучший блог!
Спасибо, единственным минусом этого сайта вижу только что не предлогаете исходники
Драсте а когда будет урок про подвижный фон?
Stormit хотим ещё уроков!!))
Лично меня очень интересуют вопросы оптимизации
Например вот тема - Оптимизация карты для игры - в котором описывается то что в играх, где есть большая карта и привязанный к камере персонаж, нужно использовать предзагрузку только той части где этот персонаж находится. Чем не хитрёж?)
Вроде бы Nox Noctis делал доклад на подобную тему на FlashGamm в Москве.
Ребята, извините за оффтоп, очень понравился ваш подход, подскажите литературу для начинающего работать с флэш. Буду рад советам, с чего начать и какими программами пользоваться. Опыт в программировании минимальный.
Заранее большое спасибо.
Argentum, поищи учебник Гурского. Еще есть небольшая, но классная книга MyFirstGame Johnny.K
2Stormit
Да это понятно, интереснее реализация. Например как сделать методом выше (+растр) чтобы например при движении “камеры” вправо (mc с фоном влево) чтобы “на лету” генерился такой же рандомный динамичный битмап. При этом возможно будут заметны швы… Я вот не знаю)
http://xitri.com/2008/05/20/flash-effects-animation-tutorials.html
можете дать другие уроки(ссылку и тд) 
вот тут почемуто не рабочие ссылки на уроки
Извините за оффтоп
http://www.floobynooby.com/FXmontage2.mov
это видео, нужно скачать
Здравствуйте!!! Я начинающий разработчик. Мне хочется сделать гонки. Пожалуйста напишите урок как разработать противников. Заранее спасибо!!!
Bulat, студия которая размещала на своем блоге материалы о спецэффектах - закрылась (coolideascope), Все материалы по эффектам (и несколько новых) тут http://flashfx.blogspot.com/
>>чтобы “на лету” генерился такой же рандомный динамичный…
Можно так: http://xitri.com/2008/04/21/loop-background2.html
Можно проще: создать один объект BitmapData с начальным фоном и при движении камеры шлёпать справа или слева новые элементы фона рандомно. Если картинка становится большой - обрезать её. Как вариант.
>>хочется сделать гонки…как разработать противников…
Можно расставить по маршруту набор ключевых точек и противники должны по очереди проходить эти места - двигаться от точки к точке. Можно рандомно их разнести для разных противников (скорость, ускорение и т.д. тоже немного поварьировать).
Спасибо!!!!!!
>> Можно проще: создать один объект BitmapData с начальным фоном и при движении камеры шлёпать справа или слева новые элементы фона рандомно. Если картинка становится большой - обрезать её. Как вариант.
Ну я так и думал, только не могу что-то это реализовать.
Имеем bg. в нём созданный bgrastr. bg статичен. _root двигается по _x и _y
Не подскажете как это можно сделать? Как доделаю сайт обязательно будет ссылка к вам
animefish большое спасибо
Замечательно! Дизайн и идеи - все супер. Акромя AS2.
Stormit, ты не только можешь, но и должен расти! (с таким то потенциалом)
pacific - может вам стоит начать как и все, с элементарного, изучить базовые понятия флеша, а не делать сразу игру. По сути игра - это логическая машина которую автор создает, а реализована эта машина может быть на любом языке. Если вы не знакомы ни с принципом создания игры, ни с средой программирования - вам будет тяжело.
thanks))
awesome article!
Stormit не поможете да?(
Как определить когда загружать продолжение фона знаю, а как продолжать рисовать фон с методом выше (+перегонка в растр) не знаю. Heeeelp)
Немного другим способом можно.
Создаём BitmapData (дальше BD) для фоновой картинки (например в 3 раза шире флешки), аттачим к клипу (который будет содержать фон). Центрируем BD относительно флешки чтобы были выступы по бокам. Теперь заливаем центральную часть BD (та что видна в данный момент) фоном. При движении персонажа вправо/влево, фон движется и мы заполняем пустую часть рисунком. Когда BD двигаться уже некуда, переносим видимую часть фона в начало или конец BD (смотря в какую сторону двигались), а саму BD смещаем на такое же расстояние в другую сторону.
Надеюсь разберётесь, хотя это довольно сложно, гораздо проще сделать безшовную текстуру. Задача как раз пойти по пути наименьшего сопротивления.
Супер! У меня тут затруднения возникли, фон 3000х4500 пикселей
если создавать 13-15 тыс объектов, то это все очень долго загружается да и выглядит как-то плохо…
с 1300 на 300х450 все выглядит супер, но мне нужно 3000х4500, как это сделать?
дублирование растра ничего не дало…
DarkSnow - ого! такой большой фон
Могу предложить объединить объекты в “группы”, то есть уже заранее сделать группу скажем цветов - 300 на 450 и ее разбрасывать - тогда можно снизить число объектов с 13000 скажем до 1300.
animefish
а это идея кстати спасибо!а прогрмано можно как-нибудь объединять в группы?
З.Ы. а вы для vkontakte приложение не пишите?там прост раскручивать их несложо, да и апи легко выучить
DarkSnow - можно программно объединять в группы, нужно создать новый клип (программно) и в нем создать фрагмент, потом уже этот клип размножить.Вконтакте - да работаю в этом направлении
Спасибо, очень интересный блог. Много полезных хитростей.
Очень все хороше здесь )), понравилось, вам пора на AS3 переходить
Переходим
Неплохо, даже здорово. Жаль что duplicateMovieClip, не работает с loadmove а так бы можно было бы генерить различных фон не прошитый в основном ролике.
[…] Хitri рассказал про скроллинг, динамические фоны и простой движок для флеш […]
Очень интересно, и довольно просто, спасибо за ценный совет!=)
Спасибо. И мне пригодилось и студенты порадовались :-). Хороший урок. Правда с растеризацией не все получилось