Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.03.2014, 01:21
Alexej вне форума Посмотреть профиль Отправить личное сообщение для Alexej Найти все сообщения от Alexej
  № 1  
Ответить с цитированием
Alexej
 
Аватар для Alexej

Регистрация: Mar 2014
Сообщений: 15
Question Переприсваивание элементов массива

Здравствуйте! Создаю водопад для игры.
Имеется мувик: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 не только удалялся этот экземпляр, но и в элемент массива, в котором лежал данный экземпляр присваивался очередной экземпляр и всё начиналось с начало.
Вложения
Тип файла: swf waterfall.swf (1.4 Кб, 42 просмотров)

Старый 10.03.2014, 10:17
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 2  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Код 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; // Так не пробовали?
        }
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

Старый 10.03.2014, 13:03
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 3  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
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. В коде могу ошибаться, в браузере пишу.
__________________
hauts.ru

Старый 10.03.2014, 14:22
Alexej вне форума Посмотреть профиль Отправить личное сообщение для Alexej Найти все сообщения от Alexej
  № 4  
Ответить с цитированием
Alexej
 
Аватар для Alexej

Регистрация: Mar 2014
Сообщений: 15
Спасибо очень помогли!

Добавлено через 4 минуты
Цитата:
Сообщение от dark256 Посмотреть сообщение
Код 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);

Старый 10.03.2014, 22:42
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 5  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Цитата:
Сообщение от Alexej Посмотреть сообщение

Если обнулить i то, не упавшие капли застрянут на сцене.
Код AS1/AS2:
onEnterFrame = function ():Void {
	for (ii=0; ii<=i; ii++) {
Переписываем:

Код AS1/AS2:
onEnterFrame = function ():Void {
	for (ii=0; ii<=Arr.length; ii++) {
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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