|
|
|||||
Регистрация: Feb 2013
Сообщений: 21
|
Как использовать getTimer()?
Есть класс Ball, с помощью которого можно создать шарик.
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; } } } } 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); } } } } |
|
|||||
Проблема в следующих строчках
и у вас каждый раз при вызове функции переменной а присваивается значение прошедшего с момента запуска времени, поэтому, скорее всего, шарики не будут добавляться вообще, это раз во-вторых, переменная у вас на всю программу одна и даже если каким-то образом срабатывает условие новый добавленный шарик перезаписывает старый. я бы посоветовал вместо getTimer использовать TimerEvent, который бы срабатывал каждые 3000 мс gameTimer = new Timer(3000); gameTimer.addEventListener(TimerEvent.TIMER, onTimerListener); gameTimer.start(); при этом, функцию перетащить в класс с шариком под свой обработчик события EnterFrame. То есть у каждого шарика свой обработчик EnterFrame Если делать без переделки функции move, то придется в вашей в цикле перебирать все шарики массива balls и вручную вызывать у каждого функцию move |
|
|||||
Регистрация: Feb 2013
Сообщений: 21
|
Цитата:
Цитата:
Цитата:
|
|
|||||
А зачем использовать именно getTimer()?
Если именно с getTimer(), то надо заранее где-то создать переменную, а не в начале функции через И менять её только после создания очередного шарика. Например первый раз записываем в конструкторе Main() а все последующие разы после выполнения условия по пройденному времени |
|
|||||
Регистрация: Feb 2013
Сообщений: 21
|
Ну нужно так по заданию.
Создала переменную класса майн То-есть первый шарик нужно создать в конструкторе? Если так делать тогда вообще только один шарик создается |
|
|||||
Нет, не надо первый шарик в конструкторе
У вас переменная объявлена сейчас вне конструктора надо оставить только объявление А уже в конструкторе класса Main присвоить ей значение getTimer(); public function Main() { balls = new Array(); addEventListener(Event.ENTER_FRAME, onLoop); a = getTimer(); } Ну и в самом классе ball поправить функцию move, сделать её как обработчик события EnterFrame |
|
|||||
Регистрация: Feb 2013
Сообщений: 21
|
Если поправить move в классе ball, то шарики двигаются все, но двигаются по диагонали т.к. не единожды выбирается случайное направление движения. Да кто му же получается 2 слушателя события ENTER_FRAME, в раздных классах, а как мне объясняли такое не желательно. Может всетаки как-то с помощью цикла обойтись и перебрать все шарики в массиве?
Еще возник вопрос. сейчас первый шарик создается через 3 секунды после начала работы программы, а можно как-то его сразу создать, а потом чтоб гетТаймер начал работать? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Потому что у Вас ответственности не распределены между функциями.
addBall у Вас не шарик добавляет, как заявлено в названии, а проверяет прошедшее время И добавляет шарик. А onLoop делает addBall на каждый кадр, хотя в Вашем же задании сказано — раз в три секунды. Вы можете сказать — "Да какая разница, как я назвала функции". Язык потому и "язык", что через слова выражается логика. Поместите проверку времени в onLoop. На каждый кадр Вы проверяете, сколько прошло времени — логично? Если прошло 3 секунды, вызываете addBall — логично? В addBall просто добавляете новый шарик. А чтобы первый шарик появлялся сразу, вызываете addBall в конструкторе, и потом начинаете слушать ентерфрейм. Но сам по себе способ использовать getTimer конечно неудачный. В таком приложении логика требует просто задать интервал, через который совершается действие. А getTimer нужен для другого, для измерения прошедшего времени.
__________________
Reality.getBounds(this); |
|
|||||
если с getTimer(), то можно так:
private var _lastTick:int = 0; private function onLoop(e:Event):void { var currentTime:int = getTimer(); if (currentTime - _lastTick >= 3000) { addBall(); _lastTick = currentTime; } } Я бы для этой функции создал таймер c заданным интервалом |
|
|||||
Регистрация: Feb 2013
Сообщений: 21
|
Всем спасибо за помощь.
|
Часовой пояс GMT +4, время: 17:33. |
|
« Предыдущая тема | Следующая тема » |
|
|