Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   создание открытых переменных (http://www.flasher.ru/forum/showthread.php?t=141663)

Dr_Bra 01.07.2010 15:33

создание открытых переменных
 
В главном классе создаю переменные, с возможностью доступа к ним из дополнительных классов. Правильно ли я написал? Подскажите, как называются такие переменные, константы?

Код AS3:

package
{
        import flash.display.*;
        import flash.events.Event;
 
        public class WebSite extends Sprite
        {
                protected  var _layer1_mc:Sprite;
                protected  var _layer2_mc:Sprite;
                protected  var _layer3_mc:Sprite;
 
                public function WebSite():void
                {
                        if(stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(evt:Event = null):void
                {
 
                        trace(stage.stageHeight)
 
                        var _layer3_mc:Cloud_2=new Cloud_2();
                        stage.addChild(_layer3_mc);
                        _layer3_mc.x=stage.stageWidth/1.5;
                        _layer3_mc.y=stage.stageHeight/2;
 
                        var _layer2_mc:Bush=new Bush();
                        stage.addChild(_layer2_mc);
                        _layer2_mc.x=stage.stageWidth/2;
                        _layer2_mc.y=stage.stageHeight+200;
 
                        var _layer1_mc:Full_tree=new Full_tree();
                        stage.addChild(_layer1_mc);
                        _layer1_mc.x=stage.stageWidth/2;
                        _layer1_mc.y=stage.stageHeight;
 
                }
        }
}


easy.proger 01.07.2010 15:42

Вы о - protected var _layer1_mc:Sprite; ? так вы наоборот создали защищенные переменные …, а нада было public var _layer1_mc:Sprite; или public static var _layer1_mc:Sprite;
В случае
public var доступ осуществляется через экземпляр класса
Код AS3:

var myObject:MyObject 
myObject.myPublicVar

где в классе MyObject переменная объявлена, как public var myPublicVar:…
В случае с public static var
доступ осуществляется через класс, то есть
Код AS3:

MyObject.publicStaticVar

где в классе MyObject переменная объявлена, как public static var publicStaticVar

leofit 01.07.2010 15:48

1. у Вас дублируются переменные, уберите в функции init() все упоминания "var", иначе получается что у Вас объявлены три переменные, видимые из классов пакета, и три в локальной области видимости функции, и они не равны друг другу
2. Если вы оканчиваете название переменной на _mc, то она должна быть мувиклипом
3. Эти переменные не называются константами

Dr_Bra 01.07.2010 16:00

Вложений: 1
Цитата:

Сообщение от leofit (Сообщение 919224)
уберите в функции init() все упоминания "var", иначе получается что у Вас объявлены три переменные, видимые из классов пакета, и три в локальной области видимости функции, и они не равны друг другу

Код AS3:

package
{
        import flash.display.*;
        import flash.events.Event;
 
        public class WebSite extends Sprite
        {
                public static var _layer1_mc:Full_tree;
                public static var _layer2_mc:Bush;
                public static var _layer3_mc:Cloud;
                public static var _move:MoveObj;
 
                public function WebSite():void
                {
                        if(stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(evt:Event = null):void
                {
                        trace(stage.stageHeight)
 
                        _layer3_mc:Cloud=new Cloud();
                        stage.addChild(_layer3_mc);
                        _layer3_mc.x=stage.stageWidth/1.5;
                        _layer3_mc.y=stage.stageHeight/2;
 
                        _layer2_mc:Bush=new Bush();
                        stage.addChild(_layer2_mc);
                        _layer2_mc.x=stage.stageWidth/2;
                        _layer2_mc.y=stage.stageHeight+200;
 
                        _layer1_mc:Full_tree=new Full_tree();
                        stage.addChild(_layer1_mc);
                        _layer1_mc.x=stage.stageWidth/2;
                        _layer1_mc.y=stage.stageHeight;
 
                        _move:MoveObj=new MoveObj(_layer1_mc, _layer2_mc, _layer3_mc);
                }
        }
}

выдает ошибки:

leofit 01.07.2010 16:04

Код AS3:

_layer3_mc=new Cloud();
stage.addChild(_layer3_mc);

Добавлено через 1 минуту
Отбой, зачем static? Оставляйте протектед или просто паблик

Genzo 01.07.2010 16:08

Нельзя сделать _layer3_mc статическим так как он требует создания в констукторе или т.п.

Код AS3:

 
                public var _layer1_mc:Sprite;
                public var _layer2_mc:Sprite;
                public var _layer3_mc:Sprite;
 
                private function init(evt:Event = null):void
                {
                        trace(stage.stageHeight)
 
                        _layer3_mc =Sprite(new Cloud());
 
                        stage.addChild(_layer3_mc);
                        _layer3_mc.x=stage.stageWidth/1.5;
                        _layer3_mc.y=stage.stageHeight/2;
 
                        _layer2_mc=Sprite(new Bush());
                        stage.addChild(_layer2_mc);
                        _layer2_mc.x=stage.stageWidth/2;
                        _layer2_mc.y=stage.stageHeight+200;
 
                        _layer1_mc=Sprite(new Full_tree());
                        stage.addChild(_layer1_mc);
                        _layer1_mc.x=stage.stageWidth/2;
                        _layer1_mc.y=stage.stageHeight;
                }


Iv 01.07.2010 16:21

Есть замечания по коду:

1. Прежде всего, перейдите на вербльюжью нотацию - она используется в AS3 и многие редакторы ориентированы именно на нее. Не используйте подчеркивания вначале имени переменной - это делается лишь изредка и, как правило, применяется при создании get/set методов.
Код AS1/AS2:

protected  var layer1:Sprite;

2. Объявление публичной переменной - дело тонкое. Далеко не всегда это рекомендуется делать, а в вашем случае лучшим выбором возможно будет организация статического get метода (set явно не пригодится).
Второй вариант, рекомендуемый в общем случае - передать ссылки на экземпляры layer в нужные классы.

3. Про объявление локальных переменных уже сказали.

4. Часто инициализацию объектов можно смело вынести в объявление:
Код AS1/AS2:

private var layer:FullTree = new FullTree;

(не используйте венгерскую нотацию!!!)
К тому-же, если вы используете типизацию Sprite, то не сможете корректно достучаться до методов и свойств, FullTree.
Я использовал private, потому, что крайне маловероятно, что у рутового класса WebSite (если я правильно понял) будут потомки.

5. Ошибка логики вызова init. Мне сложно объяснить, но я поступил бы иначе.
В итоге, код вывглядел бы примерно так:

Код AS1/AS2:

package com.site {
        import flash.display.Sprite;       
        import com.site.layers.*;       
 
        public class WebSite extends Sprite {
 
                private static var _instance : WebSite;
                public function getInstance() : WebSite {
                        return _instance;
                }
 
                private var darkCloudLayer : DarkCloud = new DarkCloud();
                private var bushLayer : Bush = new Bush();
                private var fullTreeLayer : FullTree = new FullTree();
 
                public function WebSite() {
                        super();
                        initInstance();
                }
 
                private function initInstance() : void {
                        if (_instance) {
                                throw new Error("Class WebSite is singleton");
                                return;
                        }
                        _instance = this;
                        initiView();
 
                        // code here
                }
 
                private function initiView() : void {
                        addChild(darkCloudLayer);
                        // code here
                        addChild(bushLayer);
                        // code here
                        addChild(fullTreeLayer);
                        // code here
                }
        }
}

разумеется, всё это построено на некоторых предположениях относительно структуры проекта, в частности, что класс WebSite является рутовым.

Добавлено через 2 минуты
Цитата:

Сообщение от Dr_Bra (Сообщение 919227)
выдает ошибки

- еще бы он их не выдавал при отсутствии нескольких классов.

Добавлено через 4 минуты
Цитата:

Сообщение от Genzo (Сообщение 919230)
Нельзя сделать _layer3_mc статическим так как он требует создания в констукторе или т.п.

- это можно сделать без проблем, только придется делать класс синглетоном. Что в данном случае вполне возможно.

alexberkut 01.07.2010 18:47

Код:

_layer3_mc:Cloud=new Cloud();
убери двоеточие и классю Вот так:
Код:

_layer3_mc=new Cloud();


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

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