Публичные статические функции в AS 3.0 - PullRequest
0 голосов
/ 13 декабря 2011

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

Вот так:

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);
    }
}
}

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

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

У вас есть пара проблем.Первое: чтобы вызвать статический метод, вы должны обратиться к классу.

Bus.addBus();

Это позволяет флэш-памяти знать, что вы имеете в виду статический метод класса шины, а не метод с именем "addBus ()" в классе Main.

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

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

Кроме того, у вас могут быть дальнейшие планы для статического метода 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;
        }
    }
}
}

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

0 голосов
/ 13 декабря 2011

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

0 голосов
/ 13 декабря 2011

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

РЕДАКТИРОВАТЬ: Я не думаю, что это был ответ, который вы искали. Ваша статическая функция ничего не знает об экземпляре класса, в котором она находится. Вы не можете вызвать addChild () внутри статической функции, потому что она не знает, что ей назначить. Вам нужно передать экземпляр вашего основного класса или рабочей области в функцию addBus.

Например:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...