PDA

Просмотр полной версии : Как сделать background автозаполнение?


mixey_lv
23.06.2005, 22:43
... Т.е. взять маленький кусочек bg и раскопировать его...
Как в ХТМЛе функция?
нашел прототип такой штуки, но не понял как им пользоваться :confused:
/* Stage.tileImage([linkageName], [stageAlignX], [stageAlignY], [alpha], [tileTarget])
--------------------------------------------------------------------------
copyleft 2004 Joseph Balderson Design :: http://www.memoriesofsilence.com
--------------------------------------------------------------------------
Parameters:
[linkageName] = the library linkage name of the mc containing the image to
tile;
[stageAlignX&Y] = configures starting point of tile according to stage vertical
& horizontal alignment: "left", "center", "right"; note this
does not set the Stage.align parameter, merely aligns the tile
according to that alignment.
[alpha] = alpha of the tile image;
[tileTarget] = optional; target clip within which to create the tile (may be a
clip object or a string); note tileTarget must be full path
if clip is not in the same place as function call; if tileTarget
is absent, the tile is created in an empty movie clip below
all author-time content.

Usage:
// Best used with Stage.scaleMode = "noScale" so that the tile fills the browser window;

// creates tile from backgroundTile library mc into an empty clip with a default alpha
// of 100 situated below all author-time content with a stage alignment of dead-centre
Stage.tileImage("backgroundTile", "center", "center");

//... with a stage alignment of left&centre
Stage.scaleMode = "noScale";
Stage.align = "L"; // left centre
Stage.showMenu = false;
// don't show the menu, cause if you zoom you'll never get the stage size
// to normal back unless you reload the page
Stage.tileImage("backgroundTile", "left", "center", 99);

// creates tile from backgroundTile library mc into clip named "background_mc"
Stage.tileImage("backgroundTile", "center", "center", 99, "background_mc");

Note: we don't use 'prototype' when creating the function because Stage is a fixed object
and not a class
*/
Stage.tileImage = function(linkageName, stageAlignX, stageAlignY, alpha, tileTarget) {
// get the Movie size
var stageState = stage.scaleMode; // remember the initial state
stage.scaleMode = "showAll";
var movieW = stage.width;
var movieH = stage.height;
stage.scaleMode = stageState; // return stage to initial scale mode
// set first instance name & depth depending on input params
if (tileTarget == undefined) { // if tileTarget does not exist
_root.createEmptyMovieClip("tileimage_mc", -16384);
// note: depth -16384 is a special level reserved for dynamic content
// that appears beneath all author-time content.
var bgTarget_mc = _root.tileimage_mc;
} else if (typeof tileTarget == "string") { // if tileTarget is a string
var bgTarget_mc = eval("_root."+tileTarget);
} else if (typeof tileTarget == "movieclip") { // if tileTarget is an object
var bgTarget_mc = _root[tileTarget._name];
// Note: we write this instead of _root.tileTarget, in case the user inputs "_root.name",
// which would result in "_root._root.name", crashing the function
} else {
return; // function fails silently
}
// create first instance of image tile clip
var backTile = bgTarget_mc.attachMovie(linkageName, "backTile0", 0);
// get image dimensions from first instance
var tileW = backTile._width;
var tileH = backTile._height;
// initialize grid
var screenW = System.capabilities.screenResolutionX;
var screenH = System.capabilities.screenResolutionY;
var gridW = Math.ceil(screenW/tileW);
var gridH = Math.ceil(screenH/tileH);
var totalSqrs = gridW*gridH;
// Configure starting point of grid
// configure X axis start
if (stageAlignX != undefined && stageAlignX == "left") {
var startX = 0;
} else if (stageAlignX != undefined && stageAlignX == "right") {
var startX = -(screenW-movieW);
} else if (stageAlignX != undefined && stageAlignX == "center") {
var startX = -(screenW/2-movieW/2); //width of actual movie
} else {
return; // function fails silently
}
// configure Y axis start
if (stageAlignY != undefined && stageAlignY == "top") {
var startY = 0;
} else if (stageAlignY != undefined && stageAlignY == "bottom") {
var startY = -(screenH-movieH);
} else if (stageAlignY != undefined && stageAlignY == "center") {
var startY = -(screenH/2-movieH/2); //width of actual movie
} else {
return; // function fails silently
}
// set background clip start position
bgTarget_mc._x = startX;
bgTarget_mc._y = startY;
// set grid alpha
if (alpha != undefined) {
var gridAlpha = alpha;
} else {
var gridAlpha = 100;
}
bgTarget_mc._alpha = gridAlpha;
// tile image
var i;
var k;
var j=1;
for (k=0; k<=gridH; k++) {
for (i=0; i<=gridW; i++) {
j++
var backTile = bgTarget_mc.attachMovie(linkageName, "backTile"+j, j);
backTile._x = tileW*i;
backTile._y = tileH*k;
}
}
};
Помогите советом

