我想在游戏中创建一个奇怪的问题。起初我创建了一个没有外部类的项目。 在根上我有三个角色和一个等级。还有一个关键监听器的脚本,我有eventListeners来注册级别,levelElements,硬币和字符。然后我在库中有一个CharacterControl MovieClip。此MovieClip包含角色行为。例如步行,跳跃,空转,重力如果不碰撞到地面。还有不同的事件和eventListeners。 脚本在时间轴上。如果我在两个时间轴中调用一个跟踪函数,则在CharacterController之前调用root。
在我的下一个练习之后,我创建了一个文档类Main。现在有所有根脚本。对于CharacterController,我还复制了时间轴代码并将其放入外部类中。
现在我的问题是在调用主类之前调用CharacterController类。这导致无法按正确顺序调用eventListener和事件的问题。发生了一些错误。没有硬币和没有角色在地面或平台上碰撞。一切都在崩溃。
我怎样才能实现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");
}
}
}
以下是我项目配置和结构的一些图片:
我需要Main作为第一个叫。我认为这是as3中的一个基本问题。
答案 0 :(得分:1)
您可以在属性窗格中创建舞台Main.as的类文件。
修改:有趣。刚刚复制了这个。我相信那时flash / air构造了元素,所以他们已经准备好被放在舞台上,而不是先构建舞台,然后再构建元素。你应该将你想要为你的圈子执行的代码放在某种init函数中并执行它。
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");
}
}
}
答案 1 :(得分:0)
时间轴代码:
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
这可能对其他人有帮助。
只有一件事。对于来自同一类的不同对象,最好使用数组。位置(可能)应该是随机的。