PDA

Просмотр полной версии : Неравномерное вращение....


repz
12.10.2006, 12:45
Сделал глобус, но вращение получается не равномерным сначала медленно потом оч. быстро и снова медленно......пробовал увеличить кол-во кадров вроде равномерно получается, но тогда видно , как подергивает картинку при переходе, может програмно можно сделать как-нить?

Хемуль
12.10.2006, 12:48
2 repz:
Исходник можно?

repz
12.10.2006, 12:50
Оч много весит могу частями.....

repz
12.10.2006, 15:27
Кто-нить подскажите как програмно цеплять до маски и удалять после?

Хемуль
12.10.2006, 15:30
2 repz:
До и после? Маску можно назначить для мувиклипа...

repz
12.10.2006, 15:58
2 Хемуль:
Можно, но как програмно подцепить клип, а потом удалить, что бы задержки и поддергивания картинки не было?

Хемуль
12.10.2006, 16:06
2 repz:
У вас изменение скорости происодит потому, что вы сами такой мувиклип сделали. Если бы анимация была программной, такого бы очно не было.
Чтобы прицепить мувиклип, используйте attachMovie, чтобы удалить - removeMovieClip. Клип с картой цепляйте к какому-нибудь клипу контейнеру, на который наложена круглая маска.

repz
12.10.2006, 16:30
Спасиб, а если маленький примерчик? Буду благодарен....

Хемуль
12.10.2006, 16:35
2 repz:
Я бы вам и ваш пример сделал, но позже...

repz
12.10.2006, 16:38
Спасибоооо.....

D12
13.10.2006, 00:50
2repz =)
Держи свой глобус : ) звезды рисовать будем ? :)


Читай внимательно :
_root.planeta._x = 324;
_root.planeta._y = 108;
в этих строчках находятся координаты расположения основного ролика на сцене , меняеш их меняешь расположение твоей планеты на сцене , другое ничего нетрогай =)

далее :
this.moves.bmp0._x -= 1;
this.moves.bmp1._x -= 1;
здесь задаем скорость вращения , еденичка и есть параметр скорости , можеш поставить другую скорость какая наиболее приемлима для твоего проекта , ах вот еще у обоих роликов скорость должна быть одинакова .

Удачи , если что спрашивай =)



P.S.
Квейк 4 =)

import flash.display.*;
////
this.createEmptyMovieClip("planeta", this.getNextHighestDepth());
this.planeta.createEmptyMovieClip("moves", this.getNextHighestDepth());
//
for (var i:Number = 0; i<=1; i++) {
this.planeta.moves.createEmptyMovieClip("bmp"+i, i);
var myBitmapData:BitmapData = BitmapData.loadBitmap("pic");
this.planeta.moves["bmp"+i].attachBitmap(myBitmapData, i);
this.planeta.moves["bmp"+i]._width = 432;
this.planeta.moves["bmp"+i]._height = 216;
}
this.planeta.moves.bmp0._x = -216;
this.planeta.moves.bmp0._y = -108;
//
this.planeta.moves.bmp1._x = 216;
this.planeta.moves.bmp1._y = -108;
////
this.planeta.attachMovie("mask", "mask1", 2, {_x:216, _y:216});
this.planeta.mask1._width = this.planeta.mask1._height=216;
this.planeta.mask1._x = -108;
this.planeta.mask1._y = 0;
this.planeta.moves.setMask(this.planeta.mask1);
//
_root.planeta._x = 324;
_root.planeta._y = 108;
////
this.planeta.onEnterFrame = function() {
this.moves.bmp0._x -= 1;
this.moves.bmp1._x -= 1;
if (this.moves.bmp0._x<=-648) {
this.moves.bmp0._x = 216;
}
if (this.moves.bmp1._x<=-648) {
this.moves.bmp1._x = 216;
}
};

Хемуль
13.10.2006, 02:25
2 repz:
Я немного переделал вашу флешку. Посмотрите, что у вас в библиотеке.
Сделал так, что карта масштабируется по размеру круглой маски.
Код:

