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

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

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

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Но ведь класс создан создателем, причем имеет в себе довольно простые функции, которые влияют лишь на мячик? Не для это разве пишутся паблик функции в классе, чтобы им можно было управлять извне? Плюс интерфейсы, который сделают мячик "физическим телом", к примеру?

То есть если делать классы, то делать полностью универсальными и редко ими пользоваться? Если футбольное поле, то не класс поле, в нем экземпляр мячика (композиция применяется), экземпляры детей и экземпляр трава, к примеру, а класс поле, а в нем функции "дети, мячик, трава" и в каждой куча кода и куча своих переменных и для управления каждым нужном создавать каждому по 3-4 функции все это внутри класса поля? Разве не от такой системы идет переход в AS3 и ООП?

Моя видимость такая:

Класс field:
-рисует поле графикой, создает координаты как числа.
-экземпляр класса ball, который присваивается переменной, как ball:FootballBall = new FootballBall(ширина и высота поля)
-10 экземпляров класса child, которые присваиваются массиву allChildren[i] = new ChildPlayer(объект, на который они будут влиять, пинать, играть с ним. в нашем случае это ball)

Класс ball:
функции, отвечающие за физическое поведение шара при воздействии на него. я в физике не очень, но например он и так и так будет толкаться детьми, но при воздействии в классе child функции к примеру kickTheBall он будет лететь с переменными взятыми от класса ребенок от функции kickTheBall.

Класс child:
функции имитации ИИ, пробежка, столкновение с другими экзмеплярами класса child и конечно же функции пинания мячика.

То есть я вообще не беру в расчет наследование, которое тут для каждого класса это extends Sprite для отображения.

В плане композиции. Разве так не проще будет для создателя, разграничить все это? При возможностях dispatchEvent-а кстати и пользовательских евентов, не проще ли будет такая проектировка?

Вы можете взглянуть на мой пример, он есть в этой теме, Random Ball класс.

Может у нас недопонимание или я действительно сильно сильно себе где-то усложняю кодинг.

Старый 22.08.2012, 21:12
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 32  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Я же выше кидал класс RandomBall
Да да, это я не внимательно смотрел, там Sprite рисует..)

Код AS3:
var bl:Sprite = this.addChild(new Ball(0x00ff00, 2)) as Sprite;
Цитата:
Создается локальная переменная bl типа Sprite, ей присваивается ссылка на новый экземпляр класса Ball, добавленный в список отображения (addChild()).
Разве до этого было не тоже самое? :::

Код AS3:
var bl:Ball;      // объявляю в глобальной части
bl = new Ball(0x00ff00,2); // в конструкторе
addChild(bl);
В чем отличие..

Цитата:
Я Вас окончательно перестал понимать. При чем тут графикс.
Выше я приводил код класса который рисует шарики. Этот класс называется Ball. В нем соответственно для рисования использую graphics. Основной класс программы создает переменную bl типа Ball и добавляет в список отображения.


