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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.07.2009, 23:33
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 1  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
По умолчанию Ощибка 1120. Как обойти?

возникла скользкая проблема. Дабы не выкладывать весь код представлю схематично основные моменты.

Есть исполняемый класс A (по имени .fla файла) в безымянном пакете и в той же директориию
В этом классе создается экземпляр класа B и С (AS-файлы находится в отдельной папке уровнем ниже и принадлежат одному пакету). У класса B есть свойство bb (класса МувиКлип).

На новом кадре скрипт должен вызывать функцию, которая (при определенном положении курсора мыши относительно стола) должна двигать мувиклип внутри экземпляра класса B .

Но вместо этого (по адресу C.AS, line *) я вижу ошибку 1120 сразу на два слова. Т.е. неизвестное значение на stage и на b (экземпляр класса B, созданный в исполняемом классе A)
Это точно не из-за import ...;. Импортировал в класс С все "родные" классы. Не помогло ни для одного, ни для другого.

Выглядит примерно так:
Код AS3:
package
{
	import uti.*;
	...
 
	public class A
	{
		public var b:B;
		public var c:C;
 
		public function A
		{
			b = new B;
			addChild(b)
 
			c = new C;
 
			addEventListener(Event.ENTER_FRAME, c.eventFrame)
		}
	}
}
 
package uti
{
	import ...;
	...
 
	public class B
	{
		public var bb:MovieClip;
 
		public function B
		{
			...
			bb.x = 0;
			bb.y = 0;
                        addChild(bb);
		}
	}
}
 
package uti
{
	import ...;
	...
 
	public class C
	{
		public var mover:Number = 5;
 
		public function C
		{
 
		}
 
		public function eventFrame():void
		{
			if (stage.mouseX >= 520 && stage.mouseY >= 370)
			{
				b.bb.x -= mover;
				b.bb.y -= mover;
			}
		}
	}
}
с другой стороны. В обычном таймлайне прекрасно работает такой код и выполняет нужную операцию:
Код AS3:
var bb:Kvadrat = new Kvadrat();
bb.x = 300;
bb.y = 200;
addChild(Map);
 
addEventListener(Event.ENTER_FRAME, mover);
 
function mover(e:Event):void
{
if (stage.mouseX >= 520&&stage.mouseY >= 370)
{
	bb.x += 1;
	bb.y += 1;
}
}


Последний раз редактировалось switcher!; 12.07.2009 в 23:36.
Старый 13.07.2009, 00:39
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 2  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Классы A и B сидели на трубе не расширяют класс Sprite или MovieClip, поэтому у них нет метода .addChild(...) и даже класс EventDispatcher, поэтому метода .addEventListener(...) у них тоже нету.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 13.07.2009, 01:33
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 3  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
Извиняюсь, торопился и не указал - что классы A и B расширяют класс MovieClip.

А вот C действительно не расширял - я подумал, что он как класс-обработчик событий просто не нуждается в расширении МувиКлипа, ведь он и не должен отображатся на экране. Он только лишь изменяет числа в экземплярах других классов...

Поставил ему расширение от Мувиклипа. Теперь компилятор не ругается на stage. Но по прежнему ругается на b (в исполняемом классе A)... Хотя b существует и корректно отображается, если закомментировать оператор if в классе C

Напомню, что ошибка (судя по сообщениям компилятора) возникает именно в C.as на линии как раз:
Код AS3:
				b.bb.x -= mover;
				b.bb.y -= mover;


Последний раз редактировалось switcher!; 13.07.2009 в 01:38.
Старый 13.07.2009, 01:41
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 4  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
В классе C нету поля .b, и в методе экземпляра C, работающем в контексте этого экземпляра, не видно поле .b экземпляра класса A. Отсюда и ошибка.
__________________
...убивать людей не удовольствия ради, но для еды.


Последний раз редактировалось DeliMIter; 13.07.2009 в 01:44.
Старый 13.07.2009, 01:54
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 5  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
От это у меня сейчас взорвался мозг всего с одного предложения

поле - я так понял есть свойство объекта. Так... его, поля, и не должно быть. Ссылка идет на поле другого класса...
Вторую половину не воткнул вообще

и почему .b вы написали через точку ?

Старый 13.07.2009, 01:58
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 6  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Чтобы указать, что это свойство.

Метод в контексте класса C не имеет доступа ни к чему, кроме полей экземпляра класса C и полученных аргументов.

Просвещайся:

http://noregret.org/tutor/scope/
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 13.07.2009, 02:11
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 7  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
как .b свойство ? b это ж полноценная переменная, хранящая экземпляр класса B, по крайней мере - это четко прослеживается в классе A.
Може .bb? Это как раз полноценное свойство...

Цитата:
Метод в контексте класса C не имеет доступа ни к чему, кроме полей экземпляра класса C и полученных аргументов.
как-то печально... а есть возможность обратить его в истинную веру?
+ читаю пока ссыль (жаль только - там второй скрипт)

Старый 13.07.2009, 02:33
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 8  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Приведём аналогию из обычного мира. Если ты C пошёл в зоопарк и твой глаз A передал тебе событие о том, что ты видишь слона B, то это ещё не означает, что ты имеешь возможность помахать хоботом B.bb. А то, что в твоей архитектуре не ты содержишь глаз, а глаз - тебя, то это явная недоработка архитектора.

Свойство = поле объекта. Это синонимы.

Выучи базовые принципы ООП, т.е. что такое объекты, методы, поля и свойства, контексты и области видимости. Если ты хочешь программировать на ООП-языке, то без этого не обойтись. Если только, конечно, тебе не доставляет удовольствие спотыкаться на каждом шагу.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 13.07.2009, 02:44
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 9  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
понял, чего и опасался...
основательно переписывать код очень не хотелось

а за предметный инструктаж - искренняя благодарность!

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

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

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


 


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


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