PDA

Просмотр полной версии : изменение фпс


glitchestglitch
25.06.2005, 17:37
мульт, создавался двумя персонами, первая фпс 15, а вторая по ошибке 20. теперь надо как нить соеденить их. так вот вопрос:

можно ли вовремя мульта, менять фпс? если да, то как?

Sh@man
25.06.2005, 18:53
фпс можно менять либо до мульта, либо после. во время - никак нельзя.

7thsky™
25.06.2005, 18:57
возможно, загрузить второй мув в _level1 и в нужный момент поменять местами

_level0.swapDepths (_level1);

это уже обсуждалось на риалтайме, что-то темы не смог найти

Fl00r
25.06.2005, 19:06
Сталкивался с этой проблемой.
ФПС менять во время проигрывания swf нельзя. Это уже "тактовая" частота самого проигрывателя, а не мовика. И если плеер сначала загрузил мов с фпс=20, то он будет до перезагрузки плеера быть с фпс 20.

7thsky™
25.06.2005, 19:12
Еще раз повторяю, за фпс и размеры проигрователя отвечает мув загруженный в _level0

прочитайте внимательно это (http://www.realtime.ru/forum/viewtopic.php?t=4296&postdays=0&postorder=asc&start=0)

Nirth
25.06.2005, 19:13
Оригинал писал C2Plus (http://bsmart.ru)

...кстати говоря, менять уровни местами можно используя swapDepths. Таким образом, например, можно менять мувик в _level0 без перезагрузки остальных.

В мазиле после этого может глючить загрузка файлов, а именно созданые до замены ссылки на мувиклипы в замененом уровне или что-то вроде этого, точно не помню.

Насчет изменения фпс и размеров ничего не могу сказать, сейчас лень эксперементировать...

а то нельзя, нельзя... Можно! :)



да, именно _level0.swapDepths (_level1);
Эта операция меняет местами сами уровни, после нее все, что было в _level1 будет доступно через _level0 и наоборот.

Вот пример:
http://www.bsmart.ru/archives/misc/swap_levels.rar
смотреть во флеше, т.к. вывод идет через трассировку.



область применения, прямо скажу, специфическая... Допустим, есть набор готовых свфок, предположим, это игра или анимация, и мы хотим показывать поверх нее некий рекламный блок, однако, свфка на это не заточена и более того, не хочет работать в _level1 (или в муве _level0) по принципиальным соображениям. Разумеется, ее исходник не доступен. В таком случае мы можем сделать свой загрузчик, который подгрузит рекламу и свфку в произвольные уровни, а затем свфку поставит на удобное ей место - в _level0. Главное поставить ее в _level0 до ее инициализации, хотя тут возможны варианты.

В общем, это средство на крайняк - для исправления кривой архитектуры приложения. Однако примечательно то, что имя уровня фактически зависит от его глубины, и это просто прикольно.

С другой стороны, _level`ам тоже есть применение, хотя, наверное, все, что они позволяют сделать, возможно реализовать и на мувиклипах... Быть может, на мувиклипах даже лучше, не знаю - на мувиках в _level0 - есть родитель для всего, а на левелах общего родителя всего нет, хотя, корневой элемент можно и игнорировать при необходимости, а можно и самому создать корневой элемент... С другой стороны, _level`ы сильнее изолированы друг от друга, чем соседние мувики, которые могут найти друг друга через родителя... Это, наверное, вопрос из разряда: "Разбивать яйцо следует острой стороной или тупой?".


а теперь от себя

Есть еще второй способ менять FPS, это через setInterval()

или через класс FPS

Недавно я писал класс FPS (http://onorange.com/project/classes/FPS.as)
скачать можно тут, как пользоваться классами можно узнать в документации к флэшу

import orange.utils.FPS;
var boo:FPS = new FPS(2);
this.createEmptyMovieClip("ball_mc",3);
this.ball_mc.lineStyle(35,0xff0000,100);
this.ball_mc.moveTo(0,0);
this.ball_mc.lineTo(0.2,0);
this.boo.onEnterFrame = function () {
trace("boo");
_root.ball_mc._x ++;
this._fps +=0.5;
}

Второй способ это через setInterval



Или использовать вариант silin'а

class FPS{
var onEnterFrame: Function;
private var _framerate, intID : Number;
private var listeners:Array;
function FPS (frameRate){
_fps = frameRate;
listeners=[this]
}
function get _fps(){
return _framerate;
}
function set _fps (frameRate){
clearInterval (intID);
_framerate = frameRate
intID=setInterval(this,'update',1000 / frameRate)
}
function stop (){
clearInterval (intID);
}
function play (){
_fps = _framerate;
}
private function update(){
for(var i in listeners) listeners[i].onEnterFrame();
updateAfterEvent();
}
function addListener(obj){
listeners.push(obj)
}
}

Fl00r
25.06.2005, 19:16
где ж вы были раньше (.

Штрек
25.06.2005, 23:14
где ж вы были раньше (.
Если ещё учесть с какой погрешностью отрабатывается
setInterval......

silin
26.06.2005, 20:57
еще нада учесть, что вышепрведенный класс никакого отношения к скорости пригрывания линейки не имеет,
а только определяет периодичность вызова метода, имеющего (по недоразумению, имхо) имя onEnterFrame
для мувиков onEnterFrame (если определена канеш) будет вызываться и при смене кадра плеером и по сетинтрвалу, что есть бардак..

Nirth
26.06.2005, 21:02
у меня были идеи создать либо доп событие либо переименовать имеющееся но как то привык, в принципе классом пользоваться не обязательно можно просто посмотреть на то как он работает и сделать аналогичную функцию на setInterval, а класс делался под себя а для себя всегда есть простор для бардака ;)

silin
26.06.2005, 21:10
ну так и я об этом, аккуратнее надо формулировать
Есть еще второй способ менять FPS, это через setInterval()
или через класс FPS

glitchestglitch
26.06.2005, 22:45
Всем огромное спасибо...Но в этих классах я не разбираюсь... Да и в АС я не гуру. А про левел1 и левел ноль... - это что такое? Это импорт swf? Разве если импортировать в файл фпс меняется? Но все же у меня была такая идея. Импортнуть остальное. Но была еще проблема. Прелоудер должен был загрузить и то и то...

Если не будут ругать за оффтопик... Как грузить СВФ чтоб прелоудер изначально качал ее?

glitchestglitch
26.06.2005, 22:54
Оригинал писал C2Plus (http://bsmart.ru)


class FPS{
...........n FPS (frameRate){
_fps = frameRate;
listeners=[this]
}
function get _fps(){
return _framerate;
}
function set _fps (frameRate){
clearInterval (intID);
_framer.........

Пожалуйста! Обьясните подробно что делать... Не понял я все таки что такое классы... :(

Nirth
26.06.2005, 23:16
Как ты интересно вставил цитату, начало и конец.
Силин был прав, разжевываю.

забей на классы, когда захочешь купишь книжку и почитаешь, есть такая феня как setInterval() вот она заставляет вызывать какую либо функцию через определенное кол во времени(Заметь мы не меняем frame rate мы лишь эмулируем его смену)
пишем что то вроде

framerate = 24;
var id = setInterval(function (target) { target._x+=5 } , 1000/framerate,this);

почитай в хелпе про setInterval чтобы понять его лучше =)

PS я делил 1000 на framerate чтобы было понятнее, что для того чтобы добиться 24 кадров нужно разделить 1000 на 24, для 30 кадров 1000 на 30 и так далее.

glitchestglitch
26.06.2005, 23:30
Может я такой идиот...Но сами смотрите... :eek: .....

glitchestglitch
26.06.2005, 23:33
сорри.. разобрался с аттаччами....

"......сами смотрите........."

ЗЫ. Можно вопрос? Куда это точка направилась?

7thsky™
26.06.2005, 23:42
вообщем так: (не тестил но вроде должно работать)

первая часть твоего мульта 15 фпс, на первом кадре пишешь
loadMovieNum ('part_two.swf', 1);
_level1._alpha = 0;
_level1.stop ();

в конце на последнем фрэйме (надеюсь что первая часть достаточно длинная чтобы вторая часть успела загрузиться)

_level0.swapDepths (_level1);
_level0._alpha = 100;
_level0.gotoAndPlay (2);

silin
27.06.2005, 00:04
Можно вопрос? Куда это точка направилась?
куда скомандовал, туда и направилась:
var id = setInterval(function (target) { target._x+=5 } , 1000/framerate,this);
в target ты передаешь this (_root в твоем примере)