0

从“ http://www.lynda.com/ActionScript-3-tutorials/projects-game-development/366-2.html ”学习动作脚本3.0及其“第1章>赢得比赛”,其中得分和伤害我们已定义,我的电影剪辑出现错误。

使用我必须制作并且没有从他们的文件中下载的三个电影剪辑:一个是“光标”,一个是有编码的“怪物”(看底部),第三个是导致问题的“mcEnergy”(是一个静态类,不应该是什么(对闪存编程来说真的很新)),它有三个帧来显示三个阶段的健康状况。

所以告诉我如何修复这个静态类错误,如果有帮助的话,无论如何都要在下面发布代码和错误。

提前致谢。

这三个错误是

    1119: Access of possibly undefined property totalFrames through a reference with static type Class.
Source:    energy = mcEnergy.totalFrames;


1061: Call to a possibly undefined method gotoAndStop through a reference with static type Class.
mcEnergy.gotoAndStop(energy);


1061: Call to a possibly undefined method gotoAndStop through a reference with static type Class.
mcEnergy.gotoAndStop(energy);

这是主要阶段代码

var monstersInGame:uint;
var monsterMaker:Timer;
var container_mc:MovieClip;
var cursor:MovieClip;
var score:int;
var energy:int;



function initializeGame():void
{
    monstersInGame = 10;
    monsterMaker = new Timer(1000, monstersInGame);
    container_mc = new MovieClip();
    addChild(container_mc);


    monsterMaker.addEventListener(TimerEvent.TIMER, createMonsters); 
    monsterMaker.start();


    cursor = new Cursor();
    addChild(cursor);
    cursor.enabled = false;
    Mouse.hide();
    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragCursor);


    score = 0;
    energy = mcEnergy.totalFrames;
    mcEnergy.gotoAndStop(energy);
}

function dragCursor(event:MouseEvent):void
{
    cursor.x = this.mouseX;
    cursor.y = this.mouseY;
}

function createMonsters(event:TimerEvent):void
{
    var monster:MovieClip
    monster = new Monster();
    monster.x = Math.random() * stage.stageWidth;
    monster.y = Math.random() * stage.stageHeight;
    container_mc.addChild(monster);
}

function increaseScore():void
{
    score ++;
    if(score >= monstersInGame);
    {
        monsterMaker.stop();
        trace("Winning!!!");
    }

}

function decreaseEnergy():void
{
    energy --;
    if(energy <= 0)
    {
        monsterMaker.stop();
        trace("You lose");
    }
    else
    {
        mcEnergy.gotoAndStop(energy);
    }

}


initializeGame();

这是给怪物的

import fl.motion.Animator;
import fl.motion.MotionEvent;

var this_xml:XML = <Motion duration="30" xmlns="fl.motion.*" xmlns:geom="flash.geom.*" xmlns:filters="flash.filters.*">
    <source>
        <Source frameRate="12" x="227.65" y="291.3" scaleX="1" scaleY="1" rotation="0" elementType="movie clip" symbolName="Monster">
            <dimensions>
                <geom:Rectangle left="-17.85" top="-17.85" width="35.7" height="35.7"/>
            </dimensions>
            <transformationPoint>
                <geom:Point x="0.5" y="0.5"/>
            </transformationPoint>
        </Source>
    </source>

    <Keyframe index="0" tweenSnap="true" tweenSync="true">
        <tweens>
            <SimpleEase ease="0"/>
        </tweens>
    </Keyframe>

    <Keyframe index="29" scaleX="2.357" scaleY="2.357"/>
</Motion>;

var this_animator:Animator = new Animator(this_xml, this);
this_animator.play();


this_animator.addEventListener(MotionEvent.MOTION_END, hurtPlayer);

function hurtPlayer(Event:MotionEvent):void
{
    var main:MovieClip = MovieClip(this.parent.parent);
    main.decreaseEnergy();
    this.parent.removeChild(this);
}

this.addEventListener(MouseEvent.CLICK, killMonster);

function killMonster(event:MouseEvent):void
{
this_xml = <Motion duration="5" xmlns="fl.motion.*" xmlns:geom="flash.geom.*" xmlns:filters="flash.filters.*">
    <source>
        <Source frameRate="12" x="236.95" y="163" scaleX="1" scaleY="1" rotation="0" elementType="movie clip" symbolName="Monster" class="Monster">
            <dimensions>
                <geom:Rectangle left="-17.85" top="-17.85" width="35.7" height="35.7"/>
            </dimensions>
            <transformationPoint>
                <geom:Point x="0.5" y="0.5"/>
            </transformationPoint>
        </Source>
    </source>

    <Keyframe index="0" tweenSnap="true" tweenSync="true">
        <tweens>
            <SimpleEase ease="0"/>
        </tweens>
    </Keyframe>

    <Keyframe index="4" scaleX="0.552" scaleY="0.552">
        <color>
            <Color alphaMultiplier="0"/>
        </color>
    </Keyframe>
</Motion>;

this_animator = new Animator(this_xml, this);
this_animator.play();

this_animator.addEventListener(MotionEvent.MOTION_END, die);

}

function die(event:MotionEvent):void
{
    var main:MovieClip = MovieClip(this.parent.parent);
    main.increaseScore();
    this_animator.removeEventListener(MotionEvent.MOTION_END, hurtPlayer);
    this.parent.removeChild(this);
}
4

4 回答 4

2

好的,事情就是这样。你是说gotoAndStop();,但你的类中没有 gotoandstop 函数,静态类只能通过函数调用,如果你不希望它是静态的,那么永远不要说myclass.somefunction();从类内部调用它。

于 2013-01-14T02:30:55.557 回答
0

问题是您有一个名为 mcEnergy 的类。您需要一个实例名称为 mcEnergy 的类的实例。你在舞台上有你的 mcEnergy 类的实例吗?如果是这样,它的实例名称是什么?如果没有,您需要制作一个并将其放在那里;无论您是在构建时执行此操作(将一个从库中拖放到舞台上并将其实例名称设置为 mcEnergy 以外的名称)还是在运行时通过 actionscript 创建它都没有关系,但这就是您的变量需要在那里使用。

但是,请注意,将类名的第一个字母大写被认为是最佳实践。因此,您的库中有一个当前名为 mcEnergy 的影片剪辑,它应该是 McEnergy。然后,您可以使您的实例名称 mcEnergy 和您当前拥有的代码应该可以工作。

于 2012-08-11T23:25:05.507 回答
0

正如战术所回答的那样,这似乎mcEnergy是库中符号的类名,而不是阶段中实例的名称。您需要创建一个新实例,mcEnergy然后将其添加到显示列表中。

var energy_mc :MovieClip = new mcEnergy();
stage.addChild( energy_mc );

之后,替换对mcEnergyby的引用energy_mc

energy = energy_mc.totalFrames;
energy_mc.gotoAndStop( energy );
于 2012-08-12T17:46:58.037 回答
0

您的实例可能没有在属性中的舞台上命名,但如果我理解问题,只是为 AS 导出。尝试将舞台上对 mcEnergy 的所有引用替换为:

MovieClip(getChildAt(0));

如果这解决了问题,你应该只在你的主类中将你的实例声明为here-bellow:

var mcEnergy:MovieClip = MovieClip(getChildAt(0));

但是您最好在属性中将实例命名为“mcEnergy”并执行以下操作:

var mcEnergy:MovieClip = MovieClip(getChildByName("mcEnergy"));

你有一个 ”;” 在

 if(score >= monstersInGame);

您的代码不会执行 {...} 中的语句

于 2012-08-12T10:51:09.483 回答