As3 game restart help!

I am trying to make a game like the escapa game you might have seen on the internet. I have got all the movement pretty much sorted its just I cannot get the game to restart. I am relatively new the AS3 so bear with me on this. I have a Main class, an enemy class, a player class and a button class. The button class creates the restart button and from the main class, when certain conditions are met, an event listener is added to this button instance to say “on click… do this…”. I do not no what to put to make it reset the game however. I have tried to clear all the objects when the game is over but I cannot get the game to restart on click. I figured if I can just add a new Main class instance then the game would be reset but I cannot seem to do it… Any help would be greatly appreciated (sorry if my code is a bit messy).Here are the classes I have made:

Main.as

package Game{

import flash.display.Sprite;
import flash.display.Stage;
import flash.events.*;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFormat;

public class Main extends Sprite{

private var stageWidth:Number;
private var stageHeight:Number;
private var enemy1:Enemy;
private var enemy2:Enemy;
private var enemy3:Enemy;
private var enemy4:Enemy;
private var player:Player;
internal var container:Sprite;
private var gameTimer:Timer;
private var handCursor:Boolean = true;
private var boundaryThickness:uint = 7;
private var currentPlayerXPosition:Number;
private var currentPlayerYPosition:Number;
internal var timeTextField:TextField = new TextField();
private var milliSeconds:Number = 0;
private var seconds:Number = 0;
internal var textFormat:TextFormat;
private var button:Button;

public function Main():void{
stageWidth = stage.stageWidth;
stageHeight = stage.stageHeight;

stage.frameRate = 60;

textFormat = new TextFormat();

textFormat.bold = true;
textFormat.color = 0x0000FF;
textFormat.size = 60;

timeTextField.setTextFormat(textFormat);

gameTimer = new Timer(1);
gameTimer.addEventListener(TimerEvent.TIMER, getSecondsPassed,false,0,true);

drawEnvironment();

}

internal function drawEnvironment():void{

container = new Sprite();

container.graphics.lineStyle(boundaryThickness,0xFF0000);
container.graphics.drawRect(0,0,stageWidth,stageHeight);

container.x = 0;
container.y = 0;

stage.addChild(container);

enemy1 = new Enemy(100,100,0xFF0000,0xFF0000,10,10);//square;TopLeft

enemy1.constructEnemy(200,200);

container.addChild(enemy1);

enemy2 = new Enemy(50,200,0xFF0000,0xFF0000,10,5);//long vertical rectangle;TopRight

enemy2.constructEnemy(700,150);

container.addChild(enemy2);

enemy3 = new Enemy(70,100,0xFF0000,0xFF0000,10,-10);//X stumpy Rectangle;Bottomleft

enemy3.constructEnemy(300,700);

container.addChild(enemy3);

enemy4 = new Enemy(140,100,0xFF0000,0xFF0000,-5,10);//Y Stumpy Rectangle;BottomRight

enemy4.constructEnemy(650,650);

container.addChild(enemy4);

player = new Player(75,75,0x00FF00);

player.constructPlayer(stageWidth/2,stageHeight/2);

container.addChild(player);

player.playerShape.buttonMode = handCursor;

player.playerShape.addEventListener(MouseEvent.MOUSE_DOWN, beginGame,false,0,true);

}

private function beginGame(e:MouseEvent):void{

gameTimer.start();
e.target.startDrag();
e.target.addEventListener(MouseEvent.MOUSE_UP, endDrag,false,0,true);
stage.addEventListener(Event.ENTER_FRAME, enemyMovement,false,0,true);//change to timer instead???

}

private function endDrag(e:MouseEvent):void{

e.target.stopDrag();

}

private function getSecondsPassed(e:TimerEvent):void{

milliSeconds += .001;

}

private function enemyMovement(e:Event):void{

currentPlayerXPosition = player.playerShape.x;
currentPlayerYPosition = player.playerShape.y;

enemy1.enemyContainer.x += enemy1.enemyXSpeed;
enemy1.enemyContainer.y += enemy1.enemyYSpeed;

enemy2.enemyContainer.x += enemy2.enemyXSpeed;
enemy2.enemyContainer.y += enemy2.enemyYSpeed;

enemy3.enemyContainer.x += enemy3.enemyXSpeed;
enemy3.enemyContainer.y += enemy3.enemyYSpeed;

enemy4.enemyContainer.x += enemy4.enemyXSpeed;
enemy4.enemyContainer.y += enemy4.enemyYSpeed;

if(enemy1.enemyContainer.x >= (stageWidth - enemy1.enemyWidth - boundaryThickness) || enemy1.enemyContainer.x <= (boundaryThickness) ){

enemy1.enemyXSpeed *= -1;

}

if(enemy2.enemyContainer.x >= (stageWidth - enemy2.enemyWidth - boundaryThickness) || enemy2.enemyContainer.x <= (boundaryThickness) ){

enemy2.enemyXSpeed *= -1;

}

if(enemy3.enemyContainer.x >= (stageWidth - enemy3.enemyWidth - boundaryThickness) || enemy3.enemyContainer.x <= (boundaryThickness) ){

enemy3.enemyXSpeed *= -1;

}

if(enemy4.enemyContainer.x >= (stageWidth - enemy4.enemyWidth - boundaryThickness) || enemy4.enemyContainer.x <= (boundaryThickness) ){

enemy4.enemyXSpeed *= -1;

}

if(enemy1.enemyContainer.y >= (stageHeight - enemy1.enemyHeight - boundaryThickness) || enemy1.enemyContainer.y <= (boundaryThickness) ){

enemy1.enemyYSpeed *= -1;

}

if(enemy2.enemyContainer.y >= (stageHeight - enemy2.enemyHeight - boundaryThickness) || enemy2.enemyContainer.y <= (boundaryThickness) ){

enemy2.enemyYSpeed *= -1;

}

if(enemy3.enemyContainer.y >= (stageHeight - enemy3.enemyHeight - boundaryThickness) || enemy3.enemyContainer.y <= (boundaryThickness) ){

enemy3.enemyYSpeed *= -1;

}

if(enemy4.enemyContainer.y >= (stageHeight - enemy4.enemyHeight - boundaryThickness) || enemy4.enemyContainer.y <= (boundaryThickness) ){

enemy4.enemyYSpeed *= -1;

}

checkPlayerCollisions();

}

/Check for player collsions with boundary wall and/or enemies***/

private function checkPlayerCollisions():void{

currentPlayerXPosition = player.playerShape.x;
currentPlayerYPosition = player.playerShape.y;//Review this placement later… but event listener provinding these variables with values might be removed below and so they may be invalid when needed

if(enemy1.enemyContainer.hitTestObject(player.playerShape)){

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

timeTextField.text = String(milliSeconds);

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

button = new Button(100,100,“Restart”);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);

}
if(enemy2.enemyContainer.hitTestObject(player.playerShape)){

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

timeTextField.text = String("["+seconds+"."+milliSeconds+"]");

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

timeTextField.text = String(milliSeconds);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);

}

if(enemy3.enemyContainer.hitTestObject(player.playerShape)){

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

timeTextField.text = String(milliSeconds);

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

button = new Button(100,100,“Restart”);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);

}