var mainContainerClipName:String = "map";
var mapContainerClipName:String = "mapContainer";
var mapMaskClipName:String = "mask";
var mapClipBaseName:String = "map";
var left:Number = 100;
var top:Number = 100;
var speed:Number = -1;
var mapCounter:Number = 0;

var mainContainerClip:MovieClip = this.createEmptyMovieClip(mainContainerClipName, this.getNextHighestDepth());
var mapContainerClip:MovieClip = mainContainerClip.createEmptyMovieClip(mapContainerClipName, mainContainerClip.getNextHighestDepth());
var mapMaskClip:MovieClip = mainContainerClip.attachMovie("mapMask", mapMaskClipName, mainContainerClip.getNextHighestDepth());
mapContainerClip.setMask(mapMaskClip);
addNewMap(0);

function addNewMap(newMapX:Number)
{
var mapClipName:String = mapClipBaseName + mapCounter;
var mapClip:MovieClip = mapContainerClip.attachMovie("map", mapClipName, mapContainerClip.getNextHighestDepth(), {_x:newMapX});
var mapScale:Number = (mapMaskClip._height / mapClip._height) * 100;
mapClip._xscale = mapScale;
mapClip._yscale = mapScale;
mapClip.id = mapCounter;
mapClip.onEnterFrame = function()
{
this._x += speed;
if (this._x + this._width < this._parent._parent[mapMaskClipName]._width && this._parent[mapClipBaseName + (this.id + 1)] == undefined)
{
addNewMap(this._x + this._width);
}
if (this._x + this._width < 0)
{
this.removeMovieClip();
}
};
mapCounter++;
}

Исходник прикрепляю...

repz
16.10.2006, 12:30
Хемуль, D12 спасибо огромное с кодом вроде чуть разобрался, но вот вопрос, размер маски уменьшил например до 94*94, а вот картинку как подогнать не наю, не получается все съезжает?
this.planeta.attachMovie("mask", "mask1", 2, {_x:94, _y:94});
this.planeta.mask1._width = this.planeta.mask1._height=94;
this.planeta.mask1._x = -108;
this.planeta.mask1._y = 0;
this.planeta.moves.setMask(this.planeta.mask1);
это у D12,
Хемуль, а как у тя изменить положение на сцене?
Так:
_root.map._x = 200;
_root.map._y = 50;

Хемуль
16.10.2006, 13:30
В моём примере положение и размеры изменяются достаточно просто. Жирным выделено то, что изменилось:

var mainContainerClipName:String = "map";
var mapContainerClipName:String = "mapContainer";
var mapMaskClipName:String = "mask";
var mapClipBaseName:String = "map";
var mainContainerLeft:Number = 100;
var mainContainerTop:Number = 100;
var mainContainerWidth:Number = 94;
var mainContainerHeight:Number = 94;
var speed:Number = -1;
var mapCounter:Number = 0;

var mainContainerClip:MovieClip = this.createEmptyMovieClip(mainContainerClipName, this.getNextHighestDepth());
var mapContainerClip:MovieClip = mainContainerClip.createEmptyMovieClip(mapContainerClipName, mainContainerClip.getNextHighestDepth());
var mapMaskClip:MovieClip = mainContainerClip.attachMovie("mapMask", mapMaskClipName, mainContainerClip.getNextHighestDepth());
mainContainerClip._x = mainContainerLeft;
mainContainerClip._y = mainContainerTop;
mainContainerClip._width = mainContainerWidth;
mainContainerClip._height = mainContainerHeight;
mapContainerClip.setMask(mapMaskClip);
addNewMap(0);

function addNewMap(newMapX:Number)
{
var mapClipName:String = mapClipBaseName + mapCounter;
var mapClip:MovieClip = mapContainerClip.attachMovie("map", mapClipName, mapContainerClip.getNextHighestDepth(), {_x:newMapX});
var mapScale:Number = (mapMaskClip._height / mapClip._height) * 100;
mapClip._xscale = mapScale;
mapClip._yscale = mapScale;
mapClip.id = mapCounter;
mapClip.onEnterFrame = function()
{
this._x += speed;
if (this._x + this._width < this._parent._parent[mapMaskClipName]._width && this._parent[mapClipBaseName + (this.id + 1)] == undefined)
{
addNewMap(this._x + this._width);
}
if (this._x + this._width < 0)
{
this.removeMovieClip();
}
};
mapCounter++;
}

