| Цитата |
| Код | private static var W = 792; private static var H = 516; private static var COLDG = 70; //колич.дождинок
|
|
Это ты объявила переменные статическими, т.е. к ним можно обращаться через класс, а не через экземпляр класса; например так: trace(Risdog.COLDG); вместо trace(this.COLDG); Но тут это вроде бы не требуется, вероятно ты хотела объявить их константами (чтобы нельзя было изменять их значение после объявления). Константы объявляются так (декларацию типов заодно добавил):
| Код | private const W:int = 792; private const H:int = 516; private const COLDG:int = 70; //колич.дождинок
|
Учитывая, что фон не анимируется, логично сделать его отдельным объектом, чтоб не приходилось его каждый раз перерисовывать: private var sky:Shape = new Shape;//небо В каждом кадре удалять и создавать новый холст для рисования дождя тоже вряд ли является оптимальным вариантом. Лучше использовать один и тот же объект, но в каждом кадре очищать его от старой графики. Делается это с помощью метода clear() класса Graphics: rism.graphics.clear();
| Цитата | Получалось,что сколько было повторений таймеров столько и было объектов rism на которых двигались дождинки.
|
Объект rism был один, просто новая графика в нем рисовалась поверх старой. А ее надо было удалять (графику, а не сам объект)
Загружать картинку с твоей машинкой в каждом кадре я тоже смысла не вижу. Лучше вынести загрузку в конструктор. Еще, вместо 2х массивов для кординат х и у, мне было бы удобней использовать один, в котором будут храниться точки (экземпляры класса Point) Ну и имена переменных у тебя не очень человекопонятные. Всякие там xm, ym, dd, ti, aa, которые мало что говорят об их назначении. Код трудно читать( В общем, минимально правленный код будет выглядеть примерно так:
| Код | package { import flash.display.*; //для рисования import flash.utils.*; import flash.events.*; //для прерываний import flash.net.*; public class Risdog extends Sprite { private const W:uint = 792; private const H:uint = 516; private const COLDG:uint = 70; //колич.дождинок private var timer:Timer; //таймер private var masx:Array = new Array(COLDG); //массив коор-т дождинок private var masy:Array = new Array(COLDG); private var ti:int; private var sky:Shape = new Shape;//небо private var rism:Shape = new Shape;//рис.векторных.изображ. private var loader:Loader = new Loader(); private var skyColor:uint = 0x0000ff; //цвет неба private var dropColor:uint = 0x000066; //цвет капель дождя public function Risdog() { //конструктор sky.graphics.beginFill(skyColor); sky.graphics.drawRect(0, 0, W, H); sky.graphics.endFill(); addChild(sky);//добавим небо на сцену addChild(loader);//добавим загрузчик картинки на сцену addChild(rism);//объект для рисования дождя loader.y = 400; loader.load(new URLRequest("mash.gif")); var a1:int, a2:int, b:int; for (var j:uint = 0; j <= COLDG - 1; j++) { //формирование массива дождинок a1 = 50 + Math.random() * W + 50; masx[j] = a1; a2 = 5 + Math.random() * H; masy[j] = a2; } //обработка события щелчёк мыши //addEventListener(MouseEvent.CLICK, fl_MouseClickHandler);//непонятно зачем нужен этот хендлер. видимо, использовался при отладке timer = new Timer(50, 0); //частота таймера //обработка события таймер timer.addEventListener(TimerEvent.TIMER, timeFon); //рис.фон на котором нарисованы косые палочки-капли дождя RISFON(); //включаем таймер; timer.start(); } //ф-ция рис.фон private function RISFON():void { rism.graphics.clear(); rism.graphics.lineStyle(2, dropColor, 1); var f1:int; for (var i:uint = 0; i <= COLDG - 1; i++) { //рис.дождинки; if (masy[i] >= H + 20 || masx[i] < 50) { //если дождинка за фоном,формируем новую f1 = Math.random() * W + 100; masx[i] = f1; masy[i] = -40; } rism.graphics.moveTo(masx[i], masy[i]); rism.graphics.lineTo(masx[i] - 15, masy[i] + 15); rism.graphics.endFill(); //движение дождинок; masx[i] -= 5; masy[i] += 10; } loader.x += 6; if (loader.x > W + 100) { loader.x = -loader.width; } } //ф-ция обраб.события таймер,движение private function timeFon(e:TimerEvent):void { //рис.фон,где дождинки сдвигаютя RISFON(); ti++; trace(ti); } } }
|
|