2014-01-07 60 views
0

我正在为大专分配的自上而下的射手。当我按下鼠标左键射击子弹时,他们与跟随玩家影片剪辑,发生这种情况的玩家影片剪辑可以使SWF没有崩溃仍在使用箭头键移动到敌人的影片剪辑colide它们冻结。敌人和子弹影片剪辑冻结当子弹影片剪辑在舞台上输入 - AS3 - CS6

敌人和子弹影片剪辑被放置在一个阵列,并且两者都应该在与海誓山盟的碰撞将被删除。

在输出窗口出现此错误消息时,子弹影片剪辑进入阶段

bullet hit baddie 0

TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::[email protected] to flash.display.MovieClip.

at Bullet/removeSelf()

at Bullet/loop()

at Main/loop()

bullet hit baddie 0是有,由于它的代码被跟踪。

Main.as

package 
{ 
import flash.display.Stage; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.MouseEvent; 

public class Main extends MovieClip 
{ 
    public var player:Player; 
    public var enemy:Enemy; 

    public var bulletList:Array = []; 

    public var mousePressed:Boolean = false; //keeps track of whether the mouse is currently pressed down 
    public var delayCounter:int = 0; //this adds delay between the shots 
    public var delayMax:int = 7; //change this number to shoot more or less rapidly 

    var enemies:Array = []; 

    public function Main():void 
    { 
     player = new Player(stage, 320, 240); 
     stage.addChild(player); 

     //stage.addEventListener(MouseEvent.CLICK, shootBullet, false, 0, true); //remove this 
     stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true); 
     stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true); 

     stage.addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
     for(var numBaddies=0; numBaddies<6;numBaddies++){ 
      var enemy:Enemy = new Enemy(null); 
      enemy.x = numBaddies*50; 
      enemy.y = numBaddies*50 
      stage.addChild(enemy); 
      enemies.push(enemy); 
     } 
    } 

    public function loop(e:Event):void 
    { 
     if(mousePressed) // as long as the mouse is pressed... 
     { 
      delayCounter++; //increase the delayCounter by 1 
      if(delayCounter == delayMax) //if it reaches the max... 
      { 
       shootBullet(); //shoot a bullet 
       delayCounter = 0; //reset the delay counter so there is a pause between bullets 

      } 
     } 

     if(bulletList.length > 0) 
     { 
      for(var i:int = bulletList.length-1; i >= 0; i--) 
      { 
       bulletList[i].loop(); 
      } 
     } 

     for(var h = 0; h<bulletList.length; ++h) 
     { 
      if(bulletList[h].hitTestObject(this)){ 
       trace("player hit by baddie " + h); 
       } 
     } 

     for(var u:int=0; u<enemies.length; u++) { 
     Enemy(enemies[u]).moveTowards(player.x, player.y); 
     } 
    } 


    public function mouseDownHandler(e:MouseEvent):void //add this function 
    { 
     mousePressed = true; //set mousePressed to true 
    } 

    public function mouseUpHandler(e:MouseEvent):void //add this function 
    { 
     mousePressed = false; //reset this to false 
    } 

    public function shootBullet():void //delete the "e:MouseEvent" parameter 
    { 
     var bullet:Bullet = new Bullet(stage, player.x, player.y, player.rotation, enemies); 
     bullet.addEventListener(Event.REMOVED_FROM_STAGE, bulletRemoved, false, 0, true); 
     bulletList.push(bullet); 
     stage.addChild(bullet); 
    } 

    public function bulletRemoved(e:Event):void 
    { 
     e.currentTarget.removeEventListener(Event.REMOVED_FROM_STAGE, bulletRemoved); 
     bulletList.splice(bulletList.indexOf(e.currentTarget),1); 
    } 
} 
} 

Enemy.as

package { 

import flash.display.Stage; 
import flash.display.MovieClip; 
import flash.events.Event; 

public class Enemy extends MovieClip { 

    public var bullets:Array; 
    public var stageRef:Stage; 

    private var enemyPositionX, enemyPositionY,xDistance,yDistance,myRotation:int; 
    public function Enemy(bulletList:Array) { 
     // constructor code 
     bullets = bulletList; 
    } 

    public function moveTowards(playerX:int, playerY:int){ 
     xDistance = this.x - playerX; 
     yDistance = this.y - playerY; 


     myRotation = Math.atan2(yDistance, xDistance); 

     this.x -= 3 * Math.cos(myRotation); 
     this.y -= 3 * Math.sin(myRotation); 


    } 

    public function loopE():void{ 

    for(var i=0; i<bullets.length; ++i) 
     { 
      if(bullets[i].hitTestObject(this)){ 
       trace("you killed enemy " + i); 
       removeSelf(); 
       } 
     } 
    } 

    private function removeSelf() 
    { 
     removeEventListener(Event.ENTER_FRAME, loopE); 
     if (stageRef.contains(this)) 
     stageRef.removeChild(this); 
    } 
} 

} 

