PDA

Просмотр полной версии : Автоматическое проигрывание клипа.


Olejan
23.04.2006, 03:08
Задача у меня не простая!
Имеются 8 кнопок, при нажатии на которые происходит перемещение в таймлайне (каждой кнопке - свой кадр, допустим). Кнопки имеют анимацию на втором кадре (при наведении). Надо сделать так, чтобы автоматически как бы они "нажимались" в произвольном порядке, соответственно происходили все сопутствующие действия, то есть кадр кнопки становился 2-м, ролик переходил на соответствующий данной кнопке кадр.
Причем, после того, как курсор окажется в определенном месте сцены - это автоматическое проигрывание останавливалось, при убирании курсора с того места - опять продолжалось. И еще: при нажатии на любую из кнопок, попадаешь на соответствующий кадр, и после прошествия, ну скажем, 20 секунд, (если при этом курсор находится не на том определенном месте на котором автоматическое проигрывание останавливливается) опять начинается хаотичное автоматическое проигрывание ролика.

Фух... Такого не где не встречал! Помогите, пожалуйста...

Olejan
23.04.2006, 03:12
Христос Воскресье!
Помогите, пожалуйста... :)
P.S. прошу не отвечать по такому удобному случаю: "Бог - помощь!" :)
P.P.S. Я бы может так и ответил бы... :) Просто случай очень подходящий - пасха же...
P.P.P.S. И про то, что в воскресенье ничего нельзя делать - тоже прошу не упоминать!
Надеюсь на человечность!

Madasan
23.04.2006, 06:12
Кнопки сами нажиматься не могут, поэтому надо в качестве кнопок использовать клипы попробуй сделать так. В библиотеке один клип, имеющий как минимум три кадра, с метками over , down и out, и stop() в кадре out, чтобы клипы не проигрывались, Также в библиотеке должон быть клип с нарисованной нужной областью, в основной временной шкале должен быть ОДИН кадр куда надо поместить клип с кадрами,что будут сменяться при нажатии кнопок, и вот этот код:var wdth = 100;//ширина клипа кнопки в пикселах
var yCoor= 50;//y координата ряда с кнопками
var numbr=8; //количество кнопок и кадров
var Interv=500;//интервал смены кадров в миллисек
var zader=20000;//задержка скажем в 20 сек
//---------------------------------------------
var rolik=_root.someClip;
//ролик с n кадрами(по кол-ву кнопок)
//которые должны сменяться
//в соответсвии с нажатой кнопкой
//---------------------------------------------
var hit='oblast';//идентификатор клипа (в библиотеке),
//содержащего область, попадя на которую,
//автоматическое проигрывание
//прекращается.
//---------------------------------------------
var xHit=0;
var yHit=0;//координаты клипа области
//---------------------------------------------
var button='clip_knopka';//идентификатор клипа-кнопки
//(в библиотеке)
//---------------------------------------------
function over() {
this.gotoAndStop('over');
}
function out() {
this.gotoAndStop('out');
}
function down() {
this.gotoAndStop('down');
var c=this._parent;
c.flag=false;
c.rolik.gotoAndStop(this.i);
c.Int=setInterval(c.zaderFunc,50,getTimer()+c.zader);

}
function zaderFunc(startTime){
if(startTime<getTimer()){
flag=true;
clearInterval(Int);

}
}
var c,rand,lastB;
for (var i = 0; i<numbr; i++) {
attachMovie(button, 'b_'+i, i, {_x:i*wdth,_y:yCoor});
c = this['b_'+i];
с.i=i;
c.onPress = down;
c.onRollOut = clip_knopka.onReleaseOutside=out;
c.onRollOver = clip_knopka.onRelease=out;
}
attachMovie(hit,hit,this.getNextHighestDepth(),{_x:xHit,_y:yHit,_alpha:1});
nextStep=getTimer();
var flag=true;
this.onEnterFrame=function(){
if (!this[hit].hitTest(_xmouse,_ymouse,true)&&(nextStep<getTimer())&&flag){
nextStep=getTimer()+Interv;;
rand=random(numbr);
trace(rand);
rolik.gotoAndStop(rand);
lastB.gotoAndStop('out');
this['b_'+rand].gotoAndStop('down');
lastB=this['b_'+rand];
}
}

