【问题标题】:ActionScript 3's error output #1034 Type coercion failedActionScript 3 的错误输出 #1034 类型强制失败
【发布时间】:2013-01-24 14:16:32
【问题描述】:

我想创建一个角色的控件。不幸的是,我遇到了错误 #1304。

这是输出错误:

TypeError: Error #1034: Type Coercion failed: cannot convert class_Boy$ to 
flash.display.MovieClip.
    at class_Boy/mainJump()
    at class_Boy/class_Boy_Move()

闪光灯可以运行,但是当我按下空格键时,错误不断重复,闪光灯停止了。

相信罪魁祸首是class_Boy所在班级下的MovieClip(boy_Class)造成的。如果您能找到任何解决方案,请帮助我。谢谢。

这是主类:

package 
{
import flash.display.*;
import flash.text.*;
import flash.events.*;
import flash.utils.Timer;
import flash.text.*;

public class experimentingMain extends MovieClip 
{
    var count:Number = 0;
    var myTimer:Timer = new Timer(10,count);

    var classBoy:class_Boy;

    var leftKey, rightKey, spaceKey, stopAnimation:Boolean;

    public function experimentingMain() 
    {
        myTimer.addEventListener(TimerEvent.TIMER, scoreUp);
        myTimer.start();

        classBoy = new class_Boy();
        addChild(classBoy);

        stage.addEventListener(KeyboardEvent.KEY_DOWN, pressTheDamnKey);
        stage.addEventListener(KeyboardEvent.KEY_UP, liftTheDamnKey);
    }

    public function pressTheDamnKey(event:KeyboardEvent):void
    {
        if (event.keyCode == 37)
        {
            leftKey = true;
            stopAnimation = false;
        }

        if (event.keyCode == 39)
        {
            rightKey = true;
            stopAnimation = false;
        }

        if (event.keyCode == 32)
        {
            spaceKey = true;
            stopAnimation = true;
        }
    }

    public function liftTheDamnKey(event:KeyboardEvent):void
    {
        if (event.keyCode == 37)
        {
            leftKey = false;
            stopAnimation = true;
        }

        if (event.keyCode == 39)
        {
            rightKey = false;
            stopAnimation = true;
        }

        if (event.keyCode == 32)
        {
            spaceKey = false;
            stopAnimation = true;
        }
    }

    public function scoreUp(event:TimerEvent):void 
    {
        scoreSystem.text = String("Score : "+myTimer.currentCount);
    }

  }
}

这是 class_Boy 的类:

package 
{
import flash.display.*;
import flash.events.*;

public class class_Boy extends MovieClip
{
    var leftKeyDown:Boolean = false;
    var upKeyDown:Boolean = false;
    var rightKeyDown:Boolean = false;
    var downKeyDown:Boolean = false;
    var mainSpeed:Number = 5;
    var mainJumping:Boolean = false;
    var jumpSpeedLimit:int = 40;
    var jumpSpeed:Number = 0;

    var theCharacter:MovieClip;

    var currentX, currentY:int;

    public function class_Boy()
    {
        this.x = 600;
        this.y = 500;

        addEventListener(Event.ENTER_FRAME, class_Boy_Move);
    }

    public function class_Boy_Move(event:Event):void 
    {
        currentX = this.x;

        if (MovieClip(parent).leftKey)
        {
            currentX += mainSpeed;

        }

        if (MovieClip(parent).rightKey)
        {
            currentX -= mainSpeed;
        }

        if (MovieClip(parent).spaceKey)
        {
            mainJump();
        }

        this.x = currentX;
        this.y = currentY;
    }

    public function mainJump():void
    {
        currentY = this.y;

        if(!mainJumping)
        {
            mainJumping = true;
            jumpSpeed = jumpSpeedLimit*-1;
            currentY += jumpSpeed;
        } else {
            if(jumpSpeed < 0){
                jumpSpeed *= 1 - jumpSpeedLimit/250;
            if(jumpSpeed > -jumpSpeedLimit/12){
                jumpSpeed *= -2;
                }
            }
        }
        if(jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit)
        {
            jumpSpeed *= 1 + jumpSpeedLimit/120;
        }
        currentY += jumpSpeed;
        if(currentY >= stage.stageHeight - MovieClip(class_Boy).height)
        {
            mainJumping = false;
            currentY = stage.stageHeight - MovieClip(class_Boy).height;
        }
      }
   }    
}

【问题讨论】:

  • 您无需将其投射到 MovieClip。您可以只使用this,因为这是您在父类中拥有的 class_Boy 类的实例。此外,class_Boy 是您的班级的名称,因此将其转换为任何内容都是没有意义的。
  • 没问题。您可能还希望按照以下用户的建议调整适当的命名约定以避免混淆 - 尽管这是一个偏好问题。

标签: actionscript-3 oop type-coercion


【解决方案1】:

而不是MovieClip(class_Boy),它应该是简单的this,它是引用当前运行代码的实例的对象。 class_Boy 是类本身,用于实例化新对象。

在使用以小写 (parent) 开头的类和以大写 (Sprite) 开头的类的命名变量和方法的通用编码标准时,可以防止此类问题。然后当你看到MovieClip(ClassBoy) 时,很明显有一个错误,因为ClassBoy 是一种类。

其他几件事也可能对您有所帮助:

  • 如果遵循类名以大写开头的标准,则不要以class开头,直接命名为Boy即可

  • 方法不必以类名 (class_Boy_Move) 开头。事实上,如果它们不这样做会更好,这样你就不会与构造函数混淆,它们最终会更短

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2015-08-10
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多