Переменные mainContainerLeft, mainContainerTop, mainContainerWidth, mainContainerHeight задают положение верхнего левого угла контейнера (прямоугольника, в который вписана планета по сути), его ширину и высоту.
Но учтите, что у вас карта - большая картинка при уменьшении и движении она "серебрится". Поэтому, если необходимо использовать только маленькую такую маленькую планету, уменьшите лучше ещё кратинку в библиотеке.

repz
16.10.2006, 13:36
Ок спасибо, понял. Вот снова проблем этот код не работает из под цикла, т.е. что-то там if { далее код...... - не работает! Возможна ли обработка в цикле этого кода вообще?

Хемуль
16.10.2006, 13:54
2 repz:
В цикле нет. Извините, можете подробнее о своей задаче? Зачем вам эти проверки и циклы? Может я вам подскажу более рациональное решение в рамках готового...

repz
16.10.2006, 14:29
У мя по задумке два шарика (глобуса) один ночной другой утренний, как бы, потом идет проверка на время и в зависимости от этого показывается один или другой.
P.S. Если сделать из глобуса mc то все заработает? по идее.
P.S. Ну да так и есть в мувик загнать, а потом через визибл настроить :-)))) или есть еще варианты??

Хемуль
16.10.2006, 15:19
2 repz:
А чем "ночной" глобус отличается от дневного?

PS:
Прокручивающаяся карта, и круглая маска для неё и так находятся в мувиклипе, ссылка на который хранится в переменной mainContainerClip.
То есть, смотрите, как всё работает. Есть один общий мувиклип-контейнер. Его координаты и размеры определяют размеры глобуса. Внутри этого главного контейнера есть два мувиклипа - контейнер для прокручивающейся карты и маска для него. Внутри мувиклипа-контейнера для карт двигаются прикреплённые из библиотеки мувиклипы карт. ^_^

repz
16.10.2006, 15:41
С этим разобрался, но время то как определять в любом случае через цикл.

Хемуль
16.10.2006, 16:06
2 repz:
Вот по поводу определения времени суток:
http://flasher.ru/forum/showthread.php?t=86278
Осталось только изменить что-то в глобусе.
Так всё же, чем "ночной" глобус отличается от дневного?

repz
16.10.2006, 17:03
Спасибо за линк на мой вопрос :-)))))
Изменилась картинка - она другая просто, но терь вопрос другой, индефикатор map - уникальный и если поменять на map1 скажем, то работать не буит все равно, что сделать нужно, т.е. создаем два мувика с разными картинками (1.jpg, 2.jpg), маской (mask), и картой map (map, map1), но не работает.

Хемуль
16.10.2006, 17:28
2 repz:
Создаём два мувиклипа в библиотеке - в каждом свой рисунок карты. Назначаем им разные идентификаторы в библиотеке и вытягиваем ту карту, которая нам нужна.

repz
16.10.2006, 17:36
В том-то и дело, что
**Warning** The linkage identifier 'map' was already assigned to the symbol 'map2', and cannot be assigned to the symbol 'map', since linkage identifiers must be unique. ругается на "map"

Хемуль
16.10.2006, 18:06
2 repz:
Ну так сделайте два уникальных linkage identifier'а для двух мтиволов в библиотеке: для дневного и ночного глобуса.
То есть, символ дневного глобуса, например, пусть имеет linkage identifier "map1",а ночной - "map2"...

repz
16.10.2006, 19:22
2 Хемуль:
Так сделал не работает.. есть map и map2 в скрипте соответственно меняю
var mainContainerClipName:String = "map2";
var mapContainerClipName:String = "mapContainer";
var mapMaskClipName:String = "mask";
var mapClipBaseName:String = "map2";
Битый час бьюсь не могу понять почему

P.S. Заработалоо о о о о................
Хемуль- -огромное спасибо