if(enemy4.enemyContainer.hitTestObject(player.playerShape)){

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);
stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

timeTextField.text = String(milliSeconds);

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

button = new Button(100,100,“Restart”);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);
}

if(currentPlayerXPosition >= (stageWidth - player.playerWidth - boundaryThickness) || currentPlayerXPosition <= (boundaryThickness) ){ //ensure this effect is sharp and accurate

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);
stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

timeTextField.text = String(milliSeconds);

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

button = new Button(100,100,“Restart”);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);

}

if(currentPlayerYPosition >= (stageHeight - player.playerHeight - boundaryThickness) || currentPlayerYPosition <= (boundaryThickness) ){

gameTimer.stop();
gameTimer.removeEventListener(TimerEvent.TIMER, getSecondsPassed);
stage.removeEventListener(Event.ENTER_FRAME, enemyMovement);

container.removeChild(enemy1);
container.removeChild(enemy2);
container.removeChild(enemy3);
container.removeChild(enemy4);
container.removeChild(player);
stage.removeChild(container);

gameTimer = null;
player = null;
enemy1 = null;
enemy2 = null;
enemy3 = null;
enemy4 = null;
container = undefined;
handCursor = undefined;
boundaryThickness = undefined;
currentPlayerXPosition = undefined;
currentPlayerYPosition = undefined;

timeTextField.text = String(milliSeconds);

timeTextField.x = stageWidth/2;
timeTextField.y = stageHeight/2;

stage.addChild(timeTextField);

button = new Button(100,100,“Restart”);

button.constructButton(stageWidth/2,stageHeight/2);

stage.addChild(button);

button.containerSprite.addEventListener(MouseEvent.CLICK, button.restartGame);
}

}

}

}
Enemy.as

