2013-02-08 48 views
0

我想创建一个角色的控件。不幸的是,我遇到了错误#1304。ActionScript 3的错误输出#1034类型强制失败

下面是输出错误:

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; 
     } 
     } 
    }  
} 
+1

您不需要将其转换为MovieClip。你可以使用'this',因为这是你父类中class_Boy类的实例。另外,'class_Boy'是你的类的名字,所以把它转换成任何东西都没有意义。 – inhan 2013-02-08 18:29:32

+0

感谢它的工作! – Minelava 2013-02-09 13:11:39

+0

没问题。您可能还想按照以下建议避免混淆的用户来适应适当的命名约定 - 尽管这是一个偏好问题。 – inhan 2013-02-09 13:41:52

回答

1

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

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

几个其他的事情,也可以帮助你:

  • ,如果你遵循大写开始类名的标准,你不class启动它,你可以将其命名为Boy

  • 方法不必从类名称开始(class_Boy_Move)。事实上,如果他们不这样做会更好,所以你不要与构造函数混淆,并且它们最终变得更短。

+0

感谢它的工作! – Minelava 2013-02-09 11:06:28

相关问题