Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как использовать getTimer()? (http://www.flasher.ru/forum/showthread.php?t=194549)

Tina 16.02.2013 23:18

Как использовать getTimer()?
 
Есть класс Ball, с помощью которого можно создать шарик.

Код AS3:

package objects 
{
        import flash.display.Sprite;
 
        public class Ball extends Sprite
        {
                private var d:int = 3;
                private var speed:int;
                public var move:Function;
                public function Ball()
                {
                        var color:Number = 0xFFFFFF * Math.random();
                        speed = (Math.random() > 0.5) ? 10 : -10;
                        graphics.beginFill(color);
                        graphics.drawCircle(d, d, d);
                        move = (Math.random() > 0.5) ? moveX : moveY;
                }
                public function setRandomPosition():void
                {
                        x = Math.random() * (stage.stageWidth - width);
                        y = Math.random() * (stage.stageHeight - height);
                }
                public function moveX():void
                {
                        x += speed;
                        if (x >= stage.stageWidth - width || x < 0)
                        {
                                speed *= -1;
                        }
                }
                public function moveY():void
                {
                        y += speed;
                        if (y >= stage.stageHeight - height || y < 0)
                        {
                                speed *= -1;
                        }
                }
        }
}

Нужно сделать так чтоб на сцену добавлялись шарики каждые 3 секунды пока их не станет 20 шт. Идея такая но это не работает. А еще нужно чтобы двигались все шарики а не только последний. Как это сделать?
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.utils.getTimer;
        import objects.Ball;
 
        public class Main extends Sprite
        {
                private var balls:Array;
                private var ball:Ball;
                public function Main()
                {
                        balls = new Array();
                        addEventListener(Event.ENTER_FRAME, onLoop);
                }
                private function onLoop(evt:Event):void
                {
                        addBall();
                        ball.move();
                }
                private function addBall():void
                {
                        var a:Number = getTimer();
                        if (balls.length < 20 && (getTimer()-a)>=3000)
                        {
                                ball = new Ball();
                                addChild(ball);
                                ball.setRandomPosition();
                                balls.push(ball);
                        }
                }
        }
}


KumoKairo 16.02.2013 23:28

Проблема в следующих строчках
Код AS3:

var a:Number = getTimer();
if (balls.length < 20 && (getTimer()-a)>=3000)

и
Код AS3:

ball = new Ball();
ball.move();

у вас каждый раз при вызове функции переменной а присваивается значение прошедшего с момента запуска времени, поэтому, скорее всего, шарики не будут добавляться вообще, это раз
во-вторых, переменная
Код AS3:

ball:Ball;

у вас на всю программу одна и даже если каким-то образом срабатывает условие
Код AS3:

