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

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

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

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
По умолчанию Несколько вопросов связанные с некоторыми моментами AS

Здрава всем.
Народ я новичок а AS 3 и у меня возникли несколько вопросов которые мешают идти дальше , просто появились некоторые недопонимания в ходе обучения , и если Вы не против то разрешите изложиться.
1.
This, да банальное this, его я вижу часто но сам не использую.
Как я понимаю this – это ссылка на объект и смотря где он пишется .
Наверное я сам отвечу на вопрос ну или Вы меня поправите на примере:
То есть:
Код AS3:
package 
{
	public class MyClass
	{
		private var Name:String = "hi";
		public function MyClass()
		{
			this.x +=  100;
			this.Name;
			addChild(this);
		}
	}
}
и
Код AS3:
package 
{
	public class MyClass
	{
		private var Name:String = "hi";
		public function MyClass()
		{
			MyClass.x +=  100;
			MyClass.Name;
			addChild(MyClass);
		}
	}
}

это одно и тоже так ведь, если нет то поправьте меня.
2.
Теперь о «super ()» . Как пишется в helpe инструкция super - вызывает суперклассовую или родительскую версию метода или конструктора, например:
Код AS3:
Super () // Вызывает родительскую версию конструктора;
Super.method(“HI”) // Вызывает родительскую версию метода;
Super.prop // Вызывает родительскую версию свойства или такого не бывает ?
Если все не так то поправьте меня.
3.
Оператор “as” – он меня больше всех пугает. Как я понимаю интерпретатор проверяет нет ли у первого операнда (тип: Sprite) таких же свойств и методов как у и второго операнда (тип: MovieClip) и если таковой есть то Sprite может быть как и MovieClip так и Sprite то есть я могу использовать некоторые методы и свойства MovieClip для объекта Sprite(который уже movieclip) и наоборот.
4.
Обращение к объектам и символам. Здесь я затрудняюсь разобраться , сейчас поясню на примере:
Допустим имеется класс “B” в конструкторе которой будет для примера Кнопка и Мувик.
Код AS3:
package 
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.display.SimpleButton;
	public class B extends Sprite
	{
		public var _btn:SimpleButton = Btn; // Кнопка и мувик уже перенесенные из библиотеки на сцену 
		public var _star:MovieClip = Star; // в ручную , имена написал в свойствах не в свойтвах символа
		public function B()
		{
			_btn.x +=  100;
			_btn.addEventListener(MouseEvent.CLICK,onBtn);
		}
		public function onBtn(e:MouseEvent)
		{
			trace("HI");
		}
	}
}
и класс “A” где и создается объект “B”
Код AS3:
package 
{
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	public class A extends Sprite
	{
		private var _A:B;
		public function A();
		{
			_A = new B();
			addChild(_A);
		}
	}
}
Цитата:
Выходит ошибка:
Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at B
А так робит корректно:
Код AS3:
package 
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.display.SimpleButton;
	public class A extends Sprite
	{
		public var _btn:SimpleButton = Btn;
		public var _star:MovieClip = Star;
		public function A()
		{
			_btn.x +=  100;
			_btn.addEventListener(MouseEvent.CLICK,onBtn);
		}
		public function onBtn(e:MouseEvent)
		{
			trace("HI");
		}
	}
}
не пойму почему.


Последний раз редактировалось zackscript; 18.01.2016 в 12:10.
Старый 04.01.2016, 15:53
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 2  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
zackscript, всё не так. Класс - это не объект.
this - обращение к объекту(экземпляру класса).
Экземпляр класса - это то, что создаётся через new.
Каждый раз, когда вы создаёте экземпляр класса Tank - это будет новый танк, не тот, что был раньше.
MyClass.smth - обращение к статическому свойству.
as - приведение типа, проверяет, есть ли в цепочке наследования определённый тип, и если есть, возвращает объект с таким типом, он не проверяет свойства, а лишь цепочку наследования.
this/super пишется лауэркейсом.
1)
Код AS3:
package 
{
	public class MyClass extends Sprite//у вас ошибка, нет у вашего класса свойства свойства x, а вот так всё ок
	{
		private var Name:String = "hi";
		public function MyClass()
		{
			this.x +=  100;
			this.Name;
			//addChild(this); - это непонятная фигня, добавление себя в себя (идентично this.addChild(this))
		}
	}
}
идентично
Код AS3:
package 
{
	public class MyClass extends Sprite
	{
		private var Name:String = "hi";
		public function MyClass()
		{
			x +=  100;
			Name;
		}
	}
}
Приставки this. и super. - необязательны, их можно опустить.
2)
Неправильно. super всегда пишется лауэркейсом. Во-первых, так красиво, во-вторых, это работает.
Код AS3:
super () // Вызывает родительскую версию конструктора;
super.method(“HI”) // Вызывает родительскую версию метода;
super.prop // Вызывает родительскую версию свойства или такого не бывает ?
3)
MovieClip as Sprite работает потому, что MovieClip наследуется от Sprite.

Sprite as MovieClip работать не будет.

4)
Цитата:
Допустим имеется класс “B” в конструкторе которой будет для примера Кнопка и Мувик.
В вашем коде кнопка и мувик не в конструкторе, а в свойствах экземпляра.
Код AS3:
public function B()
		{
			_btn.x +=  100;
			_btn.addEventListener(MouseEvent.CLICK,onBtn);
		}
Вот это - конструктор, не путайте его ни с чем другим.
Цитата:
Выходит ошибка:
Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at useBtn
Не вижу в коде функции useBtn.