Хемуль
16.10.2006, 19:47
2 repz:
ПРиведите, пожалуйста участок кода... Я, наверное, домой приду и вечером постараюсь сделать вам этот пример. Вы вот только скажите, как надо сделать: чтобы проверка на время происходила только при загрузке флешки на странице или даже тогда, когда уже флешка загружена? То есть, пользователь загружает страницу с флешкой, сидит и не перезагружает её 5 часов, например. И в это время начинается "ночь", флешка меняется без перезагрузки?

repz
16.10.2006, 20:13
Если возможно сделать так что бы даже без перезагрузки флеш менялся, то буду оч благодарен.
day_mc._visible=false;
ni_mc._visible=false;
time = new Date();
time_th = time.getHours();
if (time_th >= 4 && time_th <= 18)
{
day_mc._visible = true;
} else {
ni_mc._visible = true;
day_mc._visible = false;
}

D12
16.10.2006, 21:12
Давай сюда свою ночную картинку =) сделаем ее с часами : )

repz
16.10.2006, 21:17
2 D12:
Так выше постом все изложенно ж :-))) работает все нормально, но для изменения с 1 глобуса на другой, если время подошло нужно перезагружать страницу, Хемуль говорит, что можно без перезагрузки сделать, а так код выше работает...

D12
16.10.2006, 21:50
Хемуль говорит, что можно без перезагрузки
Нагло обманывет ...........

Делаешь скрипт с часами и в зависимости какое время они показывают в условии меняешь картинку ...
Таких примеров сотни , мода сейчас пошла на время суток =)

D12
16.10.2006, 21:53
посмотри (http://www.flasher.ru/forum/showthread.php?t=82910&highlight=%F7%E0%F1%FB)

=)

D12
16.10.2006, 22:00
http://www.flasher.ru/forum/showthread.php?t=81551&highlight=%F7%E0%F1%FB

repz
16.10.2006, 22:10
Это да, хотя раньше тоже вроде была, приветствия там от времени суток, кода еще на хтмл баловался, насчет Хемуля поморим может и можно, даже наверняка можно перегружать мувик со скриптом например соответственно он новые вводные получает через setinterval например, я так думаю.

P.S. ссори не заметил ссылок (там как раз про интервал)

Хемуль
17.10.2006, 03:03
2 repz:
Новый код:

var mainContainerClipName:String = "map";
var mapContainerClipName:String = "mapContainer";
var mapMaskClipName:String = "mask";
var mapClipBaseName:String = "map";
var dayMapId:String = "map1";
var nightMapId:String = "map2";
var mainContainerLeft:Number = 100;
var mainContainerTop:Number = 100;
var mainContainerWidth:Number = 94;
var mainContainerHeight:Number = 94;
var speed:Number = -1;
var nightBeginHour:Number = 22;
var nightEndHour:Number = 5
var mapCounter:Number = 0;
var currentMapId:String = getNewMapId();

var mainContainerClip:MovieClip = this.createEmptyMovieClip(mainContainerClipName, this.getNextHighestDepth());
var mapContainerClip:MovieClip = mainContainerClip.createEmptyMovieClip(mapContainerClipName, mainContainerClip.getNextHighestDepth());
var mapMaskClip:MovieClip = mainContainerClip.attachMovie("mapMask", mapMaskClipName, mainContainerClip.getNextHighestDepth());
mainContainerClip._x = mainContainerLeft;
mainContainerClip._y = mainContainerTop;
mainContainerClip._width = mainContainerWidth;
mainContainerClip._height = mainContainerHeight;
mapContainerClip.setMask(mapMaskClip);
addNewMap(0);
var timer:Number = setInterval(this, "checkTime", 1000);

function addNewMap(newMapX:Number)
{
var mapClipName:String = mapClipBaseName + mapCounter;
var mapClip:MovieClip = mapContainerClip.attachMovie(currentMapId, mapClipName, mapContainerClip.getNextHighestDepth(), {_x:newMapX});
var mapScale:Number = (mapMaskClip._height / mapClip._height) * 100;
mapClip._xscale = mapScale;
mapClip._yscale = mapScale;
mapClip.id = mapCounter;
mapClip.onEnterFrame = function()
{
this._x += speed;
if (this._x + this._width < this._parent._parent[mapMaskClipName]._width && this._parent[mapClipBaseName + (this.id + 1)] == undefined)
{
addNewMap(this._x + this._width);
}
if (this._x + this._width < 0)
{
this.removeMovieClip();
}
};
mapCounter++;
}

