2013-10-13 3 views
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 
     } 

답변

1

내가 모든 코드를 볼 수 없기 때문에, 나는 당신이() 표시를 제거하는이 무대에서 내려 개체를하는 RemoveChild를 사용하지 않을 것으로 생각됩니다.

parent.addChild(object); 

가 표시 목록에서 제거하려면 :

var object:DisplayObject = new DisplayObject(); 

표시 목록에 볼 수 있도록 :

는 객체 생성하려면

parent.removeChild(object); 

지우려면을 그 메모리 :

object=null; 

(제대로 작동하려면이 네 가지를 순서대로 수행해야합니다. 표시 목록에서 제거하지 않고 무언가를 만들면 참조 할 방법이없는 상태로 표시됩니다. 그것은 귀하의 신청서에서 분실 된 것입니다. 변수 null을 작성하거나 변수를 겹쳐 쓰기 전에 항상 removeChild()를 사용해야합니다.

관련 문제