Форум 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=206858)

Alexej 10.03.2014 01:21

Переприсваивание элементов массива
 
Вложений: 1
Здравствуйте! Создаю водопад для игры.
Имеется мувик:drop_mov
и код:
Код AS1/AS2:

_root.createEmptyMovieClip("watefall_mov", 1);
_root.watefall_mov._x = 400;
_root.watefall_mov._y = 10;
i = 0;
var Arr:Array = new Array();
function drop_fun():Void {
        if (i<=1000) {
                i++;
                Arr[i] = _root.watefall_mov.attachMovie("drop_mov", "drop_"+i, i);
                Arr[i]._x = 0;
                Arr[i]._y = 0;
        }
}
onEnterFrame = function ():Void {
        for (ii=0; ii<=i; ii++) {
                a = (i-ii)*0.1;
                Arr[ii]._y += 1*a+0.1;
                Arr[ii]._height += Arr[ii]._height*0.008;
                Arr[ii]._width += Arr[ii]._width*0.005;
                if (Arr[ii]._y>=700) {
                        removeMovieClip(Arr[ii]);
                }
        }
};
setInterval(drop_fun, 200);

В общем всё работает, я удаляю элементы массива по достижении определённого уровня, но значения i и ii достигают огромных размеров, а они все обрабатываются циклом(это очень грузит игру).
Нужно что бы при достижении каплей координаты по y>=700 не только удалялся этот экземпляр, но и в элемент массива, в котором лежал данный экземпляр присваивался очередной экземпляр и всё начиналось с начало.

dark256 10.03.2014 10:17

Код AS1/AS2:

        if (i<=1000) {
                i++;
                Arr[i] = _root.watefall_mov.attachMovie("drop_mov", "drop_"+i, i);
                Arr[i]._x = 0;
                Arr[i]._y = 0;
        } else {
              i = 0; // Так не пробовали?
        }


Hauts 10.03.2014 13:03

Alexej, вам не обязательно хранить ссылки на капли в массиве.

Вам массив вообще не нужен. Если сделать управление падением капли на самой капле.

То есть создаете ваши капли, не записываете их ни в какой массив. А каждой капле на onEnterFrame ставите код ее падения.

Код AS1/AS2:

_root.createEmptyMovieClip("watefall_mov", 1);
_root.watefall_mov._x = 400;
_root.watefall_mov._y = 10;
 
var dropsCounter = 0;
var totalDrops = 1000;
function drop_fun():Void {
        if (dropsCounter<=totalDrops) {
                dropsCounter++;
                var newDrop = _root.watefall_mov.attachMovie("drop_mov", "drop_"+dropsCounter, dropsCounter);
                newDrop.someCoeff = (totalDrops-dropsCounter)*0.1; // тут подправить, видимо
                newDrop.onEnterFrame = dropOnEnterFrame;
        } else {
            clearInterval(createDropInterval)
        }
}
function dropOnEnterFrame():Void {
        this._y += this.someCoeff+0.1;
        this._height += this._height*0.008;
        this._width += this._width*0.005;
        if (this._y>=700) {
                delete this.onEnterFrame;
                removeMovieClip(this);
        }
};
var createDropInterval = setInterval(drop_fun, 200);

А если уж и задуряться с массивами, то на onEnterFrame будет что-то типа такого:
Код AS1/AS2:

onEnterFrame = function ():Void {
        for (ii=0; ii<=i; ii++) {
                a = (i-ii)*0.1;
                Arr[ii]._y += 1*a+0.1;
                Arr[ii]._height += Arr[ii]._height*0.008;
                Arr[ii]._width += Arr[ii]._width*0.005;
                if (Arr[ii]._y>=700) {
                        Arr[ii].deleteFlag = true;
                }
        }
        for(var k=0; k < Arr.length; k++){
            if(Arr[k].deleteFlag){
                Arr[k].removeMovieClip();
                Arr.splice( k, 1 );
                k--;
            }
        }
};

То есть пометили каплю, что ее нужно удалить, подвинули все капли, а потом пробежались по всему массиву с поиском элементов, которые нужно удалить.

P.S. В коде могу ошибаться, в браузере пишу.

Alexej 10.03.2014 14:22

Спасибо очень помогли!

Добавлено через 4 минуты
Цитата:

Сообщение от dark256 (Сообщение 1161389)
Код AS1/AS2:

        if (i<=1000) {
                i++;
                Arr[i] = _root.watefall_mov.attachMovie("drop_mov", "drop_"+i, i);
                Arr[i]._x = 0;
                Arr[i]._y = 0;
        } else {
              i = 0; // Так не пробовали?
        }


Если обнулить i то, не упавшие капли застрянут на сцене.

Добавлено через 2 часа 0 минут
Для общего пользования, если кому понадобится.
Значениями переменных можно варьировать(Экспериментируйте)
Создаёте мувик drop_mov(капля-круг с наложеным градиентом. К краям прозрачность приближается к нулю)
Код AS1/AS2:

_root.createEmptyMovieClip("watefall_mov", 1);
_root.watefall_mov._x = 400;
_root.watefall_mov._y = 10;
concentrat = 200;
//Скорость образования новых капель в мс
limit = 60;
//Лимитированое число капель на сцене
acceleratDrop = 0.01;
i = 0;
var Arr:Array = new Array();
function drop_fun():Void {
        if (i == limit) {
                i = 0;
        }
        i++;
        Arr[i] = _root.watefall_mov.attachMovie("drop_mov", "drop_"+i, i);
        Arr[i]._x = 0;
        Arr[i]._y = 0;
}
onEnterFrame = function ():Void {
        for (ii=0; ii<=limit; ii++) {
                Arr[ii]._y += 0.5+Arr[ii]._y*acceleratDrop;
                Arr[ii]._height += Arr[ii]._height*0.008;
                Arr[ii]._width += Arr[ii]._width*0.005;
                if (Arr[ii]._y>=700) {
                        removeMovieClip(Arr[ii]);
                }
        }
};
setInterval(drop_fun, concentrat);


dark256 10.03.2014 22:42

Цитата:

Сообщение от Alexej (Сообщение 1161396)

Если обнулить i то, не упавшие капли застрянут на сцене.

Код AS1/AS2:

onEnterFrame = function ():Void {
        for (ii=0; ii<=i; ii++) {

Переписываем:

Код AS1/AS2:

onEnterFrame = function ():Void {
        for (ii=0; ii<=Arr.length; ii++) {



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

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