как передать переменную между классами AS3 - PullRequest
1 голос
/ 02 марта 2011

У меня проблема с передачей переменных между классами.

У меня есть один класс с именем GlobeView.as

Внутри этого есть функция, предназначенная для добавления маркеров на глобус

GlobeView.as -

public function addAdventureMarker( latitude:Number, longitude:Number, name:String=null ):void
    {
        var marker:Marker = new Marker();
        marker.name = name;
        placeMarker( marker, latitude, longitude );
    }

Эта функция создает новый экземпляр класса с именем Marker. В Marker.as есть функция, которая, помимо прочего, определяет цвет маркеров

Marker.as -

public function Marker()
    {
        super();

        var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
        var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
        var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
        var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
        var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
        var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );

        var materials:MaterialsList = new MaterialsList( { front:frontMaterial, back:backMaterial, left:leftMaterial, right:rightMaterial, top:topMaterial, bottom:bottomMaterial } );
        cube = new Cube( materials, width, depth, height );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onCubeOver, false, 0, true );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_OUT, onCubeOut, false, 0, true );
        cube.addEventListener( InteractiveScene3DEvent.OBJECT_CLICK, onCubeClick, false, 0, true );
        cube.geometry.vertices[0].x -= 4;
        cube.geometry.vertices[0].y += 4;
        cube.geometry.vertices[1].x -= 4;
        cube.geometry.vertices[1].y -= 4;
        cube.geometry.vertices[2].x += 4;
        cube.geometry.vertices[2].y += 4;
        cube.geometry.vertices[3].x += 4;
        cube.geometry.vertices[3].y -= 4;
        addChild( cube );
        cube.moveBackward( depth / 2 );
    }

Я пытаюсь определить переменную в GlobeView.as. например var markerColor: String;

Когда добавляется маркер, присвойте переменной значение например,

{
var marker:Marker = new Marker();
marker.name = name;
markerColor = "red";
placeMarker( marker, latitude, longitude );
}

Затем добавьте оператор if в класс маркера

, например

public function Marker()
    {
        super();

        if (markerColor=="red")
        {
            var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
            var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
            var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
            var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
            var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
            var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
        }

Надеюсь, это имеет смысл - вероятно, сделало это намного сложнее, чем нужно

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

Этот код проще и работает для меня.

В классе маркеров:

private var m_color:String;

public function markerColor(value:String):void {
        this.m_color = value;
}

И в основном классе:

var marker:Marker = new Marker();
marker.markerColor("red");
1 голос
/ 02 марта 2011

Почему бы не передать эти переменные в конструктор, например?

public function Marker( name: String, color: String = "blue" )
{
    super();
    this.name = name;
    if (color == "red")
    {
         // ...
    }
}

По умолчанию для строки цвета будет установлено значение "синий".Код, похоже, может использовать некоторый рефакторинг.Например, передайте параметр цвета напрямую (например, используйте uint и используйте эту переменную в конструкторе ColorMaterial):

public function Marker( name: String, color: uint )
{
    var material: ColorMaterial = new ColorMaterial( color, ... );
    // ...
}

Или еще лучше, иметь предварительно определенные списки материалов и передать один изте.

0 голосов
/ 02 марта 2011

Вы определяете «markerColor» как переменную в классе GlobeView и ссылаетесь на нее в классе Marker. Класс Marker не будет знать, каково значение GlobeView.markerColor, если вы не передадите его в класс Marker.

В вашем коде (ниже), markerColor никоим образом не связан с объектом маркера или классом маркера.

{
  var marker:Marker = new Marker();
  marker.name = name;
  markerColor = "red";
  placeMarker( marker, latitude, longitude );
}

Вы можете добавить свойство / переменную markerColor в класс Marker:

private var m_color:String
public function markerColor():String {
  return m_color;
}
public function set markerColor(value:String):void {
  this.m_color = value;
}

А затем измените свой код на что-то вроде:

{
  var marker:Marker = new Marker();
  marker.name = name;
  marker.markerColor = "red";
  placeMarker( marker, latitude, longitude );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...