Код AS3:
Это не моё. Следите за орфографией.
Код AS3:
        //.............
        import flash.utils.Timer;	
	public class SuperCircle extends MovieClip
	{
		var bl:MovieClip;          // -----  1
 
           //...................
		public function SuperCircle()
		{	
		    for (var i:uint=0;i<50;i++){				
		    bl = this.addChild(new Ball(0x00ff00, 2)) as MovieClip;          // ----- 2
	 //......................
         bl.addEventListener(MouseEvent.MOUSE_OUT, onMO);
Так заработало без ошибок,но без результата - все также двигается только последний созданный шарик. Почему перестают двигаться все остальные?
Еще раз выкладываю скомпилированную флешку для наглядности проблемы.

Для первой флешки используется объявление обработчика события MOUSE_OUT приведенная ниже (реагирует крайний правый шарик):
Код AS3:
bl.addEventListener(MouseEvent.MOUSE_OUT, onMO);   //  файл Fail_Ball
Вторая флешка разбрасывает шарики, но при этом и кнопку запускает в полет, что крайне ненужно.
Код AS3:
this.addEventListener(MouseEvent.MOUSE_OUT, onMO);   //  файл Fail_Button
Вложения
Тип файла: rar Fail_Ball.rar (35.4 Кб, 20 просмотров)
Тип файла: rar Fail_Button.rar (35.4 Кб, 21 просмотров)

Старый 22.08.2012, 21:17
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 33  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Моя видимость такая:
Стоп стоп, не забегайте так вперед.. я понимаю что у вас на порядок больше опыта программирования в AS3 по сравнению со мной, но давайте пока что опустимся на Землю и разберемся всего лишь, почему у меня не правильная реакция моих несчастных шариков..)) и почему они в два этапа возвращаются, рывками..

Старый 22.08.2012, 21:19
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 34  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Приведу свой пример.
Вот простенькая не интерактивная, обычная галерея: http://testcreation.16mb.com/

Сделал ее так. Расскажу про именно галерею, а не меню.
Класс галерея. В нем 16 экземпляров класса Thumbnail. В каждом Thumbnail по экземпляру класса smallImage, который подгружает картинку.
В классе gallery есть еще класс bigPicture.

Разбор xml через цикл происходит в классе Gallery, главном.

То есть, добавив класс Gallery, можно сразу получить галлерею. А если еще в конструкторе требовать ссылку на определенный xml и сделать галерею интерактивной (если больше 16-и элементов, к примеру, то будет прокрутка или стрелки дальше-назад) то класс Gallery, собрав в себя, конечно другие классы, создает такую галерею.

Как происходит взаимодействие между элементами и вообще проверка, если нажать на маленькую картинку, чтобы она показала большую (не буду же я создавать в каждой картинке свой экземпляр bigPicture).
Происходит множественная привязка листенеров на пользовательские события.
Далее, при нажатии к примеру, маленькая картинка кидает в класс Gallery событие "clicked".
Т.к. во время цикла в Gallery каждому экземпляру Thumbnail был привязан листенер, он отлавливает clicked и собирает переменную со ссылкой на увеличинную картинку (а вот эта переменная уже помещена в каждый Thumbnail).
То есть грубо говоря так:

Код AS3:
arrayOfThumnails.[i].addEventListener("clicked", thumbClicked)
 
function thumbClicked (e:Event) {
//большая картинка уже есть, просто она не показывается без функции showPicture
bigPicture.showPicture(new URLRequest(e.currentTarget.bigPictureLink);
}
Да, т.к. в галерее еще есть "имитация морганий и глаз", в Thumbnail есть класс eye, который добавляется после класса картинки, чтобы в случае появления глаза, она стала недоступной.

Трудно было просто всю лестницу диспатчИвентов раскидать, чтобы все друг с другом взаимодействовало, но разве не проще, чем в одном классе все это расписать на 200 строк кода?

Добавлено через 4 минуты
Сейчас посмотрю ваши файлы, может пойму, помогу

Добавлено через 7 минут
Так, если я понял.

Вы присваиваете к bl листенер, да? А перед этим через одну единственную переменную перетаскиваете всю свору шариков, да?

Если так, чтобы они не реагировали все, делайте массив.
Каждому новому шарику ballsArray[i] где i - то число в цикле.

Добавлено через 20 минут
Код AS3:
			for (var i:uint=0;i<50;i++){
			   arrayOfBalls[i] = new Ball(0x00ff00,2);
			   addChild(arrayOfBalls[i]);
			   arrayOfBalls[i].x = 100 + (i*arrayOfBalls[i].width);
			   arrayOfBalls[i].y = 100;
			   _dictionary[arrayOfBalls[i]] = [arrayOfBalls[i].x, arrayOfBalls[i].y];
                           arrayOfBalls[i].addEventListener(MouseEvent.MOUSE_OUT, onMO);
			}
Это не решит проблему? Использование массива, чтобы каждому шарику был присвоен свой(!) листенер, а не переменной, через которую пробежали все 50 шариков.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
@SpetZ_Naz
Цитата:
Разве до этого было не тоже самое?
С этой строчкой никак не связано решение Вашей проблемы. Оно ниже — вешать листенер для шариков на каждый конкретный экземпляр шарика. У Вас же создавались 50 шариков и потом вне цикла вешался листенер на this, то есть на контейнер шариков.
Цитата:
Так заработало без ошибок,
Мой код у меня в ФД прекрасно компилится. Так что нет, эта ошибка про какой-то Global не моя.
Цитата:
но без результата - все также двигается только последний созданный шарик. Почему перестают двигаться все остальные?
Ответ на этот вопрос был дан где-то в начале топика. На этот раз Вы не показали код слушателя. Я бы нанял телепата, но они нынче дорогие. Учитывая, что раньше источником события у Вас был контейнер, а не шарик, осмелюсь предположить, что код обработчика надо как бы.. ээ.. переписать, да.
__________________
Reality.getBounds(this);

Старый 22.08.2012, 22:10
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 36  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Вот простенькая не интерактивная, обычная галерея: http://testcreation.16mb.com/
Почему-то пустая страничка открывается...

Цитата:
Это не решит проблему? Использование массива, чтобы каждому шарику был присвоен свой(!) листенер, а не переменной
Та да, Вы правильно написали "свой(!)" ...) все на много проще получилось.. точнее после ночной смены на работе внимательность умножилась на ноль...

Wolsh, же мне выше писал чтоб я перенес строчку объявления события в тело массива, а я...

Код AS3:
for (var i:uint=0;i<50;i++){				
		bl = this.addChild(new Ball(0x00ff00, 2)) as MovieClip;		
		bl.x = 100 + (i*bl.width);
		bl.y = 100;
		_dictionary[bl] = [bl.x, bl.y];
		bl.addEventListener(MouseEvent.MOUSE_OUT, onMO); //злосчастный перенос строчки
		}
Получается если бы я прямо в классе рисования шариков Ball добавил обработчики на движение мыши, то все работало бы...) Задумаюсь теперь серьезней об такой разгрузке кода.. если я все правильно понял))

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Выше я приводил код класса который рисует шарики. Этот класс называется Ball. В нем соответственно для рисования использую graphics.
Замечательно. Но я не об этом. О том, что изменять положение шарика Вы собрались, перерисовывая его графикс.
Но это не Ваша вина.
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Да, но у вас все еще работает одна ссылка на все шарики. Я могу быть не прав, но может в массив их запихнуть все?)

Насчет добавить в класс обработчик события да, я это имел ввиду, кидая вам класс RandomBall. Там класс и в нем и обработчик и рисование шарика.
Единственное, что он берет извне - координаты где нарисовать его в первые раз и куда он будет возвращаться.

Старый 22.08.2012, 22:27
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 39  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Цитата:
Я могу быть не прав, но может в массив их запихнуть все?)
Так, а зачем) что мне это даст? у меня шарики и так отправляются в свободный полет.. единственное, меня смущает, то что шарики возвращаются рывками, в два захода, с паузой...

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

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Это кстати одновременно и странно и интересно Я думал вы специально это сделали, чтобы они как гусеницы подползали))

Что даст... Вообще, если вы не собираетесь их потом удалять поочередно или удалять будете просто с помощью событий, для каждого отдельно - ничего. Не знаю, я привык, чтобы у каждого объекта была своя ссылка. В одном прошлом случае, пронеси кучу экземпляров через одну переменную - приводило к зависаниям и остановке анимации (безсылочные экземпляры попадали в Garbage Collection).

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

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

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


 


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


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