Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать глобальные переменные между классами в AS3? (http://www.flasher.ru/forum/showthread.php?t=142177)

dedalx 14.07.2010 18:05

Как сделать глобальные переменные между классами в AS3?
 
Вообщем возникла такая проблема. В игре есть несколько разных классов в разных AS файлах.
Допустим у меня в основном классе документа есть переменная score в которой храниться количество очков. А в классе бонусов есть функция которая при столкновении героя с бонусом дает к примеру ему +100 очков.
Возникает вопрос - как правильно мне из стороннего класса изменить значиние переменной в основном классе (скажем так глобальной переменной, так как она и в других классах будет меняться и использоваться для алгоритмов).
Я понимаю что можно сделать к примеру (root as MovieClip).score+=100, но мне кажется что это не правильное решение с точки зрения AS3. Ведь получается что я к переменной обращаюсь по сути не через классы и объекты, а через root - главную сцену мувика как я понимаю.

Подскажите как правильно сделать "глобальные" переменные в основном классе чтобы я мог их менять и использоваться в других классах.

Хемуль 14.07.2010 18:19

2 dedalx:
Что-то сделать из экземпляра одного класса в экземпляре другого класса можно разными способами. Свойствами, методами, событиями...
Кстати, конструкция
Код AS3:

(root as MovieClip).score+=100

вызовет ошибку, поскольку у экземпляров класса MovieClip нет свойства score.

Сайлас 14.07.2010 18:22

Не вызовет, потому что мувиклип динамичный класс.

P.S. Тем не менее я считаю, что это некорректно.

dedalx 14.07.2010 18:25

Цитата:

Сообщение от Хемуль (Сообщение 922336)
2 dedalx:
Что-то сделать из экземпляра одного класса в экземпляре другого класса можно разными способами. Свойствами, методами, событиями...
Кстати, конструкция
Код AS3:

(root as MovieClip).score+=100

вызовет ошибку, поскольку у экземпляров класса MovieClip нет свойства score.

А практический пример? Я понимаю что могу сделать в главном клипе метод addScore какой добавляет переданное число очков. Вопрос в том как мне обратиться к этому методу класса главного документа из к примеру класса Bonus, то есть из другого класса? root.addScore(100)? Так это не сильно отличается от того что я показал код выше.
Сформулирую вопрос по другому - как называется объект основного класса документа чтобы я мог обращаться к его методам? Ведь как я понимаю он создается автоматически, какое у него имя? Или это и есть root?

А (root as MovieClip).score+=100 у меня прекрасно работает, также как и root.score+=100 если выбрать не "жесткую" компиляцию. Только это не верное решение.

Приведу пример: В делфи чтобы использовать функцию из другого класса мы просто подрубали нужный Unit к документу и спокойно юзали функции что есть в нем - к примеру просто GetSomething(3) без всяких адресаций к чему либо. Но если я импортирую основной класс документа в классе бонусов к примеру, я все равно не смогу манипулировать с переменными и функциями класса основного документа напрямую (как это можно в делфи). Как с этим быть во флеше?

-De- 14.07.2010 18:27

public static

dedalx 14.07.2010 18:31

Подробнее пожалуйста, с примером под мой вопрос. Какой класс надо делать public static или метод и как откуда использовать?

Хемуль 14.07.2010 18:32

2 dedalx:
Ну вот, взгляните:
http://greenethumb.com/article/11/gl...riables-in-as3

dedalx 14.07.2010 18:39

То есть в основном классе документа (engine.as к примеру я пишу):
public static var score:int;

в классе bonus я подрубаю сверху основной класс документа:
import game.engine;

и могу теперь в классе бонус просто образаться к переменной как engine.score? Так ?

А это нормально что у меня импортированы классы друг в друга, то есть в основном классе у меня import bonus, а в классе бонуса импорт основного import engine?

-De- 14.07.2010 19:05

Да, так, минусов такого обьявления не знаю (ну может компилятору придётся похуже, но замедления компиляции не замечал). Единственное что - доступ к статическим переменным почему-то медленнее, чем к нестатическими и потому конструкция, вроде той, что по ссылке выше (хотя она как по мне стрёмная весьма и я не так делал бы) может иметь смысл, т.к. можно сохранить у себя ссылку на что-то типа того обьекта vars. Но ни разу проблемы с производительностью не решались заменой статиков, так что это скорее для общего развития %)

Elser 15.07.2010 03:38

Создайте класс содержащий статические переменные (методы, гетеры/сеттеры) и импортируйте его в те классы в которых нужен доступ к глобальному коду
Код AS3:

package {
  public class Global{
    public static var str:String = "";
    public static var arr:Object;
    public static registerVar(name:String, value:* = null):void{
      if(arr[name] != undefined){
        arr[name] = value;
      }
    }
  .............................
  }
}

Код AS3:

package {
  import Global;
  public class Class1 {
    public function Class1(){
      trace(Global.str);
    }
  }
}

Код AS3:

package {
  import Global;
  import Class1;
  public class Class2 {
    private var class1:Class1;
    public function Class2():void{
      Global.str = "test";
      class1 = new Class1(); // trace output:test
    }
  }
}



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

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