Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   изменение фпс (http://www.flasher.ru/forum/showthread.php?t=66037)

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

прочитайте внимательно это

Nirth 25.06.2005 19:13

Оригинал писал C2Plus
Цитата:

...кстати говоря, менять уровни местами можно используя 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
скачать можно тут, как пользоваться классами можно узнать в документации к флэшу
Код:

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

Цитата:

Сообщение от Fl00r
где ж вы были раньше (.

Если ещё учесть с какой погрешностью отрабатывается
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

Цитата:

Сообщение от Nirth
Оригинал писал C2Plus


Код:

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

Вложений: 1
сорри.. разобрался с аттаччами....

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

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

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

Цитата:

Сообщение от glitchestglitch
Можно вопрос? Куда это точка направилась?

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


Часовой пояс GMT +4, время: 17:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.