silin
24.06.2005, 00:00
все сводится к тиражированию символа из библиотеки в мувик на самом нижнем уровне:
//'s' -linkage identifier мувика в библиотеке
var bg=this.createEmptyMovieClip('bg',-16384).attachMovie('s',0,0);
var w=bg._width,h=bg._height;
var nx=Math.ceil(Stage.width/w),ny=Math.ceil(Stage.height/h);
for(var i=nx*ny;--i;) bg.attachMovie('s',i,i,{_x:(i%nx)*w,_y:Math.floor(i/nx)*h})

Der Grossen
24.06.2005, 13:54
У меня тогда возникает вопрос:
как это тиражирование можно применять вместе с:

//code
function stageResizeHandler() {
...
}
stageListener = {onResize:stageResizeHandler};
Stage.addListener(stageListener);
stageResizeHandler();
//end code

???

бУДУ БЛАГОДАРЕН ЗА ОТВЕТ :))

maler
28.06.2005, 01:34
Stage.scaleMode = "noScale";
Stage.align = "TL";
nb = 0;
/////////////////////////////////////////
_root.onEnterFrame = function(){
swidth = Stage.width
sheight = Stage.height
}

function MyPattern(scrw,scrh,pic,picname)
{
pw = pic._width;
ph = pic._height;
klvoinx = scrw / pw;
klvoiny = scrh /ph;
x = 0; y = 0; i = 0;
pic._x = x;
pic._y = y;
for (y = 0; y <= klvoiny; y++)
{
for (x = 0; x <= klvoinx; x++)
{
i++
tname = picname + i;
duplicateMovieClip(pic, tname, i);
setProperty (tname, _x, x*pw);
setProperty (tname, _y, y*ph);
}
}
}
_root.pqn._x = 0;
_root.pqn._y = 0;
if (nb == 0){
MyPattern(Stage.width,Stage.height,_root.pqn, "pqn");
}
myListener = new Object();
myListener.onResize = function () {
MyPattern(Stage.width,Stage.height,_root.pqn, "pqn");
}
Stage.addListener(myListener);
stop ();


pqn - это имя паттерна
100% работает, но буду рад прочитать замечания, или варианты оптимизации

зы
удачи

зызы
вот теперь бы еще с матрицей разобраться, ваще круто будет :p

Der Grossen
28.06.2005, 11:23
спасибо огромное ~(@._.@)~
покопаюсь, если удастся что-нибудь добавить или оптимизировать - обязательно отпишусь в форум

peace_mc
28.06.2005, 14:48
Если проблема только в создании background'a, можно без as - разбиваешь свой растр break apart и заливаешь им любые площади

maler
29.06.2005, 15:16
Если проблема только в создании background'a, можно без as - разбиваешь свой растр break apart и заливаешь им любые площади

хе, умник.. а если размер окна неизвестен?? что тогда делать будешь?! Предположу, ты зальешь плоскость 50000х50000px.. ;)

mixey_lv
29.06.2005, 23:38
огромное спасибо!
то что надо!

maler
30.06.2005, 13:06
огромное спасибо!
то что надо!

Пожалста!

зы
о копирайтах не забывайте :D

peace_mc
04.07.2005, 13:27
хе, умник.. а если размер окна неизвестен?? что тогда делать будешь?! Предположу, ты зальешь плоскость 50000х50000px.. ;)
Как ты работаешь за монитором с разрешением 50000х50000? Если это бакграунд, который заполняет весь экран и лежит себе спокойно никого не трогает, не масштабируется, зачем изобретать велик? Оптимизация расходов времени штука полезная.

maler
17.07.2005, 20:11
Как ты работаешь за монитором с разрешением 50000х50000? Если это бакграунд, который заполняет весь экран и лежит себе спокойно никого не трогает, не масштабируется, зачем изобретать велик? Оптимизация расходов времени штука полезная.

По твоему скорость загрузки, менее важная штука?! Удач.

amo
28.06.2006, 05:46
Stage.scaleMode = "noScale";
Stage.align = "TL";
nb = 0;
/////////////////////////////////////////
_root.onEnterFrame = function(){
swidth = Stage.width
sheight = Stage.height
}

function MyPattern(scrw,scrh,pic,picname)
{
pw = pic._width;
ph = pic._height;
klvoinx = scrw / pw;
klvoiny = scrh /ph;
x = 0; y = 0; i = 0;
pic._x = x;
pic._y = y;
for (y = 0; y <= klvoiny; y++)
{
for (x = 0; x <= klvoinx; x++)
{
i++
tname = picname + i;
duplicateMovieClip(pic, tname, i);
setProperty (tname, _x, x*pw);
setProperty (tname, _y, y*ph);
}
}
}
_root.pqn._x = 0;
_root.pqn._y = 0;
if (nb == 0){
MyPattern(Stage.width,Stage.height,_root.pqn, "pqn");
}
myListener = new Object();
myListener.onResize = function () {
MyPattern(Stage.width,Stage.height,_root.pqn, "pqn");
}
Stage.addListener(myListener);
stop ();


pqn - это имя паттерна
100% работает, но буду рад прочитать замечания, или варианты оптимизации

зы
удачи

зызы
вот теперь бы еще с матрицей разобраться, ваще круто будет :p

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

iNils
28.06.2006, 11:21
Вам под 8-ой плеер нужно или под более ранние версии?