function getNewMapId():String
{
var myDate:Date = new Date();
if ((myDate.getHours() < nightEndHour) || (myDate.getHours() >= nightBeginHour))
{
return nightMapId;
}
else
{
return dayMapId;
}
}

function checkTime()
{
var newMapId:String = getNewMapId();
if (currentMapId != newMapId)
{
var currentMapClipName:String = mapClipBaseName + (mapCounter - 1);
var previousMapClipName:String = mapClipBaseName + (mapCounter - 2);
var currentMapClip:MovieClip = mapContainerClip[currentMapClipName];
var previousMapClip:MovieClip = mapContainerClip[previousMapClipName];
var currentMapClipX:Number = currentMapClip._x;
var previousMapClipX:Number = previousMapClip._x;
currentMapId = newMapId;
if (previousMapClip != undefined)
{
previousMapClip.removeMovieClip();
addNewMap(previousMapClipX);
}
currentMapClip.removeMovieClip();
addNewMap(currentMapClipX);
}
}

Задаётся начальный час ночи и час, который уже с утра ночью не является (конец ночи). При загрузке флешки ставится необходимая карта и каждую секунду производится проверка времени. Если меняется время суток (ночь/день), текущие полоски карт удаляются, а на их место ставятся "противоположные".
Обязательно посмотрите новую флешку, которую я прикрепляю. Я в библиотеке уменьшил картинку, чтобы она меньше занимала. Если будут вопросы, пишите.
И ещё удалите строку trace(newMapX); из кода флешки. Она там не нужна. Я просто забыл удалить,а перезакачивать архивы лень. ^_^

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

repz
17.10.2006, 11:31
2 Хемуль:
Разбираюсь......, что не пойму спрошу!
P.S. Спасиб

repz
17.10.2006, 17:51
2 Хемуль:
Что т не пойму где идет проверка через интервал? видимо здесь:
var timer:Number = setInterval(this, "checkTime", 1000);, но как ее прикрутит вот сюда:
var nightBeginHour:Number = 22;
var nightEndHour:Number = 5;
day_mc._visible = false;
ni_mc._visible = false;
var myDate:Date = new Date();
if ((myDate.getHours() < nightEndHour) || (myDate.getHours() >= nightBeginHour))
{
ni_mc._visible = true;

}
else
{
day_mc._visible = true;
}

Хемуль
17.10.2006, 18:02
2 repz:
А зачем её туда прикручивать? Тот скрипт, который я вам выше привёл, производит проверку на время и меняет карты. То есть, больше никаких проверок не надо. Я поставил такие настройки, что ночь начинается в 22 часа и заканчивается в 5. Вот запустите эту флешку и попробуйте системное время поменять в операционной системе. Поставьте сперва, например, 21 час, а потом 22. Увидите, как меняется глобус в реальном времени...

repz
17.10.2006, 18:19
2 Хемуль
Да нет же, с той флешкой я разобрался, что да как просто хочу попрактиковаться немного и понять как что по отдельности использовать или по другому не так как я раньше делал. Вот и спрашиваю из Вашего же примера как туда прикрутить проверку через интервал?

Хемуль
17.10.2006, 18:29
Я на интервал повесил функцию checkTime. Вот её начало:

function checkTime()
{
var newMapId:String = getNewMapId();
if (currentMapId != newMapId)

То есть, мы в переменную newMapId заносим результат функции getNewMapId(), которая и производит проверку на часы. Потом в теле checkTime() идёт проверка, которая проверяет, изменилась ли требуемая карта. Таким образом отлавливается момент перехода через часовой барьер ночи.
Сама же функция проверки и выбора необходимого linkage Id'а библиотеки для мувиклипа карты выглядит так:

function getNewMapId():String
{
var myDate:Date = new Date();
if ((myDate.getHours() < nightEndHour) || (myDate.getHours() >= nightBeginHour))
{
return nightMapId;
}
else
{
return dayMapId;
}
}

repz
17.10.2006, 18:42
2 Хемуль:
Спсб, буду пробовать.