无法重置Flash游戏

时间:2013-10-13 18:46:01

标签: actionscript-3 flash initialization

我正在尝试构建一个简单的Flash游戏,我需要能够在用户死亡时重启游戏。然而,重置所有变量似乎并没有完成任何事情。我的所有游戏元素都存储在数组中,我认为将它们中的每一个设置为数组构造函数并不是删除它们指向的对象,而是将它们留在屏幕上。有没有人知道删除这些元素的方法(因为我无法迭代列表以删除它们出于显而易见的原因)或者有没有人知道在Flash中重置游戏的更好方法?作为参考,这里是我的程序顶部的init函数和变量声明,应该启动/重置游戏。

public class Main extends MovieClip {

        //put field variables here
        static var hudLayer:Sprite; //layer used to represent HUD elements
        static var gameLayer:Sprite; //layer used to represent objects in the game space
        static var uiTextLayer:Sprite; //layer used to represent text that should appear ON TOP of the HUD
        static var backgroundLayer:Sprite; //layer used to display the background image
        static var players: Array; //array of all the player objects for reference
        static var backgrounds:Array; //array of all the background objects
        static var lines: Array; //array of all the lines
        static var powerUps:Array; //array of all the powerups
        static var enemies:Array; //array of all the enemies
        static var miscellaneousObjects:Array; //array of miscellaneous objects that I'd like to be able to keep track of
        var xCoords:Array, yCoords:Array; //Used to temporarily hold x and y coordinates when making new drawings
        static var grav:Number; //coefficient representing the force of gravity
        static var isPaused:Boolean; //manages pausing mechanic
        static var timer:Timer; //used for time delayed updating of game elements
        var pt:Point; //variable used by collision detection
        var asteroidTiming:Number; //used to properly delay creating of asteroids on the screen
        static var asteroidDelay:Number; //current delay between when asteroids are deployed, changes over course of execution
        static var score:Number; //this should be self-explanatory
        var scoreField:TextField; //used to display the score
        static var myTextFormat:TextFormat; //used to format the text in the scoreField
        static var inGameOver:Boolean; //used to determine if we're at the game over screen

        [Frame(factoryClass="Preloader")]
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        public function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            //set up the Sprite Layers
            backgroundLayer = new Sprite();
            gameLayer = new Sprite();
            hudLayer = new Sprite();
            uiTextLayer = new Sprite();
            addChild(backgroundLayer);
            addChild(gameLayer);
            addChild(hudLayer);
            addChild(uiTextLayer);

            //instantiate important variables
            xCoords = new Array();
            yCoords = new Array();
            players = new Array();
            backgrounds = new Array();
            enemies = new Array();
            powerUps = new Array();
            miscellaneousObjects = new Array();
            grav = .04;
            addBackGround();
            addPlayer(400, 50);
            isPaused = false;
            lines = new Array();
            score = 0;
            inGameOver = false;

            //instantiate text fields
            scoreField = new TextField();
            scoreField.text = "Score: " + score;
            hudLayer.addChild(scoreField);
            scoreField.x = 20;
            scoreField.y = 20;
            scoreField.textColor = 0xFFFFFF;
            myTextFormat = new TextFormat();
            myTextFormat.size = 15;
            scoreField.setTextFormat(myTextFormat);

            //set up timer
            timer = new Timer(5);
            timer.addEventListener(TimerEvent.TIMER, function():void { update()});
            timer.start()
            asteroidTiming = 0;
            asteroidDelay = 150;

            //set up mouse listener
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEvent);

            //set up key listener
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyEvent);

            //tests
        }

1 个答案:

答案 0 :(得分:1)

由于我看不到你的所有代码,我猜你没有使用removechild()来摆脱舞台上的显示对象。

创建对象:

var object:DisplayObject = new DisplayObject();

使其在显示列表中可见:

parent.addChild(object);

要从显示列表中删除它:

parent.removeChild(object);

擦除它的记忆:

object=null;

(这四件事必须按此顺序完成,这样才能正常工作。如果你在没有从显示列表中删除它的情况下创建一些空值,你可以将它保留在那里,仍然可见,无法参考它。它喜欢丢失在您的申请中。 在将变量设为null或覆盖变量之前,必须确保始终使用removeChild()。