PDA

Просмотр полной версии : создание открытых переменных


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


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 доступ осуществляется через экземпляр класса
var myObject:MyObject
myObject.myPublicVar
где в классе MyObject переменная объявлена, как public var myPublicVar:…
В случае с public static var
доступ осуществляется через класс, то есть
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
уберите в функции init() все упоминания "var", иначе получается что у Вас объявлены три переменные, видимые из классов пакета, и три в локальной области видимости функции, и они не равны друг другу


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
_layer3_mc=new Cloud();
stage.addChild(_layer3_mc);



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

Genzo
01.07.2010, 16:08
Нельзя сделать _layer3_mc статическим так как он требует создания в констукторе или т.п.



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 методов.
protected var layer1:Sprite;

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

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

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

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

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 минуты
выдает ошибки
- еще бы он их не выдавал при отсутствии нескольких классов.

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

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

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