PDA

Просмотр полной версии : Различное время начала звука


dimon1408
21.04.2010, 21:23
Здравствуйте!
Делаю флеш-проект часов, с ними должна быть фоновая музыка. Задача - сделать так, чтобы эта музыка запускалась в разное время - допустим, если swf запущен в 18:00:00 то музыка стартует в 00 секунд, в 18:00:21 в 21 секунд и так далее. Пытаюсь сделать, но ничего не получается... Из догадок - поставить sec (переменную текущего времени) как offset, но это не работает. Музыка вызывается так:

onClipEvent (load) {
var mus:Sound = new Sound();
mus.loadSound("ortclock.wav", true);
mus.start(sec, 0);
}

где clip - это видео сзади циферблата.
Что я не так делаю? Большая просьба помочь, заранее спасибо :)

samana
21.04.2010, 21:43
А музыка вообще загружается? Вроде .wav нельзя.

dimon1408
21.04.2010, 21:50
Да, как оказалось .wav нельзя (хоть на оффсайте Adobe было написано, что на винде можно). После конвертации в mp3 звук играется, но всегда с самого начала, а не как надо, так что проблема все равно не решена, но спасибо за наводку.

samana
21.04.2010, 22:13
Не привыкайте писать код в клипах так можно запутаться. Если хотите привязать звук к клипу используйте
var mus:Sound = new Sound(клип);
А то вдруг ваш клип загружается до того как объявлена переменная sec, и конечно ему ничего не передаётся. Надо по больше кода увидеть.

dimon1408
21.04.2010, 22:28
Попробовал, не вышло.
Вот ещё код:
Время получается следующей командой:

this.onEnterFrame = function() {
var time:Date = new Date(); //обновляется постоянно из-за onEnterFrame
//Сохранение текущего времени
var sec = time.getSeconds();
var min = time.getMinutes();
var hour = time.getHours();
//Вращение стрелок
seconds._rotation = sec * 6; // смещение стрелок раз в секунду
minutes._rotation = (min + sec / 60) * 6; // минуты
hours._rotation = (hour + min / 60) * 30; // 30 - т.к. 12 делений у часов
// Вывод времени (электронные часы)
timeTxt.text = hour + " : " + min + " : " + sec;
};

Затем делается тиканье, ставится на мувик movieSeconds:

onClipEvent (load) {
var snd:Sound = new Sound();
snd.loadSound("tik.mp3", true);
var tik:Function = function ()
{
snd.start(0, 0);
};
var inter:Number = setInterval(tik, 1000);
}

Все остальное делалось руками. Если хотите, могу выложить исходник.

samana
21.04.2010, 23:55
Когда в функции создаётся переменная со словом "var", она называется локальной, и действует только на протяжении этой функции, а затем удаляется. И по этому к ней нет доступа из других функций. Можно сделать так:
_root.onEnterFrame = function() {
var time:Date = new Date();
hour = time.getHours();
min = time.getMinutes();
sec = time.getSeconds();
//.......................................
};
И если вы всё таки хотите писать код в клипе (чего не надо делать) а из него надо обратиться к переменной которая объявлена в _root, не забывайте дописать "_root" впереди, например:
onClipEvent (load) {
var snd:Sound = new Sound();
snd.loadSound("tik.mp3", true);
var tik:Function = function ()
{
snd.start(0, _root.sec);// <------
};
var inter:Number = setInterval(tik, 1000);
}

dimon1408
22.04.2010, 00:21
Таки нет... Поставил всё вместе просто на слой ролика

_root.onEnterFrame = function() {
var time:Date = new Date();
hour = time.getHours();
min = time.getMinutes();
sec = time.getSeconds();
seconds._rotation = sec * 6; // смещение стрелок раз в секунду
minutes._rotation = (min + sec / 60) * 6; // минуты
hours._rotation = (hour + min / 60) * 30; // 30 - т.к. 12 делений у часов
var snd:Sound = new Sound();
snd.loadSound("ortclock.mp3", true);
var tik:Function = function ()
{
snd.start(_root.sec, 0);// <------
};
var inter:Number = setInterval(tik, 60000);
}


Так вся музыка играется по многу раз за секунду. А если поставить

var inter:Number = setInterval(tik, 1);

То музыка очень медленно идет и флеш просто зависает...
Спасибо большое за помощь но, видимо, руки у меня кривые :)

