0

ユーザーが死亡した場合にゲームを再起動できるようにする必要がある単純なフラッシュ ゲームを作成しようとしています。ただし、すべての変数をリセットしても、何も達成されていないようです。私のゲーム要素はすべて配列に格納されており、それぞれを配列コンストラクターに設定しても、それらが指しているオブジェクトが削除されず、結果として画面に残っているのではないかと思いました。これらの要素を削除する方法を知っている人はいますか (明らかな理由でリストを反復処理して削除することはできないため)、またはフラッシュでゲームをリセットするより良い方法を知っている人はいますか? 参考までに、ゲームを開始/リセットすることになっている私のプログラムの上部にある 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
        }
4

1 に答える 1

1

すべてのコードを確認できないため、ステージから表示オブジェクトを取り除くために removechild() を使用していないと推測されます。

オブジェクトを作成するには:

var object:DisplayObject = new DisplayObject();

表示リストに表示するには:

parent.addChild(object);

表示リストから削除するには:

parent.removeChild(object);

メモリを消去するには:

object=null;

(これが適切に機能するためには、これらの 4 つのことをこの順序で行う必要があります。表示リストから削除せずに何かを null にすると、参照する方法がなく、表示されたままになります。変数を null にする前、または変数を上書きする前に、必ず removeChild() を使用するようにしてください。

于 2013-10-13T19:43:34.093 に答える