Olejan
23.04.2006, 12:51
var wdth = 100;//ширина клипа кнопки в пикселах
var yCoor= 50;//y координата ряда с кнопкамиvar numbr=9; //количество кнопок и кадров
var Interv=500;//интервал смены кадров в миллисек
var zader=20000;//задержка скажем в 20 сек
//---------------------------------------------
var rolik=_root.someClip;
//ролик с n кадрами(по кол-ву кнопок)
//которые должны сменяться
//в соответсвии с нажатой кнопкой
//---------------------------------------------
var hit='oblast';//идентификатор клипа (в библиотеке),
//содержащего область, попадя на которую,
//автоматическое проигрывание
//прекращается.
//---------------------------------------------
var xHit=0;
var yHit=0;//координаты клипа области//---------------------------------------------
var button='clip_knopka';//идентификатор клипа-кнопки
//(в библиотеке)
//---------------------------------------------
function over() {
this.gotoAndStop('over');
}
function out() {
this.gotoAndStop('out');
}
function down() {
this.gotoAndStop('down');
var c=this._parent;
c.flag=false;
c.rolik.gotoAndStop(this.i);
c.Int=setInterval(c.zaderFunc,50,getTimer()+c.zader);

}
function zaderFunc(startTime){
if(startTime<getTimer()){
flag=true;
clearInterval(Int);

}
}
var c,rand,lastB;
for (var i = 1; i<numbr; i++) {
attachMovie(button, 'b_'+i, i, {_x:i*wdth,_y:yCoor});
c = this['b_'+i];
с.i=i;
c.onPress = down;
c.onRollOut = clip_knopka.onReleaseOutside=out;
c.onRollOver = clip_knopka.onRelease=over;
}
attachMovie(hit,hit,this.getNextHighestDepth(),{_x:xHit,_y:yHit,_alpha:1});
nextStep=getTimer();
var flag=true;
this.onEnterFrame=function(){
if (!this[hit].hitTest(_xmouse,_ymouse,true)&&(nextStep<getTimer())&&flag){
nextStep=getTimer()+Interv;;
rand=random(numbr);
trace(rand);
rolik.gotoAndStop(rand);
lastB.gotoAndStop('out');
this['b_'+rand].gotoAndStop('down');
lastB=this['b_'+rand];
}
}

Пояснения по цветам:
1. Желтым выделено то, в чем так я не смог разобраться;
2. Красным - то, что переделал;

Кроме того:
На нажатия на кнопки, мувик someClip не реагирует. Не понимаю почему...

Прилагается мой FLA-файл.

Madasan
23.04.2006, 13:20
Если твои кнопки располагаются вряд по горизонтали, то
wdth - это шаг, промежуток через который будут выстраиваться твои кнопки, соответственно - это ширина клипа-кнопки, плюс промежуток между двумя кнопками(если надо) , а yCoor - это вертикальная координата ряда с кнопками.
Чтобы определить область, наводя на которую курсор, кадры перестают нажиматься, надо нарисовать эту область (форма с заливкой) и преобразовать в клип, а в свойствах этого клипа (в библиотеке) надо присвоить идентификатор oblast. Так же и с кнопками, в этом примере кнопка одна, она не помещается на сцену вручную, а вызывается из библиотеки, при помощи attachMovie, соответственно одна должна иметь идентификатор (Export for action script), в данном случае это clip_knopka. Клип область так же не помещается на сцену вручную а тоже вызывается из библиотеки на сцену в точку с координатами:
var xHit=0;
var yHit=0;
Это типа пример, и можешь изменять все как тебе необходимо, и при этом отвечать на вопросы о корректности работы скрипта старайся себе сам ;)

Madasan
23.04.2006, 13:30
На нажатия на кнопки, мувик someClip не реагирует. Не понимаю почему...
Проверь, присвоено ли имя someClip в панели свойств у твоего мувика, он в отличии от остальных клипов должен помещаться на сцену вручную, хотя можно его так же вызвать при помощи attachMovie, но тогда сразу после вызова нужно присвоить ссылку на него нужной переменной rolik=someClip.
И вот еще ошибку нашел, вместо rand=random(numbr) нужно написать rand=random(numbr) +1. (разберись почему :away: )

