在Flash CS6 ActionScript 3.0中拍摄子弹

时间:2014-03-07 00:30:16

标签: actionscript-3 flash

当我在Flash CS6 AS 3.0中制作一个镜头时,我一直收到以下错误

  

1118:使用静态类型Object将值隐式强制转换为可能不相关的类型flash.display:DisplayObject。

package 
    {
        import flash.display.MovieClip;
        import flash.ui.Mouse;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.ui.Keyboard;
        import flash.events.KeyboardEvent;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.media.SoundChannel;

        public class AvoiderGame extends MovieClip 

        {

            public var army:Array;
            public var reishoot:ReiShoot;
            public var enemy:Enemy;
            public var avatar:Avatar;
            public var gameTimer:Timer;
            public var useMouseControl:Boolean;
            public var downKey:Boolean;
            public var bullets:Array = [];
            public var backgroundMusic:BackgroundMusic;
            public var enemySound:EnemySound;
            public var bgmSoundChannel:SoundChannel;
            public var sfxSoundChannel:SoundChannel;


             function AvoiderGame() 
            {
                /*useMouseControl = false;
                downKey = false;

                if( useMouseControl )
                {
                    avatar.x = mouseX;
                    avatar.y = mouseY;

                }
                else
                {
                    avatar.x = 200;
                    avatar.y = 250;

                }
                */

                backgroundMusic = new BackgroundMusic();
                bgmSoundChannel = backgroundMusic.play();
                bgmSoundChannel.addEventListener( Event.SOUND_COMPLETE, onBackgroundMusicFinished );
                enemySound = new EnemySound();
                army = new Array();
                //Initial Position of the Enemy
                var newEnemy = new Enemy( 2700, 600 );

                army.push( newEnemy );
                addChild( newEnemy );

                avatar = new Avatar();
                addChild( avatar );


                avatar.height = 220;
                avatar.width = 120;

                avatar.addEventListener(MouseEvent.CLICK, shoot);
                gameTimer = new Timer( 25 );
                gameTimer.addEventListener( TimerEvent.TIMER, onTick );
                gameTimer.start();

                //addEventListener( Event.ADDED_TO_STAGE, onAddToStage );
            }//End AvoiderGame

            function shoot(e:MouseEvent):void
            { 

                 var b:Shot = new Shot();
                 b.addEventListener(Event.ENTER_FRAME, bulletflies);
                 stage.addChild(b);
                 bullets.push(b);
            }

            function bulletflies(e:Event):void
            {
                 e.currentTarget.y -= 5;
                 if(e.currentTarget.y < 0 || e.currentTarget.y > stage.height) 
                    {
                         stage.removeChild(e.currentTarget);
                         bullets.splice(bullets.indexOf(e.currentTarget), 1);
                    }
            }

            public function onBackgroundMusicFinished( event:Event ):void
            {
                bgmSoundChannel = backgroundMusic.play();
                bgmSoundChannel.addEventListener( Event.SOUND_COMPLETE, onBackgroundMusicFinished );
            }

            public function onKeyPress(keyboardEvent:KeyboardEvent):void
            {
                    if ( keyboardEvent.keyCode == Keyboard.DOWN )
                    {
                        downKey = true;
                    }
            }

            public function onKeyRelease( keyboardEvent:KeyboardEvent ):void
            {
                    if ( keyboardEvent.keyCode == Keyboard.DOWN )
                    {
                        downKey = false;
                    }
            }

            public function onAddToStage(event:Event):void
            {

                stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress );
                stage.addEventListener( KeyboardEvent.KEY_UP, onKeyRelease );
            }



            public function onTick( timerEvent:TimerEvent ):void 
            {
                if ( Math.random() < 2800 )
                {
                    var randomY:Number = Math.random() * 2800;
                    var newEnemy:Enemy = new Enemy( width, randomY );
                    army.push( newEnemy );
                    addChild( newEnemy );
                    gameScore.addToValue( 1 );
                    //sfxSoundChannel = enemySound.play();
                }//End if statement
                /*
                if( useMouseControl )
                {
                    avatar.x = mouseX;
                    avatar.y = mouseY;
                }

                else
                {
                    if ( downKey )
                    {
                        avatar.moveDown();
                    }
                }
                */
                avatar.x = mouseX;
                avatar.y = mouseY;



                for each ( var enemy:Enemy in army ) 
                {
                    enemy.moveDownABit();
                    if ( avatar.hitTestObject( enemy ) ) 
                    {
                        bgmSoundChannel.stop();
                        gameTimer.stop();
                        dispatchEvent( new AvatarEvent( AvatarEvent.DEAD ) );
                    }//End if statement
                }//End for loop
            }//End onTick function

            public function getFinalScore():Number
            {
                return gameScore.currentValue;
            }


        }//End AvoiderGame class
    }//End package

3 个答案:

答案 0 :(得分:0)

猜测一下:在你说addChild(b)之前,你已经开始了你的ENTER_FRAME循环(将删除'b')。尝试将“b”放在显示列表之前,然后尝试将其删除!!

答案 1 :(得分:0)

  

第90行是stage.removeChild(e.currentTarget);

有了这个,您需要将e.currentTarget投射到DisplayObject

stage.removeChild(e.currentTarget as DisplayObject);

答案 2 :(得分:0)

啊哈!我想我可能已经找到了你的问题,但我不确定它与错误代码的关系......

查看您的Shot课程(我在此处找到https://stackoverflow.com/questions/22244959/why-does-this-not-shoot)。每一帧,你告诉Shot类测试它是否仍然在舞台的边界,如果是,则从舞台上移除自己。在第90行中,您还告诉舞台确定子弹是否仍然在边界内,如果是,则再次将其删除。

您曾试图将舞台上的子弹移除两次!

我再次强调,这似乎与错误代码无关,但希望它能指出正确的方向。