if (balls.length < 20 && (getTimer()-a)>=3000)
                        {

новый добавленный шарик перезаписывает старый.
я бы посоветовал вместо getTimer использовать TimerEvent, который бы срабатывал каждые 3000 мс
Код AS3:

gameTimer = new Timer(3000);
gameTimer.addEventListener(TimerEvent.TIMER, onTimerListener);
                                gameTimer.start();

и в теле функции обработчика создавать новый шарик и вталкивать его в массив с вашими шариками
при этом, функцию
Код AS3:

ball.move();

перетащить в класс с шариком под свой обработчик события EnterFrame.
То есть у каждого шарика свой обработчик EnterFrame
Если делать без переделки функции move, то придется в вашей
Код AS3:

private function onLoop(evt:Event):void

в цикле перебирать все шарики массива balls и вручную вызывать у каждого функцию move

Tina 16.02.2013 23:47

Цитата:


Проблема в следующих строчках

Код AS3:

var a:Number = getTimer();
if (balls.length < 20 && (getTimer()-a)>=3000)

и

Код AS3:

ball = new Ball();
ball.move();


Ну это я понимаю.
Цитата:

у вас каждый раз при вызове функции переменной а присваивается значение прошедшего с момента запуска времени, поэтому, скорее всего, шарики не будут добавляться вообще, это раз
Как это исправить? Нужно использовать именно getTimer().
Цитата:

в цикле перебирать все шарики массива balls и вручную вызывать у каждого функцию move
Цикл пробовала но тоже не вышло.

KumoKairo 17.02.2013 00:24

А зачем использовать именно getTimer()?

Если именно с getTimer(), то надо заранее где-то создать переменную, а не в начале функции через
Код AS3:

var a:Number = getTimer();

И менять её только после создания очередного шарика.
Например первый раз записываем в конструкторе Main() а все последующие разы после выполнения условия по пройденному времени
Код AS3:

if (balls.length < 20 && (getTimer()-a)>=3000)


Tina 17.02.2013 00:37

Ну нужно так по заданию.
Создала переменную класса майн
Код AS3:

private var a:Number = getTimer();

То-есть первый шарик нужно создать в конструкторе? Если так делать тогда вообще только один шарик создается

KumoKairo 17.02.2013 00:45

Нет, не надо первый шарик в конструкторе
У вас переменная объявлена сейчас вне конструктора
надо оставить только объявление
Код AS3:

private var a:Number;

А уже в конструкторе класса Main присвоить ей значение getTimer();
Код AS3:

public function Main()
                {
                        balls = new Array();
                        addEventListener(Event.ENTER_FRAME, onLoop);
                        a = getTimer();
                }

В функции addBall() поправить так
Код AS3:

private function addBall():void
                {
                        if (balls.length < 20 && (getTimer()-a)>=3000)
                        {
                                a = getTimer();
                                ball = new Ball();
                                addChild(ball);
                                ball.setRandomPosition();
                                balls.push(ball);
                        }
                }

Ну и в самом классе ball поправить функцию move, сделать её как обработчик события EnterFrame

Tina 17.02.2013 02:30

Если поправить move в классе ball, то шарики двигаются все, но двигаются по диагонали т.к. не единожды выбирается случайное направление движения. Да кто му же получается 2 слушателя события ENTER_FRAME, в раздных классах, а как мне объясняли такое не желательно. Может всетаки как-то с помощью цикла обойтись и перебрать все шарики в массиве?
Еще возник вопрос. сейчас первый шарик создается через 3 секунды после начала работы программы, а можно как-то его сразу создать, а потом чтоб гетТаймер начал работать?

Wolsh 17.02.2013 05:49

Потому что у Вас ответственности не распределены между функциями.
addBall у Вас не шарик добавляет, как заявлено в названии, а проверяет прошедшее время И добавляет шарик. А onLoop делает addBall на каждый кадр, хотя в Вашем же задании сказано — раз в три секунды.
Вы можете сказать — "Да какая разница, как я назвала функции". Язык потому и "язык", что через слова выражается логика. Поместите проверку времени в onLoop. На каждый кадр Вы проверяете, сколько прошло времени — логично? Если прошло 3 секунды, вызываете addBall — логично? В addBall просто добавляете новый шарик. А чтобы первый шарик появлялся сразу, вызываете addBall в конструкторе, и потом начинаете слушать ентерфрейм.

Но сам по себе способ использовать getTimer конечно неудачный. В таком приложении логика требует просто задать интервал, через который совершается действие. А getTimer нужен для другого, для измерения прошедшего времени.

caseyryan 17.02.2013 11:10

если с getTimer(), то можно так:
Код AS3:

private var _lastTick:int = 0;
 
private function onLoop(e:Event):void {
    var currentTime:int = getTimer();
    if (currentTime - _lastTick >= 3000) {
            addBall();
            _lastTick = currentTime;
    }
}

Но вообще, Wolsh уже предложил более правильный вариант.
Я бы для этой функции создал таймер c заданным интервалом
Код AS3:

private var _timer:Timer = new Timer(3000, 20);
 
_timer.addEventListener(TimerEvent.TIMER, onTimer);
 
private function onTimer(e:TimerEvent):void {
    addBall();
}


Tina 18.02.2013 00:07

Всем спасибо за помощь.


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

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