2017-02-23 71 views
1

首先,我仍然是新的编码,所以对我来说很容易。在显示代码之前进行跟踪。我有一本关于如何使用ActionScript 3制作游戏的书,唯一的一点是,它主要在假设您使用Flash Builder一起工作而不是使用Adobe动画/ Flash的情况下工作。所以它有你做像嵌入图像的东西,我不知道如何改变代码来定义图像,这正是问题。然而与此同时,舞台即将以未定义的方式出现!我真的,我的意思是如何的阶段是不确定的......好吧任何方式,继承人的未定义的属性的一个示例:对象未定义,但它似乎是定义actionscript

/// 
class BetterScrolling extends Sprite 
    var ForegroundImage: Class; 
    var foregroundImage: DisplayObject = ForegroundImage(); 
    var foreground = ForegroundImage; 
/// 

的Theres一些代码在两者之间。

/// 
function BetterScrolling(){ 
    foreground.x = -((foreground.width - stage.width)/2); 
    foreground.y = -((foreground.height - stage.height)/2); 
    } 

/// 

此代码的意义在于创建滚动背景。不过,我有点复杂,因为我有一个X和一个Y变量,但是除了我的前景之外,我还有一个缓慢的背景。我现在链接到目前的完整代码,http://pastebin.com/WHg9DGsB即使它是一个愚蠢的代码,我为了某个原因而编写的代码中的每一个变化......所以请不要被其他错误分心,我确定在那里...现在只是我的图像的定义。

+0

Google.com ... **'AS3如何code'嵌入图像** **或'AS3负荷图像tutorial' ** .. –

+0

当您嵌入通过代码是你如何得到一个'Class'以实例作为'新XYZ();'.. –

回答

1

有一些问题会导致您的代码无法编译。

  1. 舞台在您的课程加载时不可用。任何不在函数内部的代码将在应用程序初始化时运行(在屏幕上甚至看到任何内容之前)。您的错误是由于以下几行:

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
    stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandHandler); 
    stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    

    当舞台尚不存在时,这些行在您的类声明中浮动。

    你想要做的是将该代码(以及任何不是变量或函数定义的代码)移动到一个函数中。如果你想让它立即运行,把它放在你的构造函数中(这个函数的名字与你的类相同)。然而,该阶段也并不总是可用但在你的构造,因此为了安全起见,你应该做到以下几点:

    function BetterScrolling() { 
        if(!stage){ 
         this.addEventListener(Event.ADDED_TO_STAGE, stageReady); 
        }else{ 
         stageReady(); 
        } 
    } 
    
    function stageReady(e:Event = null):void { 
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandHandler); 
        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    
        //any other code that needs the stage and should run as soon as possible 
    } 
    
  2. 你有一堆括号和代码似乎不属于任何地方的。 45 - 71行不能正确编译。最有可能的,你想在你的构造函数/台准备方法的代码一样,所以加在,你会有这样的事情:

    function BetterScrolling() { 
        if(!stage){ 
         this.addEventListener(Event.ADDED_TO_STAGE, stageReady); 
        }else{ 
         stageReady(); 
        } 
    } 
    
    function stageReady(e:Event = null):void { 
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandHandler); 
        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); 
    
        foreground.x = -((foreground.width - stage.width)/2); 
        foreground.y = -((foreground.height - stage.height)/2); 
    
        background.x = -((background.width - stage.width)/2); 
        background.y = -((background.height - stage.height)/2); 
    
        cloud.x = -((cloud.width - stage.width)/2); 
        cloud.y = -((cloud.height - stage.height)/2); 
    
        character.x = 370 
        character.y = 320 
    
        rightInnerBoundary = (stage.stageWidth/2) + (stage.stageWidth/4) 
        leftInnerBoundary = (stage.stageWidth/2) + (stage.stageWidth/4) 
        topInnerBoundary = (stage.stageHeight/2) + (stage.stageHeight/4) 
        bottomInnerBoundary = (stage.stageHeight/2) + (stage.stageHeight/4) 
    } 
    
  3. 您必须是空白类增值经销商,然后尝试实例他们

    var BackgroundImage: Class; 
    var backgroundImage: DisplayObject = BackgroundImage(); 
    

    这将导致运行时错误,因为BackgroundImage为空/未定义。很可能,您想要将FlashPro中的库对象作为类导出?为此,请右键单击库中的有问题的对象,然后转到它的属性。勾选'为actionscript导出'并给它一个类名。在这种情况下,将其称为BackgroundImage。然后你用替换上面代码:

    var backgroundImage:BackgroundImage = new BackgroundImage(); 
    

    顺便说一句,可以更安全地仅声明引用其他对象/类和构造函数实例化它们,你的类增值经销商。要改变这样说,这,更改上面的行这样的:

    var backgroundImage:BackgroundImage; 
    

    然后在你的构造函数,这样做:

    backgroundImage = new BackgroundImage(); 
    
+0

谢谢你这真的帮助,它似乎已经解决了这个给定的问题,并透露接下来,你会不会发生知道我为什么会与四个主要对象发生定义冲突?背景,前景,人物和云?我的代码是这样的: \t“\t VAR背景图片:类; \t \t VAR和backgroundImage:的BackgroundImage =新的BackgroundImage(); \t \t var backgroundImage:BackgroundImage; \t \t backgroundImage = new BackgroundImage();' 我不能让它显示为代码... –

+0

见我的答案的第三部分(如代码将无法工作,因为没有分配给'BackgroundImage'没有实际的类)。虽然你收到的确切错误是什么?要获取代码以便在注释中显示,请使用反引号''(与tilda相同的密钥) – BadFeelingAboutThis

+0

错误为1151:命名空间内部存在定义背景冲突。突出显示的代码是'var BackgroundImage:Class; \t \t VAR和backgroundImage:的BackgroundImage =新的BackgroundImage(); \t \t var backgroundImage:BackgroundImage; \t \t将backgroundImage =新的BackgroundImage();' 我已经创建了一个相应类的每个图像,但不是一个。作为文件,是必要的,以及? –

1

首先,DisplayObject.stage属性被定义当有问题的DisplayObject附加到显示列表。作为一般政策,永不尝试在构造函数中访问阶段。你需要订阅一个特定的事件,它会告诉你舞台是否真的有效。

public function IWannaStage() 
{ 
    // WRONG 
    x = stage.stageWidth >> 1; 
    y = stage.stageHeight >> 1; 

    // RIGHT 
    if (stage) onStage(); 
    else addEventListener(Event.ADDED_TO_STAGE, onStage); 
} 

private function onStage(e:Event = null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, onStage); 

    // Stage is really available from this point on. 
    x = stage.stageWidth >> 1; 
    y = stage.stageHeight >> 1; 
} 

其次,我想你试图错误地创建实例。如果ForegroundImage是一类,则:

A = ForegroundImage; // Wrong, you assign the reference to the class. 
B = ForegroundImage(); // Wrong, this actually is type casting. 
C = new ForegroundImage(); // Correct way to create a new instance of a class. 
D = new ForegroundImage; // If constructor does not need any arguments you can omit brackets.