Цитата:
не пойму почему.
Вероятно, класс A присобачен к мувику, в котором расположены Btn и Star, а B - нет.
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 04.01.2016 в 16:48.
Старый 04.01.2016, 17:17
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 3  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
ZackMercury, с this почти разобрался , то есть если он и в методе некоего класса то это звучит так "задать такие то координаты и зарегистрировать событие текущему методу "
Код AS3:
public function func()
		{
			this.x +=  100;
			this.addEventListener(MouseEvent.CLICK,onFunc);
		}
с super тоже понятно.
А вот если MovieClip as Sprite приведу в тип то он может быть как и Спрайт так и МувиКлип ?

в 4-ой проблеме я сохранил кнопку и мувик в переменных что здесь не так то ? а в конструкторе я к переменной _btn повесил событие .
Вопрос в том как мне обратится к ним как манипулировать ими непосредственно в классе "B".
Или создать экземпляры кнопки и мувиклипа в конструкторе класса "B" и добaвить в список отображения но тогда придется программно задать им координаты и другие т.п. свойства а этого делать я не хочу.


Последний раз редактировалось zackscript; 04.01.2016 в 22:22.
Старый 04.01.2016, 17:19
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
с this почти разобрался , то есть если он и в методе некоего класса то это звучит так "задать такие то координаты и зарегистрировать событие текущему методу "
Нет, в вашем примере this ссылается на все тот же экземпляр класса.
Напишите trace(this); и узнайте, что именно в this находится. Не бойтесь экспериментировать.
__________________
тут я

Старый 04.01.2016, 17:20
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 5  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
Цитата:
Вероятно, класс A присобачен к мувику, в котором расположены Btn и Star, а B - нет.
Вы имеете ввиду сто класс A привязан к документу ?

Добавлено через 1 минуту
КорДум понятно.

Старый 04.01.2016, 17:41
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Вы имеете ввиду сто класс A привязан к документу ?
Или так, или связан с мувиком, в котором лежат ваши объекты.
... Если не писать this вообще, то всё станет очевидным.
this не имеет никакого отношения к методам, он ссылается на текущий экземпляр класса, в котором вызывается.
this.x или super.x, или просто x - всё одинаково будет работать, так как обращение происходит к свойству экземпляра.
this пишут либо те, кто привык писать this, либо там, где он действительно нужен(чтобы, например, передать ссылку на экземпляр текущего класса в другой класс).

Давайте я вам пример напишу, чтобы более понятно было.
Код AS3:
class Main extends Sprite
{
   public function Main()
   {
      var bucket:Bucket = new Bucket();
      for(var i:int = 0; i < 10; i ++)
         var apple:Apple = new Apple(bucket);
 
      trace(bucket); // выведет 10 раз Apple через запятую
   }
}
 
class Bucket 
{
   private var content:Array;
   public function Bucket()
   {
      content = [];
   }
 
   override public function toString():String
   {
      var str:String = "";
      for(var i:int = 0; i < content.length; i ++)
         str += content[i].toString() + ((i == content.length - 1)?".":", ");
      return str;
   }
 
   public function put(elem:*):void
   {
      content.push(elem);
   }
}
 
class Apple 
{
   public function Apple(bucket:Bucket)
   {
      bucket.put(this);
   }
 
   override public function toString():String
   {
      return "Apple";
   }
}
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 04.01.2016 в 18:13.
Старый 04.01.2016, 22:33
zackscript вне форума Посмотреть профиль Отправить личное сообщение для zackscript Найти все сообщения от zackscript
  № 7  
Ответить с цитированием
zackscript
 
Аватар для zackscript

Регистрация: Jan 2014
Сообщений: 181
Отправить сообщение для zackscript с помощью Skype™
Ну с 3-мя вопросами я разобрался а вот с 4-ой затруднения, серьёзно.
Главный класс "А" привязан к документу к Вашему сведению , на сцене же кнопка с именем "Btn" и мувик "Star".

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну так класс В-то ничего о них не знает, они же в экземпляре документ-класса А.

Добавлено через 10 минут
То, что Вы называете "на сцене" — это экземпляр Документ-класса, в вашем случае — экземпляр А.
При запуске флэшки он будет создан автоматически и добавлен на стейдж. Это главный класс приложения, обычно называемый Main. Все остальное содержимое является его детьми. В частности, экземпляр класса В, который Вы создаете в первом примере. Но дети ничего не знают друг о друге. Только Мейн знает, кого и зачем он породил.
Кнопка и клип, нарисованные Вами на сцене, являются детьми А, создаваемыми "автоматически". Ссылки на них уже есть в А — это их Вы используете, создавая дополнительные переменные (по сути ненужные). Но в экземпляре класса В, конечно же, нет никаких данных о детях класса А, с чего бы.

Добавлено через 25 минут
ZackMercury
Цитата:
this.x или super.x, или просто x - всё одинаково будет работать, так как обращение происходит к свойству экземпляра.
this пишут либо те, кто привык писать this, либо там, где он действительно нужен(чтобы, например, передать ссылку на экземпляр текущего класса в другой класс).
Я надеюсь, Вы это несерьезно?
__________________
Reality.getBounds(this);

Старый 04.01.2016, 23:40
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 9  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Wolsh, вполне серьёзно.
Пример смешной, не спорю, но иногда бывает нужно делать и такое.
Согласен, это пример плохой архитектуры, но бывает делать что-то более глобальное для мелких проектов просто нет никакого смысла.
__________________
There is no thing in this world that is not simple.

Старый 05.01.2016, 00:29
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Код AS3:
   override public function toString():String
   {
      var str:String = "";
      for(var i:int = 0; i < content.length; i ++)
         str += content[i].toString() + ((i == content.length - 1)?".":", ");
      return str;
   }
Почему-то здесь очень напрашивается .join

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

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

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


 


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


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