2011-12-13 2 views
-1

Я кодирую небольшую флеш-игру и не могу получить доступ к различным функциям между классами. В C# я привык делать это статичным, но у меня проблемы с ним.Публичные статические функции в AS 3.0

Здесь идет:

Main.as

package 
{ 
import Bus; 
    import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Main extends Sprite 
{ 
    public function Main() 
    { 
     addBus(); 
    } 
} 
} 

Bus.as

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Bus extends Sprite 
{ 
    public function Bus() 
    { 
    } 

    private static function addBus() 
    { 
     var bus:Bus = new Bus(); 

     bus.x = stage.stageWidth/2; 
     bus.y = stage.stageHeight/2; 

     addChild(bus); 
    } 
} 
} 

Почему я не могу сделать это?

+0

Вы пропустили Bus.addBus(), tut tut – Ryan

ответ

0

Ваша статическая функция в классе шины задана как конфиденциальная. Если вы сделаете его общедоступным, он должен работать нормально.

EDIT: Я не думаю, что это был ответ, который вы искали. Ваша статическая функция ничего не знает о экземпляре класса, в котором он находится. Вы не можете вызвать addChild() в статической функции, потому что он не знает, что ему назначить. Вам нужно передать экземпляр вашего основного класса или этапа в функцию addBus.

Например:

public static function addBus(mainObj) { 
    //do your stuff here 
    mainObj.addChild(bus); 
} 

Тогда ваша основная функция будет называть addBus (это)

0

Кроме того, я считаю, нужно добавить Bus.addBus() к вам основной функции, но это было некоторое время, так как я сделал AS3

1

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

Bus.addBus(); 

Это позволяет вспышки знать, что вы имеете в виду статический метод шины класса, а не метод, называемый «addBus()» в главном классе.

Во-вторых, в вашем методе Bus.addBus() вы ссылаетесь на нестатические переменные. Это может вызвать проблемы. В частности, вы ссылаетесь на объект сцены, который будет нулевым, поскольку статический этап отсутствует. Вместо этого вам нужно будет либо передать ссылку на сцену, либо вы можете вернуть новую шину из этой функции и позволить вызывающему классу добавить ее в список отображения соответствующим образом.

Я бы порекомендовал второй подход.

В качестве альтернативы, вы можете иметь дополнительные планы для статического метода addBus(). Но я хотел бы отметить, вы могли бы легко выполнить ту самую функциональность с помощью конструктора, как так:

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Bus extends Sprite 
{ 
    public function Bus(stageReference:Stage) 
    { 

     this.x = stageReference.stageWidth/2; 
     this.y = stageReference.stageHeight/2; 

     stageReference.addChild(bus); // This is kind of bad form. Better to let the parent do the adding. 
    } 
} 
} 

========================= ============================

Правки в ответ на комментарий

в ActionScript, статические методы являются исключением, а не правило. Таким образом, чтобы создать шину, вы измените свой код следующим образом. Комментарии объясняют код.

package 
{ 
import Bus; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.Stage; 

public class Main extends Sprite 
{ 
    public function Main() 
    { 
     // Add a new member variable to the Main class. 
     var bus:Bus = new Bus(); 
     // we can call methods of our Bus object. 
     // This imaginary method would tell the bus to drive for 100 pixels. 
     bus.drive(100); 
     // We would add the bus to the display list here 
     this.addChild(bus); 
     // Assuming we have access to the stage we position the bus at the center. 
     if(stage != null){ 
       bus.x = stage.stageWidth/2; 
       bus.y = stage.stageHeight/2; 
     } 
    } 
} 
} 

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

+0

Я не уверен, как вызвать функцию в Main.as. Будете ли вы тогда делать Bus.addBus (?). Кроме того, я не могу получить доступ к функции, если я не статирую ее? Основная идея заключалась в том, что я мог выполнять всю функцию в Bus.as, а затем просто называть ее в Main.as, как показано (Bus.addBus();) –

+0

Добавляем больше, чтобы ответить выше. –

Смежные вопросы