samana
22.04.2010, 00:52
Смотри, у тебя это всё в событии onEnterFrame. Каждый кадр ты создаешь новый звук и нувую функцию, по этому ошибка. Загрузить звук и объявить функцию нужно один раз, а не постоянно, попробуй:
_root.onEnterFrame = function() {
var time:Date = new Date();
hour = time.getHours();
min = time.getMinutes();
sec = time.getSeconds();
seconds._rotation = sec * 6;// смещение стрелок раз в секунду
minutes._rotation = (min + sec / 60) * 6;// минуты
hours._rotation = (hour + min / 60) * 30;// 30 - т.к. 12 делений у часов
};
var snd:Sound = new Sound();
snd.loadSound("ortclock.mp3",true);
function tik() {
snd.start(sec);
}

var inter:Number = setInterval(tik, 1000);

dimon1408
22.04.2010, 01:06
Таки нет... Попробовал, всё равно начинается с первой секунды в любом случае. Попробовал поизменять параметры вокруг - всё равно ноль эффекта :(
Если хотите, можете убедиться - тут (http://narod.ru/disk/19979941000/ort-clock.rar.html) можно скачать архив с fla-файлом и самим ortclock.mp3.

samana
22.04.2010, 01:50
Вот так работает, но с одним но, длина твоего звука 40 секунд, а не 60. И если запустить ролик после 40 то ничего не будет.Попробуй:
sec = new Date().getSeconds();
_root.onEnterFrame = function() {
var time:Date = new Date();
hour = time.getHours();
min = time.getMinutes();
sec = time.getSeconds();
seconds._rotation = sec * 6;// смещение стрелок раз в секунду
minutes._rotation = (min + sec / 60) * 6;// минуты
hours._rotation = (hour + min / 60) * 30;// 30 - т.к. 12 делений у часов

};

var snd:Sound = new Sound();
snd.loadSound("ortclock.mp3",true);
snd.stop();
snd.onLoad = function(yes) {
if (yes) {
snd.start(sec);
}
};

dimon1408
22.04.2010, 02:08
Ага, видимо не тот приложил, значит - у меня их два было :)
Огромное вам спасибо!

samana
22.04.2010, 02:15
Хорошо пока новые проблемы не всплыли...)

dimon1408
22.04.2010, 02:56
Увы, обнаружились ошибки, исправить не смог... :(

Начинает играться всё нормально, за что вам пребольшущее спасибо, но на 0 сек. все останавливается и начинает играть заново только при достижении стартовой точки... Пробовал какие-то монструозные конструкции, например
var snd:Sound = new Sound();
snd.loadSound("ortclock2.mp3",true);
snd.stop();
snd.onLoad = function(yes) {
if (yes) {
snd.start(sec, 1);
if (seconds == 0) {
snd.stop();
snd.start (0,999);
}
}
};
и
var snd:Sound = new Sound();
snd.loadSound("ortclock2.mp3",true);
snd.stop();
snd.onLoad = function(yes) {
if (yes) {
snd.start(sec, 1);
snd.onSoundComplete {
if (seconds == 0) {
snd.stop();
snd.start (0,999);
}
}
};
Но тщетно... :(

samana
22.04.2010, 11:45
Может после onSoundComplete довавить =function{//...}
snd.onSoundComplete = function{
if (seconds == 0) {
snd.stop();
snd.start (0,999);
}

dimon1408
22.04.2010, 15:04
var snd:Sound = new Sound();
snd.loadSound("ortclock2.mp3",true);
snd.stop();
snd.onLoad = function(yes) {
if (yes) {
snd.start(sec, 1);
}
};
snd.onSoundComplete = function(again){
if (seconds == 0) {
snd.stop();
snd.start (0,999);
}
};
И все равно всегда с момента остановки продолжает... Хиромантия какая-то.

Edit: с удивлением для себя обнаружил, что когда играю swf из папки "документы", то звука вообще нет - играет только по Ctrl+Enter... :(

rainbowrussia
22.04.2010, 23:52
Меня немного смущает обращение к snd внутри обработчика событий snd. Может быть там должно быть this вместо snd?
И смущает последовательность исполнения кода - сначала загружается mp3, а потом присваиваются события.

in4core
23.04.2010, 00:34
var snd:Sound = new Sound();
snd.stop();
snd.onLoad = function(yes) {
if (yes) {
snd.start(sec, 1);
}
};
snd.onSoundComplete = function(){
if (seconds == 0) {
snd.stop();
snd.start (0,999);
}
};
snd.loadSound("ortclock2.mp3",true);
В коде ошибок нет. все настроено верно. У вас где то в другом месте косяк