Olejan
23.04.2006, 13:50
Спасибо (особенно на счет идентификаторов в библиотеке - не знал об этом!), просто, (моя ошибка, что не уточнил!) я кнопки и область должен вручную расставлять на определенные места в ролике, а не программно. И они должы при нажатии обрабатывать соответствующие события (переход на соотв. кадр в клипе someClip).
Прото область будет не простой формы и кнопки располагаться особо.

Если не сложно, поправьте код, НО! В любом случае - БОЛЬШОЕ ВАМ СПАСИБО!

Olejan
23.04.2006, 18:06
Что-то ничего не получается!!! :(
Кнопки (мувики с тремя кадрами) получились нереагирующими на нажатия. То есть не получается сделать так чтобы, кроме автоматического проигрывания ролика, еще и нажимались кнопки, при этом бы в мувике someClip переходил бы на соответствующие кадры.
Как это сделать без attachMovie?
Прилагаю версию того, что я наделал! (там непосредственно кнопкам пытался приделать on (release) {someClip.gotoAndStop(1);} - это например первой кнопке)

Помогите, пожалуйста!

Madasan
23.04.2006, 18:44
Вот образец для 1 кнопки, для остальных и проделаешь сам, раз решил делать в ручную, а не доверить рутинную процедуру компьютеру, да и функций у тебя получиться 9 а не одна! То есть если кнопок было бы 100 то размер ролика будет заметно больше чем мог бы быть.:mosking:

Olejan
24.04.2006, 16:56
Приделал ко всем кнопкам.
Теперь все нажимается и обрабатывается, НО! есть один ньюанс:
когда первый раз нажимаешь любую кнопку (хоть сколько кнопок) до первой паузы в 20 сек все нормально (пауза после нажатия кнопки - действительно 20 сек), но как только первые 20 секунд задежки после нажатия на кнопку истекли, и опять начинается автоматический проигрыш с интервалом 5 секунд, то после следующего нажатия на любую кнопку - интервал только 5 секунд, то есть нет необходимой паузы в 20 сек после нажатия кнопки.
И еще мувик с именем oblast я выложил на сцену (серый прямоугольник), но в коде его функцию не нашел (при наведении на него должен прекращаться автоматический проигрыш, после того, как с него курсор убран - через 20 секунд автоматический проигрыш опять начинается).
Прилагаю последнюю версию файла.
Помогите, пожалуйста...

Madasan
24.04.2006, 18:09
:wacko: :wacko: :wacko:
Это типа пример, и можешь изменять все как тебе необходимо, и при этом отвечать на вопросы о корректности работы скрипта старайся себе сам ;)

Olejan
24.04.2006, 18:27
Это просьба с моей стороны, а не критика. :)

Madasan
24.04.2006, 19:06
Это просьба с моей стороны, а не критика. :)
Да это понятно, только слишком много просьб, итак все за тебя сделали, надо и самому постараться;)

Olejan
24.04.2006, 19:38
Ну как же oblast будет работать, если она в коде совсем не значится? Не могу понять - хоть убей! Да и с интервалами времени - смотрю то, что ты к кнопке прикрутил и что я размножил - вроде все нормально...
Почему тогда первый раз 20 секунд, а топом по 5?

Madasan
24.04.2006, 20:52
var hit='oblast' Вот тут мы присваиваем переменной идентификатор, под которым клип значиться в библиотеке(не имя, а идентификатор в графе Export for Action Script)

attachMovie(hit,hit,this.getNextHighestDepth(),{_x:xHit,_y:yHit,_alpha:1});А это мы помещаем этот мувик на сцену, в точку с координатами:xHit и yHit, и делаем его прозрачным (_alpha:1 - если не нужно делать прозрачным то это можно убрать)

this[hit].hitTest(_xmouse,_ymouse,true)А эта строчка проверяет, не находиться ли курсор мыши над областью клипа. Если находиться то возвращается truе, если нет, то false, знак '!' меняет возвращаемое значение на противоположное.
Но если обязательно надо помещать эту область на сцену вручную, то поместив его на сцену, в свойствах клипа надо присвоить ему имя, и обращаться к нему по имени, то есть вместо this[hit] надо писать имя клипа. Все просто. :)