Bullet.as

package 
{ 
import flash.display.Stage; 
import flash.display.MovieClip; 
import flash.events.Event; 

public class Bullet extends MovieClip 
{ 
    private var stageRef:Stage; //checks if the bullet leaves the screen borders 
    private var speed:Number = 10; //speed that the bullet will travel at 
    private var xVel:Number = 0; //current x velocity 
    private var yVel:Number = 0; //current y velocity 
    private var rotationInRadians = 0; //convenient to store our rotation in radians instead of degrees 
    private var allBaddies:Array; 
    //our constructor requires: the stage, the position of the bullet, and the direction the bullet should be facing 
    public function Bullet(stageRef:Stage, X:int, Y:int, rotationInDegrees:Number, enemies:Array):void 
    { 
     this.stageRef = stageRef; 
     this.x = X; 
     this.y = Y; 
     this.rotation = rotationInDegrees; 
     this.rotationInRadians = rotationInDegrees * Math.PI/180; //convert degrees to radians, for trigonometry 
     allBaddies = enemies; 
    } 

    public function loop():void //we don't need to include the "e:Event" because we aren't using an EventListener 
    { 
     for(var b=0; b<allBaddies.length; ++b) 
     { 
      if(allBaddies[b].hitTestObject(this)){ 
       trace("bullet hit baddie " + b); 
       removeSelf(); 
       } 
     } 

     xVel = Math.cos(rotationInRadians) * speed; //uses the cosine to get the xVel from the speed and rotation 
     yVel = Math.sin(rotationInRadians) * speed; //uses the sine to get the yVel 

     x += xVel; //updates the position 
     y += yVel; 

     //if the bullet goes off the edge of the screen... 
     if(x > stageRef.stageWidth || x < 0 || y > stageRef.stageHeight || y < 0) 
     { 
      this.parent.removeChild(this); //remove the bullet 
     } 
    } 

    private function removeSelf() 
    { 
     removeEventListener(Event.ENTER_FRAME, loop); 
     if (MovieClip(root).stageRef.contains(this)) 
     MovieClip(root).stageRef.removeChild(this); 
    } 
} 
} 

所有帮助表示赞赏,许多牛逼先进的hank

回答

0

你得到类型错误,因为rootMovieClip转换失败。当用前面的类型名称括起括号中的变量时,你断言该对象是该类型的(或者扩展了该类型)。在Bullet.removeSelf()函数,你必须:MovieClip(root) - 但在这种情况下,root的类型是Stage,不延伸MovieClip,导致错误的*

这是事实,Stage类型有两种containsremoveChild方法,所以你可以删除演员。实际上,Bullet类已经以stageRef的形式引用了舞台,所以你可以重复使用它。尝试改变removeSelf()功能:

private function removeSelf():void 
{ 
    removeEventListener(Event.ENTER_FRAME, loop); 
    if (stageRef.contains(this)) 
     stageRef.removeChild(this); 
} 

*(更多信息:在root属性的特定类型根据上下文变化有时会实际上是一个MovieClip;其他时间Bitmap;在你的情况下,作为。 。错误显示,这是一个Stage - 但只保证类型是DisplayObject,这是最低公分母类型,并由上述类型都继承下面是对root属性的Adobe文档:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#root

+0

非常感谢你它工作完美,对不起,我只是刚刚回答,因为这个p,我前一天晚上没有去睡觉所以昨天我太累了。现在我对“root”有了更好的理解,非常感谢。我刚一两件事没有做,让敌人电影剪辑,从舞台上子弹影片剪辑冲击/碰撞数组中删除,我曾尝试在Enemy.as在'LOOPE()'函数,但即使跟踪陈述不输出任何东西到窗口。你能否在这里指出我可能会出错的地方? – cm125192

+0

没问题 - 很高兴解决了这个问题。如果不仔细观察(它实际上是一个单独的问题/帖子),看起来'loopE'方法根本没有被调用。你可能想把呼叫加入到Main中。循环()'方法,你已经在遍历'enemies'数组。添加后可能会有一些后续事项需要解决,如果您遇到特定问题,请发布新问题。 – hanenbro

+0

谢谢,我会试试看看会发生什么。非常感谢您的帮助。 – cm125192