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

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

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

Регистрация: Nov 2008
Сообщений: 88
По умолчанию Как обратиться к переменной класса из другого класса?

Добрый день!

Есть класс документа main с константой WIN_WIDTH

Game/main.as
Код AS3:
package Game {
...
    public class Main extends MovieClip {
    ...
        public const WIN_WIDTH = stage.stageWidth;
    ...
}
Мне нужно обратиться к этой константе из другого класса Ship:

Game/Ship.as
Код AS3:
package Game {
...
    public class Ship extends MovieClip {
    ...
       public function Ship() {
           x=WIN_WIDTH/2;
       }
...
}
На это компилятор ругается: 1120: Access of undefined property WIN_WIDTH.

Подскажите как правильно к ней обратиться?


Последний раз редактировалось maklaus; 16.12.2008 в 18:55.
Старый 16.12.2008, 19:15
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 2  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Если хотите выровнять на сцене, то так выравнивать не надо. Используйте added_to_stage

А вообще static.

Старый 16.12.2008, 19:18
faust.d503 вне форума Посмотреть профиль Отправить личное сообщение для faust.d503 Найти все сообщения от faust.d503
  № 3  
Ответить с цитированием
faust.d503
 
Аватар для faust.d503

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
x=WIN_WIDTH/2; - как компилятор должен догадаться что вам нужна переменная WIN_WIDTH из класса Main. Он ищет ее в себе, не находит и естественно ругается.
Код AS3:
x= Main.WIN_WIDTH/2;
И константу сделать не только public, а еще и static.

Старый 16.12.2008, 19:23
tikhop вне форума Посмотреть профиль Отправить личное сообщение для tikhop Найти все сообщения от tikhop
  № 4  
Ответить с цитированием
tikhop

Регистрация: Jul 2006
Сообщений: 170
Можно использовать композицию.
Class A:
Код AS3:
package {
	import flash.display.Sprite;
 
	public class A extends Sprite
	{
		public function A()
		{
			var b:B=new B();
			trace(b.WIDTH);
		}
	}
}
Class B:
Код AS3:
package
{
	import flash.display.Sprite;
 
	public class B extends Sprite
	{
		public const WIDTH:Number=800;
 
		public function B()
		{
			super();
		}
 
	}
}
Можно еще использовать статические свойства класса.

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

блогер
Регистрация: Jul 2007
Адрес: Russia
Сообщений: 292
Записей в блоге: 5
Правильный вариант

Код AS3:
package {
import flash.display.Sprite;
 
public class A extends Sprite
{
public function A()
{
trace(B.WIDTH); // 800
}
}
}
 
 
package
{
import flash.display.Sprite;
 
public class B extends Sprite
{
public static const WIDTH:Number=800;
 
public function B()
{
}
}
}
В конструкторе B можно не писать super, его вызов будет неявным.
__________________
Оптимизация производительности на уровне кода

Старый 16.12.2008, 23:28
maklaus вне форума Посмотреть профиль Отправить личное сообщение для maklaus Найти все сообщения от maklaus
  № 6  
Ответить с цитированием
maklaus

Регистрация: Nov 2008
Сообщений: 88
ОК! Всем спасибо за ответы!!! =)

Старый 16.12.2008, 23:42
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от _Smirnoff Посмотреть сообщение
В конструкторе B можно не писать super, его вызов будет неявным.
Вполне себе будет явным, если этот B будут создавать, как экземпляр, в противном случае никаких вывозов конструктора не будет. Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри. Если же планируется создавать экземпляры такого класса, то даже в случае, если конструктор пуст, он обязателен к описанию вместе с вызовом супер-конструктора.

Старый 17.12.2008, 10:17
maklaus вне форума Посмотреть профиль Отправить личное сообщение для maklaus Найти все сообщения от maklaus
  № 8  
Ответить с цитированием
maklaus

Регистрация: Nov 2008
Сообщений: 88
Вопрос в догонку. Если исправить код на:

Код AS3:
package Game {
...
    public class Main extends MovieClip {
    ...
        public static const WIN_WIDTH = stage.stageWidth;
    ...
}
 
package Game {
...
    public class Ship extends MovieClip {
    ...
       public function Ship() {
           Main.x=WIN_WIDTH/2;
       }
...
}
то компилятор ругается:

1120: Access of undefined property stage.

Как исправить?

Старый 17.12.2008, 13:06
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Дождаться события ADDED_TO_STAGE и присвоить значение стат. переменной.

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

блогер
Регистрация: Jul 2007
Адрес: Russia
Сообщений: 292
Записей в блоге: 5
Цитата:
Сообщение от __etc Посмотреть сообщение
Вполне себе будет явным, если этот B будут создавать, как экземпляр, в противном случае никаких вывозов конструктора не будет. Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри. Если же планируется создавать экземпляры такого класса, то даже в случае, если конструктор пуст, он обязателен к описанию вместе с вызовом супер-конструктора.
Согласен с тем, что "Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри." Т.к. если грубо говорить, то этот класс превращается в enum.

B наследуется от Sprite. Конструктор Sprite не принимает инициализационных значений, а это значит, что в конструкторе наследника super можно не вызвать явно. Смысл был такой.
__________________
Оптимизация производительности на уровне кода


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

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

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


 


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


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