Olejan
24.04.2006, 21:14
НИЧЕГО не пойму. Вот весь код:
var numbr=9; //количество кнопок и кадров
var Interv=1000;//интервал смены кадров в миллисек
var zader=50000;//задержка скажем в 20 сек
//---------------------------------------------
var rolik=someClip;
//ролик с n кадрами(по кол-ву кнопок)
//которые должны сменяться
//в соответсвии с нажатой кнопкой
//---------------------------------------------
var oblast;
var button;
//---------------------------------------------
function over() {
this.gotoAndStop('over');
}
function out() {
this.gotoAndStop('out');
}
function down() {
this.gotoAndStop('down');
var c=this._parent;
c.flag=false;
c.rolik.gotoAndStop(this.i);
c.Int=setInterval(c.zaderFunc,50,getTimer()+c.zader);

}
function zaderFunc(startTime){
if(startTime<getTimer()){
flag=true;
clearInterval(Int);

}
}
var c,rand,lastB;
for (var i = 1; i<numbr; i++) {
c = this['b_'+i];
с.i=i;
c.onRollOut = clip_knopka.onReleaseOutside=out;
c.onRollOver = clip_knopka.onRelease=over;
}
nextStep=getTimer();
var flag=true;
this.onEnterFrame=function(){
if (!this[hit].hitTest(_xmouse,_ymouse,true)&&(nextStep<getTimer())&&flag){
nextStep=getTimer()+Interv;;
rand=random(numbr-1)+1;
trace(rand);
rolik.gotoAndStop(rand);
lastB.gotoAndStop('out');
this['b_'+rand].gotoAndStop('down');
lastB=this['b_'+rand];
}
}

function proveka_oblasty () {
oblast.hitTest(_xmouse,_ymouse,true);
if (oblast.hitTest=true) {
c.Int=setInterval(c.zaderFunc,50,getTimer()+c.zader);
}
}
Функцмя proveka_oblasty - это то, что я последнее добавил. Что не так?

Olejan
24.04.2006, 22:49
Madasan, ну подскажи, сил моих больше нет... :(
ПЛИЗЗЗ!!!

Olejan
24.04.2006, 23:36
Madasan, MADASAN!!!
ПЛИЗЗЗ!!! ПОДСКАЖИ!!!
ААААААААААААААААА!

почти сошел с ума...:wacko:

дядя Джо
25.04.2006, 00:05
Товарищ, чем тратить время на бессмысленные посты, лучше откройте и почитайте руководство по Action Script. То, что вы тут написали, говорит о том, что вы не хотите ничего сами изучать, а только приставать ко всем с глупыми вопросами. Прочитайте правила использования метода hitTest и оператора =. И отчитайтесь о проделанной работе! Только после этого будете иметь полное право задавать вопросы на этом форуме!:mad:

Olejan
25.04.2006, 00:22
2 дядя Джо:
Прочитал про метод hitTest и оператор =
Переделал функцию, вот что получилось:
function proveka_oblasty () {
if (oblast.hitTest(_xmouse,_ymouse,true)) {
c.Int=setInterval(c.zaderFunc,50,getTimer()+c.zader);
}
}
Так лучше? :) И что Вы там строго...

дядя Джо
25.04.2006, 00:32
А что вы у меня спрашиваете, я вам не компилятор. Только компилятор сможет вынести окнчательный вердикт. Скомпилированный swf фильм будет вам ответом. А если ваш ответ - это весь отчет о проделанной работе, то могу вам на это следующее - мы в свое время таких отправляли в лагеря, и там они быстро понимали как надо работать!:moder:

Olejan
25.04.2006, 23:47
2 дядя Джо:
Так как сделать чтобы при появлениимыши на области - проигрывание останавливалось, а при убирании - через 20 сек начиналось?

дядя Джо
28.04.2006, 01:42
НАШ ОТВЕТ ЧЕМБЕРЛЕНУ!

function checkCursor(time) {
if (time<getTimer()) {
palayn = true;
}
}
_root.onEnterFrame = function() {
if (clip1_mc.hitTest(_xmouse, _ymouse, true)) {
palayn = false;
quitClip = false;
clip2_mc._alpha = 100;
clearInterval(Intrv);
} else {
if (!quitClip) {
quitClip = true;
Intrv = setInterval(checkCursor, 40, getTimer()+20000);
}
}
if (palayn) {
clip2_mc._alpha = random(100);
}
};
palayn = true;
quitClip = true;
stop();