package Game{

import flash.display.Sprite;
import flash.display.Stage;
import flash.display.Shape;

internal class Enemy extends Sprite{

private static const LINE_THICKNESS = 1;
internal var enemyWidth:Number;
internal var enemyHeight:Number;
private var enemyColour:uint;
private var enemyEntryX:Number;
private var enemyEntryY:Number;
private var enemyLineColour:uint;
internal var enemyXSpeed:Number;
internal var enemyYSpeed:Number;
internal var enemyContainer:Sprite;

public function Enemy(Width:Number = 20,Height:Number = 100,colour:uint = 0xFF0000,lineColour:uint = 0xFF0000,xVel:Number = 5,yVel:Number = 5):void{

enemyWidth = Width;
enemyHeight = Height;
enemyColour = colour;
enemyXSpeed = xVel;
enemyYSpeed = yVel;
enemyLineColour = lineColour;

}

internal function constructEnemy(entryX:Number = 200,entryY:Number = 200):void{

enemyContainer = new Sprite();//sprite so that hitTest works easily and correctly

enemyEntryX = entryX;
enemyEntryY = entryY;

enemyContainer.graphics.lineStyle(LINE_THICKNESS,enemyLineColour);

enemyContainer.graphics.beginFill(enemyColour);

enemyContainer.graphics.drawRect(0,0,enemyWidth,enemyHeight);

enemyContainer.x = enemyEntryX;
enemyContainer.y = enemyEntryY;

addChild(enemyContainer);

}

}

}

Player.as

package Game{

import flash.display.Sprite;
import flash.display.Stage;
import flash.display.Shape;

internal class Player extends Sprite{

internal var playerShape:Sprite;
internal var playerWidth:Number;
internal var playerHeight:Number;
private var playerXPos:Number;//change to stage dimensions after
private var playerYPos:Number;
private var playerColour:uint;

public function Player(Width:Number = 50,Height:Number = 50,Colour:uint = 0x00FF00):void{

playerWidth = Width;
playerHeight = Height;
playerColour = Colour;

}

internal function constructPlayer(entryXPos:Number = 200,entryYPos:Number = 200):void{

playerShape = new Sprite();//needs to be Sprite rather that Shape so that xPos of player.playerShape can be tracked properly in Main.as

playerXPos = entryXPos;
playerYPos = entryYPos;

playerShape.graphics.lineStyle(1,0xFFFF00);
playerShape.graphics.beginFill(playerColour);

playerShape.graphics.drawRect(0,0,playerWidth,playerHeight);

playerShape.x = playerXPos;
playerShape.y = playerYPos;

addChild(playerShape);

}

}

}

Button.as

package Game{

import flash.display.Sprite;
import flash.display.Stage;
import flash.text.TextField;
import flash.events.MouseEvent;

internal class Button extends Sprite{

private var buttonWidth:uint;
private var buttonHeight:uint;
private var buttonText:String;
internal var containerSprite:Sprite;
private var buttonXPosition:Number;
private var buttonYPosition:Number;
private var buttonColour:uint;
private var textColour:uint;
private var textMessage:TextField;
private var reset:Main;

public function Button(width:uint =100,height:uint = 100,string:String = “Restart”):void{

buttonWidth = width;
buttonHeight = height;
buttonText = string;

textMessage = new TextField();

textMessage.text = buttonText;

}

internal function constructButton(entryXPos:Number = 450,entryYPos:Number = 450):void{

containerSprite = new Sprite();//needs to be Sprite rather that Shape so that xPos of player.playerShape can be tracked properly in Main.as

buttonXPosition = entryXPos;
buttonYPosition = entryYPos;

containerSprite.graphics.lineStyle(1,0xFFFF00);

containerSprite.graphics.drawRect(0,0,buttonWidth,buttonHeight);

containerSprite.x = buttonXPosition;
containerSprite.y = buttonYPosition;

textMessage.x = 35;
textMessage.y = 35;

containerSprite.addChild(textMessage);

addChild(containerSprite);

}

internal function restartGame(e:MouseEvent):void{
reset = new Main();
removeChild(containerSprite);

//THIS IS WHERE I FIGURED I NEEDED TO CREATE A NEW INSTANCE OF THE MAIN CLASS BUT IT JUST WON’T WORK. IT COMES UP WITH AN INVALID DATA ERROR IN THE OUTPUT PANEL.BY THIS POINT IN THE PROGRAM, PRACTICALLY EVERY OBJECT HAS BEEN REMOVED FROM THE STAGE AND DISPLAY LIST AND THE GAME IS OVER AND IS READY TO BE RESET…

}
:jail::d: