Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите с таймером! (http://www.flasher.ru/forum/showthread.php?t=160908)

krog2008 18.07.2011 23:53

Помогите с таймером!
 
Доброго времени суток! Посмотрел массу тем на форуме - ответа нет!
возникла проблема.
Задача:
Менять фоновую картинку каждые n секунд, бесконечно, и картинки выбирать случайно (из 10 выбранных)
что сделал:
создал два слоя: "AS3" и "Img" во второй соответственно закинул в 10 ключевых кадров по изображению! в AS3 написал код:

Код AS3:

import flash.utils.Timer;
import flash.events.TimerEvent;
var time:Timer = new Timer(4000,0);
time.start();
time.addEventListener(TimerEvent.TIMER, wallch);
function wallch(event:TimerEvent):void
{
    var randf:Number = Math.ceil(Math.random() * 10);
    gotoAndStop(randf);
}
stop();

Проблема: когда запуская просмотр, то происходит что картинки меняются, и действительно рандомно, но четкий интервал не держится в (4000мс) причем после 7 - 8 кадров (т.е. первые 8 кадров идут нормально). Когда прописал trace(randf); то увидел что переменная randf в один момент принимает два, а то и три значения, которые иногда дублируют друг друга, иногда в разнобой. в чем ошибка? подскажите!
Я не профессионал (мягко говоря) но понимаю суть кода, но не понимаю в чем проблема! Заранее спасибо!!!

Rzer 19.07.2011 01:26

Не клади код в кадры. Видимо, что код лежит в первом кадре. А вот здесь:
Код AS3:

var randf:Number = Math.ceil(Math.random() * 10);
gotoAndStop(randf);

Не исключен случай, что можно перейти к первому кадру. После такого перехода функция будет выполняться два раза.

Код AS3:

var randf:Number = Math.ceil(1+Math.random() * 9);
gotoAndStop(randf);


krog2008 19.07.2011 01:45

Спасибо большое! помогло, но не совсем! слишком часто идут совпадения кадров
вывод:
4
4
7
10
10
10
2
... итак далее, а как можно прописать что бы переменная randf новая была не равна предыдущей?
и еще, (Подписываюсь под своей тупостью (( что значит не класть код в кадр? а где его тогда писать??

Wolsh 19.07.2011 02:21

И вообще простой random() не годится для этой задачи.
Картинки часто будут повторяться –
Код AS3:

trace( Math.ceil(1 + 0.01 * 9) == Math.ceil(1 + 0.11 * 9) ); // true
for (var i:uint = 0; i < 25; i++)
{
        trace(Math.ceil(1 + Math.random() * 9 ));
}

За 25 итераций 2 повтора, и в итерации участвуют только 9 кадров, а не 10))).

krog2008 19.07.2011 04:16

За 25 итераций 2 повтора
а как это может быть? 10 фотографий за более чем 10 повторов в любом случае начнут повторяться! или я не прав? *dont_know*

Wolsh 19.07.2011 13:57

Имеется ввиду "повтор" – друг за другом, как в Вашем трейсе. (какой-то глюк с обновлением, я не видел Вашего предыдущего сообщения).
Сравнивайте полученное число с номером текущей, и, если равны, сдвигайте его вверх или вниз.
Либо надо делать плавающий массив – с индексами основного массива_картинок в качестве элементов. При каждом выборе рандомного числа по этому числу берем индекс из временного_массива для получения картинки, И удаляем этот индекс из временного_массива, чтобы эта картинка больше не попалась. Соответственно рэндом умножаем не на общее число картинок, а на длину плавающего временного_массива. Когда он закончится, создаем его снова. Все-равно придется следить за совпадением последней показанной и первой в новом цикле, но почти не будет ситуаций типа 5-8-5-8, когда картинки в какой-то момент начинают чередоваться – тоже неприятно.
Такая техника дает гарантию, что будет показан весь сет картинок, прежде чем любая из них будет показана снова, и при этом их последовательность таки будет рандомной. Но для 10 картинок это все не очень эффективно, потому как на "стыках" двух циклов контроль отсутствует, и все-равно если последними в цикле были 5 и 8, в начале нового вполне могут оказаться те же 5 и 8. Но когда картинок достаточно много, эта ситуация будет возникать крайне редко на общем фоне.

Добавлено через 6 минут
И да, krog2008, для оформления своего кода надо использовать теги [code][/code]

krog2008 19.07.2011 15:46

Спасибо большое! Сейчас попробую написать код, если все получится то выложу сюда и можно тему закрывать! благодарен Вам!
p.s. насчет тегов Ссори! первый раз тут, да и во флеше профан еще! поэтому столько глупых вопросов!

Добавлено через 6 часов 48 минут
:wacko:не могу никак описать эти массивы (( напишите пожалуйста для глупого человека косящего под флешера:rolleyes::rolleyes: всю голову сломал ради этого


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

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