Форум 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=202425)

Fogflasher 15.07.2013 12:27

Разборка Мука: Видимость переменной.
 
Всем привет.

Разбираю один из примеров Мука, связанный с текстовыми эффектами.
Немного переработал пример так, чтобы он был более универсальным.

Документ Класс выглядит так:

Код AS3:

package
{
  import flash.display.*;
  import flash.text.*;
 
  public class TextTo300_demo extends Sprite
  {
 
 
    public function TextTo300_demo()
        {
 
          private var t:TextTo300_Timer;        //Method1: Switch one of this method
          t = new TextTo300_Timer( );               
 
//          private var t:TextTo300_Frame;        //Method2: Switch one of this method
//          t = new TextTo300_Frame();               
 
      t.text          = "Hello";
      t.autoSize      = TextFieldAutoSize.LEFT;
 
      addChild(t);
 
      // Start the animation
      t.start( );
    }
 
  }
}

С ним логически связаны два класса, которые выполняют одно и то же, но различными методами:

Первый, TextTo300_Frame, основан на событии ENTER_FRAME:
Код AS3:

package
{
          import flash.display.*;
          import flash.events.*;
          import flash.text.*;
 
          public class TextTo300_Frame extends TextField
          {
                public function TextTo300_Frame( )
                {
                }
 
                public function moveTextRight (e:Event):void
                {
                          if (x <= 300)
                          {
                                x += 10;
 
                                if (x > 300)
                                {
                                  x = 300;
                                }
                          }
                          else
                          {
                                stop( );
                          }
                }
                public function start ( ):void
                {
                          // Start playing the animation
                          addEventListener(Event.ENTER_FRAME, moveTextRight);
                }
                public function stop ( ):void
                {
                          // Pause the animation
                          removeEventListener(Event.ENTER_FRAME, moveTextRight);
                }
          }
}

А второй, TextTo300_Timer, на таймере:

Код AS3:

package
{
  import flash.display.*;
  import flash.events.*;
  import flash.utils.*;
  import flash.text.*;
 
  public class TextTo300_Timer extends TextField
  {
    private var timer:Timer;
 
    public function TextTo300_Timer()
        {
      timer = new Timer(50, 0);
      timer.addEventListener(TimerEvent.TIMER, moveTextRight);
    }
 
    public function moveTextRight (e:Event):void
        {
      if (x <= 300)
          {
        x += 10;
        if (x > 300)
                {
          x = 300;
        }
      }
          else
          {
        stop( );
      }
    }
    public function start ( ):void
        {
      // Start playing the animation
      timer.start( );
    }
 
    public function stop ( ):void
        {
      // Pause the animation
      timer.stop( );
    }
  }
}


И вот, когда я запускаю проект с одним из этих методов (второй закоментарен), то получается такая ошибка:

Цитата:

1013: The private attribute may be used only on class property definitions.
private var t:TextTo300_Timer; //Method1: Switch one of this method

И вот тут возникают два вопроса:

1. Что не так? Какие-такие декларации уровня свойства класса?

2. Если изменить тип переменной на public или internal, то тоже выдается ошибка...
Но если ПРОСТО ТУПО УБРАТЬ тип видимости переменной (или как там правильно называть определители public, private?), то код работает ОК : )
Здесь непонятно, а какой же тип тогда у переменной, когда ничего не указано?

TWETTI 15.07.2013 12:34

Атрибут private не может быть использован в методах класса.
Замените:
Код AS3:

...
public class TextTo300_demo extends Sprite
{
 
    public function TextTo300_demo()
    {
        private var t:TextTo300_Timer;        //Method1: Switch one of this method
        t = new TextTo300_Timer( );               
...

На:
Код AS3:

...
public class TextTo300_demo extends Sprite
{
    private var t:TextTo300_Timer;
 
    public function TextTo300_demo()
    {
        t = new TextTo300_Timer( );               
...

2. Переменные, объявленные в методах, будут видны только в них. В методах не надо писать private/public/protected/internal. Эти атрибуты используются при объявлении переменных уровня класса.

Fogflasher 15.07.2013 12:45

TWETTI, всё получилось спасибо.

Вот, только щас дошло, что такое class property definitions, эхе-хе.

carrotoff 15.07.2013 12:47

В описании ошибки написано же все.

Модификатор доступа (private, public, .. etc) можно вешать только на свойство класса, а не на локальную переменную метода. То есть, внутри метода/функции просто пишем
Код AS3:

var property:int = 0;

а для свойства класса
Код AS3:

private var _property:int = 0;


Update: что-то я опоздал с ответом

Fogflasher 15.07.2013 12:52

carrotoff, ничего страшного. "Упрощай, Повторяй" (с), лол.


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

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