__i
28.06.2006, 12:53
вариант для ленивых

.....
x = 0; y = 0; i = -1000;
.....

amo
28.06.2006, 14:24
iNils, для 8-ой версии.

__i, нет, не катит такой вариант... тоже самое. видимо я не тот ленивый, для которого этот вариант :)

RandomUser
28.06.2006, 15:49
Если для 8-ки, то читаем хелп про BitmapData & beginBitmapFill...

amo
28.06.2006, 18:43
Если для 8-ки, то читаем хелп про BitmapData & beginBitmapFill...

пасиб, разобрался!

maler
28.06.2006, 22:02
может я не совсем в тему, но что бы аднимы не ругались, что мол поиск рулит итд...
вот этот код, который maler выложил, хороший. только как сделать, что бы этот background оставался на заднем плане, а не поверх всего?

Сохрани файл с бэкграундом отдельно от основного мувика и подгружай его на уровень ниже контента, все (правда код немножко подкорректировать нужно будет, думаю справишься) :).
Удачи :)

RandomUser, этот код был написан под 7-кой

-O-
28.06.2006, 22:44
Вам под 8-ой плеер нужно или под более ранние версии?
Столкнулся с такой же проблемой.
swf затачиваю под 8-й плеер,. С фоном сталкиваюсь впервые.

Значит использую код, который ты написал: пишет, мол "..я завис, отменить выполнение скрипта или нет?"


пасиб, разобрался!
Разобрался - подскажи как!
Ибо многие хотят знать, но стесняются спросить!


Помогите разобраться!:umnik2:

maler
29.06.2006, 02:13
кстати, мне интресно, а как этот код будет под 8-кой компилироваться, напишите кто попробует

пример ниже

-O-
29.06.2006, 11:53
кстати, мне интресно, а как этот код будет под 8-кой компилироваться, напишите кто попробует

пример ниже
Компилится лучше не бывает! Но опять же: при добавлении нового слоя с объектами - они не отображаются! В чем может быть дело?

Изменил значение строки

this.createEmptyMovieClip("bg", -2);
на
this.createEmptyMovieClip("bg", -200000);
и все заработало!



Было бы не плохо, если выложили урок на эту тему, или исходник в FAQ :rtfm:- тема всетаки актуальная.

Заранее спасибо! :quiet:

iNils
29.06.2006, 12:27
Два варианта.

__i
29.06.2006, 12:54
2 -O- и amo, мой первый пример катит, только я забыл про то что на сцене рисуется ручками (привык программно все делать).

глубины во флеше распределяються так :

те что меньше нуля, те принадлежат объектам нарисованым на сцене во самом проекте (фла), начиная с -ххххх (вроде -16ххх) точных цифр не помню.

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

-O-
29.06.2006, 13:31
...что и требовалось доказать :yahoo:

Ув. iNils, можт всетаки добавите в раздел FAQ? (топ всетаки полееезный)

amo
29.06.2006, 23:58
шустро вы тут... =) только хотел исходник кинуть, а тут уже iNils самое то выложил! всем спасибо!

maler
30.06.2006, 00:25
Если вы хотите чтобы у вас мувик созданый программно был глубже то вам естественно нужно поместить его на глубину меньшую чем -ххххх,
что -О- и сделал.
Думал, что ответ и так был всем ясен, похоже что не был.
Я предлагал дублировать в пределах мувика, а не рута, когда говорил о том, что код нужно будет немного поправить.

Похоже теперь тема раскрыта полностью (почти) :)
Есть одно но
Мой код (тот что в начале ветки), был написан около года назад и он имеет одну недоработку, постоянно идет чтение переменных на _root.onEnterFrame. Но после того, как ширина и высота задана, чтение этих параметров нам уже не нужно. Можно просто проверить, если существуют переменные swidth и sheight, то delete this.onEnterFrame; (пробовать не буду, кто захочет, попробуйте этот момент учесть)


А вот этот код свежее :p
написан под 7-кой

Stage.scaleMode = "noScale";
Stage.align = "TL";

function MyPattern(scrw,scrh,pic,picname)
{
pic._x = 0;
pic._y = 0;

pw = pic._width;
ph = pic._height;
klvoinx = (scrw / pw)+1;
klvoiny = (scrh /ph)+1;
x = 0; y = 0; i = 0;
pic._x = x;
pic._y = y;
for (y = 0; y <= klvoiny; y++)
{
for (x = 0; x <= klvoinx; x++)
{
i--
tname = picname + i;
duplicateMovieClip(pic, tname, i);
setProperty (tname, _x, x*pw);
setProperty (tname, _y, y*ph);
}
}
}

/////StageDublicator
/////Случайный выбор заливки :)
var patternname:Array = ["nbg","nbg1"]; //// это имя заливки (мувика)
ind = random(patternname.length) // выбираем из массиво
patname = patternname[ind];
allpname = this[patname];


if (!pat){
MyPattern(Stage.width,Stage.height, allpname, patname);
}
myListener = new Object();
myListener.onResize = function () {
nb = 1;
MyPattern(Stage.width,Stage.height, allpname, patname);
}
Stage.addListener(myListener);
stop ();