Основной класс не был первым классом, который был вызван в ActionScript 3.0
У меня странная проблема в игре, которую я хочу создать. Сначала я создал проект без внешних классов. В корне у меня есть три персонажа и один уровень. Также есть скрипт для ключевых слушателей, и у меня есть eventListeners для регистрации уровня, levelElements, монет и персонажей. Тогда у меня есть CharacterControl MovieClip в библиотеке. Этот мувиклип содержит поведение персонажа. Например, ходьба, прыжок, холостой ход, гравитация, если она не сталкивается с землей. Есть также разные события и eventListeners. Сценарии находятся на временной шкале. Если я вызову в обеих временных шкалах функцию трассировки, корень был вызван до CharacterController.
После этого в моем следующем упражнении я создал класс документов Main. Теперь есть все корневые скрипты. А для CharacterController я также скопировал код временной шкалы и поместил его во внешний класс.
Теперь моя проблема в том, что класс CharacterController вызывается до вызова основного класса. Это приводит к проблеме, заключающейся в том, что eventListener и events не могут быть вызваны в правильном порядке. Там происходит несколько ошибок. Никакая Монета и никакой Персонаж не сталкиваются на земле или платформе. Все падает.
Как я могу добиться, чтобы вначале вызывали Main? Стоит ли удалять персонажей и создавать их по сценарию?
РЕДАКТИРОВАТЬ: Хорошо, я приведу короткий пример, который показывает основные проблемы без сложного кода моей игры.
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
trace("main was called");
}
}
}
package {
import flash.display.MovieClip;
public class My_Circle extends MovieClip {
public function My_Circle() {
// constructor code
trace("circle was called");
}
}
}
Вот несколько фотографий конфигурации и структуры моего проекта:
Мне нужно, чтобы Мэйн позвонил первым. Я думаю, что это основная проблема в as3.
2 ответа
Вы сделаете файл класса вашей сцены Main.as в панели свойств.
Редактировать: интересно. Просто повторил это. Тогда я верю, что flash/air создает элементы, поэтому они готовы быть поставленными на сцену, а не строить сцену сначала, а элементы после. Вы должны поместить код, который хотите выполнить для своего круга, в какую-то функцию инициализации и выполнить ее в.
package
{
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main()
{
super();
trace("Hello");
(circle_mc as Circle).init();
}
}
}
Круг:
package
{
import flash.display.MovieClip;
public class Circle extends MovieClip
{
public function Circle()
{
super();
}
public function init():void
{
trace("World");
}
}
}
Хорошо, я нашел простое решение, как вы можете сделать это с помощью кода. Сначала я думаю, что это лучшее решение для создания объекта (круг, символ, что угодно) с помощью кода.
Код временной шкалы:
import flash.events.Event;
Main.setStageRef(this.stage); //Super-important
stop();
Код основного класса:
package {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.DisplayObject;
import flash.events.Event;
public class Main extends MovieClip {
public static var stageRef : Object = null;
var movieClipExample : My_Circle;
public function Main() {
this.addEventListener(Event.ENTER_FRAME,this.afterMainTimeLine);
stage.addEventListener("myEvent", myEventFunction);
}
public function afterMainTimeLine(e:Event) {
trace("Hello");
movieClipExample = new My_Circle;
movieClipExample.init();
stageRef.addChild(movieClipExample);
removeEventListener(Event.ENTER_FRAME, this.afterMainTimeLine);
this.addEventListener(Event.ENTER_FRAME,this.updateFunction);
}
public function updateFunction(e:Event){
movieClipExample.moveFunction();
}
public function myEventFunction(_event: Event) {
trace("myEvent was triggered");
}
//Getter/setter for stage
public static function setStageRef(_stage : Object) : void
{
stageRef = _stage;
}
public static function getStageRef() : Object
{
return stageRef;
}
}
}
Код объекта (как пример My_Circle):
package {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.DisplayObject;
public class My_Circle extends MovieClip {
public function My_Circle()
{
stageRef = Main.getStageRef();
trace("World");
this.x = x;
this.y = y;
var evt = new Event("myEvent", true);
stageRef.dispatchEvent(evt);
}
public function init():void
{
trace("Created Circle");
this.x = 300;
this.y = 100;
}
function moveFunction(){
this.y += 1;
}
}
}
Вывод следующий:
Hello
World
myEvent was triggered
Created Circle
Может быть, это может быть полезно для других.
Только одно. Для разных объектов из одного класса лучше использовать массив. Позиция (возможно) должна быть случайной.