Skip to content

Toga Games

                               Game on!

Archive

Category: Flash AS3 Tutorials

This was another problem I had when learning AS3. The AS2 method was quite simple, but I had to search around for the proper AS3 method. So here it is.

Ok, this is inside my World.as class

You have to set the dynamically created movieclips into an array after you create them and then place them into the array with their iterated number (placing it into the array after creation “tiles[tileNumber]=t; tileNumber++)
so then we can access the tiles with: tiles[3].x, etc.. not bad at all.
============================================


public var tiles:Array=new Array;
private function build (vert:int,hort:int):void {
var map:Map = new Map();
trace("MAP: "+map.world1);
var startX=0;
var startY=0;
var step=40;
var stagger=0;
var a=0;
var b=0;
var tileNumber=0;
for (a=0; a < vert; a++) {
for (b=0; b < hort; b++) {
var t=new Tile;
t.x=step * stagger;
t.y=step * a;
t.num=tileNumber;
// this to be set by tile array
//t._spot=fn.randRange(0,tileSpots.length) - 1;
t._spot=map.world1[tileNumber];
trace (map.world1[tileNumber]);
t.gotoAndStop (t._spot+1);
t.addEventListener (MouseEvent.CLICK,tileChange);
t.addEventListener (MouseEvent.ROLL_OVER,updateToolTip);
_screen.addChild (t);
t.name="tile" + tileNumber;
var glow:TileGlow=new TileGlow;
glow.visible=false;
t.glow=glow;
t.addChild (glow);
tiles[tileNumber]=t;
stagger++;
tileNumber++;
}
stagger=0;
}
currentTile=t;
}

I am learning more AS3 as I work on current projects. I reluctantly came from AS2. I HAD to make this tutorial because I just figured this out and it’s frustrating when you don’t know how.

Just a quick how-to on accessing variables and arrays from another class file.

TestData.as – here is the data we wish to access that is in a separate class file for cleanliness purposes. Otherwise your class main class files get gigantic having all that extra data inside it.

package {

public class TestData {

public var tar:Array = new Array();
public function TestData ():void {
trace ("test data initialized but not yet loaded...");
tar.push ("kittens");
tar.push ("hamsters");
tar.push ("gerbils");
tar.push ("bunnies");
}

// #END END END END END END
}
}

Main.as (or whatever) – The data caller
[* note: you will find a bunch of extra stuff in here since this is mostly what I use in my main classes. Just pay attention to "public function test"]


package {
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.events.Event;
import flash.utils.Timer;

import org.application.*;
import org.console.*;

/* ======================================================= */
/****** ** UTILITY TEST ENGINE ** *******/
/*** Year: 2010 ***/
/** Ken Clinton **/
/** **/
/*** ADMIN@TOGAGAMES.COM **/
/** **/
/* ================================================ */

public class Utility extends Sprite {

public var fps:FPS;
public var settings:Settings;
public var stopLoss:StopLoss;

public function Utility ():void {
// LOAD GAME SETTINGS
settings = new Settings();

// WAIT TIL PRELOADER IS DONE
this.addEventListener (Event.ADDED_TO_STAGE,wait);
}
/*
WAITING FOR SECURITY CHECK
*/
public function wait (event:Event):void {
Global.data._game = this;
CustomMenu.buildMenu (this);
StopLoss.fraudCheck (this);
}
public function init ():void {
var timer:Timer=new Timer(Global.data._updatetime,0);// save game every x seconds
timer.addEventListener (TimerEvent.TIMER,timedLoop);
timer.start ();
this.addEventListener (Event.ENTER_FRAME,onRenderTick);
// host is good, so continue
fps = new FPS(695,35);
addChild (fps);
/*
RUN A TEST
*/
test ();
}
/*

PERFORM ALL YOUR TESTS HERE
*/
public function test ():void {
var td:TestData = new TestData;
var stuff = td.tar[0];
trace ("Array data: "+stuff); // traces "kittens"
}
/*

OUR LOOP RENDER / UPDATER, ENTER FRAME
*/
private function onRenderTick (event):void {
fps.addFrame ();
}
/*
UPDATE EVERY X SECONDS (GAME SAVES, ETC)
*/
private function timedLoop (e:TimerEvent):void {
//settings.update ();
}
// #END
}
}

Create a multiplayer userbase with playerio.

Free for 20gb, then 99 dollars per month.

PlayerRIO

Main.as (ppv3d example with box2d collisions)

// forked from hacker_waira's forked from: [Box2D][PV3D] Elevator
// forked from clockmaker's [Box2D][PV3D] Elevator
/*===================================================*//**
* Box2DAS3 and Papervision3D Demo
* ドラッグで3Dを回転できます。
* マウスホイールで拡大できます。
* 後ろ側の緑色のはBox2Dの2次元表示です。
*
* rsakane さんの投稿から Folk させていただきました。
*
* @author Yasu
* @see http://clockmaker.jp/blog/
* @since 2009.04.02
*//*===================================================*/
package
{
import Box2D.Collision.Shapes.*;
import Box2D.Collision.b2AABB;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.Joints.*;
import Box2D.Dynamics.*;

import org.papervision3d.cameras.CameraType;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.render.QuadrantRenderEngine;

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.ui.*;
import flash.utils.getTimer;
import flash.utils.Timer;

import org.papervision3d.events.*;
import org.papervision3d.lights.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.objects.*;
import org.papervision3d.view.*;
import org.papervision3d.objects.primitives.*;

import caurina.transitions.Tweener;

[SWF(width="465", height="465", frameRate="60", backgroundColor="0xFFFFFF")]
public class Main extends BasicView
{
// const vars
static public const OBJ_SIZE:int = 20;
static public const OBJ_COLOR:uint = 0x666666;

static private const CAMERA_DISTANCE:int = 1000;

// vars for Box2D
private var worldWidth:Number;
private var worldHeight:Number;
private var m_iterations:int;
private var m_wallWidth:Number;
private var m_wallHeight:Number;
private var m_timeStep:Number;
private var m_physScale:Number;
private var m_world:b2World;
private var m_mouseJoint:b2MouseJoint;
private var m_draggedBody:b2Body;
private var mouseXWorldPhys:Number;
private var mouseYWorldPhys:Number;
private var isMouseDown:Boolean;
private var arrayIndex:int;

// array of objs
private var pv3dObjsArr:Vector. = new Vector.();
private var box3dSpapesArr:Vector. = new Vector.();

// pv3d objs
private var light:PointLight3D;
private var mat:FlatShadeMaterial;

// timer count
private var timerCnt:int = 0;

/**
* Constructor
*/
public function Main()
{
stage.quality = StageQuality.MEDIUM;

Mouse.cursor = MouseCursor.HAND;

// init PV3D
super(stage.stageWidth, stage.stageHeight, false, false, CameraType.FREE);

// init PV3D World
createPaervision3dWorld();

// init Box2D World
createBox2dWorld()

// addEvent
addEventListener(Event.ENTER_FRAME, enterFrameHandler);

// Backgound
createBackGround();
//cerateFullScreenBtn();

// mouse interactive
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
}

/**
* Create Papervision3D World
*/
private function createPaervision3dWorld():void
{
camera.x = 0;
camera.z = -CAMERA_DISTANCE;

// heavy....
//renderer = new QuadrantRenderEngine(QuadrantRenderEngine.CORRECT_Z_FILTER);

// create light
light = new PointLight3D();
light.z = -100;

mat = new FlatShadeMaterial(light, OBJ_COLOR);
ballMat = new FlatShadeMaterial(light, 0xFFFF0F);

cameraTarget = new DisplayObject3D();
cameraTarget.x = -50;
cameraTarget.y = 50;
}

/**
* Create Box2D World
*/
private function createBox2dWorld():void
{
// init Box2D
worldWidth = stage.stageWidth;
worldHeight = stage.stageHeight;
m_iterations = 10;
m_timeStep = 1 / stage.frameRate;
m_physScale = 60;

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set( -1000, -1000);
worldAABB.upperBound.Set(1000, 1000);
var gravity:b2Vec2 = new b2Vec2(0, 50);
var doSleep:Boolean = true;
m_world = new b2World(worldAABB, gravity, doSleep);

var dbgDraw:b2DebugDraw = new b2DebugDraw();
dbgDraw.m_sprite = this;
dbgDraw.m_drawScale = SCALE;
dbgDraw.m_fillAlpha = 0.8;
dbgDraw.m_lineThickness = 0.3;
dbgDraw.m_alpha = 0.3;
dbgDraw.m_xformScale = 1.0
dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
m_world.SetDebugDraw(dbgDraw);

// walls for Box2D
createPolygon(stage.stageWidth / 2 / SCALE, 1.0, 354, 1.1, 0.1);
createPolygon(stage.stageWidth / 4 / SCALE, 2.1, 20, 1.2, 0.1);
createPolygon(stage.stageWidth / 2 / SCALE, 3.2, 354, 1.1, 0.1);
createPolygon(stage.stageWidth / 4 / SCALE, 4.0, 12, 2.3, 0.1);
createPolygon(0.5, 5.1, 0, 6, 0.5);
createPolygon(0, stage.stageHeight / 2 / SCALE, 90, stage.stageHeight / 2 / SCALE, 0.1);
createPolygon(3.32, stage.stageHeight / 2 / SCALE, 90, 1.5, 0.1);
createPolygon(4.58, stage.stageHeight / 2 / SCALE, 90, stage.stageHeight / SCALE, 0.1);

// walls for PV3D
addCubeAtPv3dWorldNoSave(stage.stageWidth / 2 / SCALE, 1.0, 354, 1.1, 0.1);
addCubeAtPv3dWorldNoSave(stage.stageWidth / 4 / SCALE, 2.1, 20, 1.2, 0.1);
addCubeAtPv3dWorldNoSave(stage.stageWidth / 2 / SCALE, 3.2, 354, 1.1, 0.1);
addCubeAtPv3dWorldNoSave(stage.stageWidth / 4 / SCALE, 4.0, 12, 2.3, 0.1);
addCubeAtPv3dWorldNoSave(0.5, 5.1, 0, 6, 0.5);
addCubeAtPv3dWorldNoSave(0, stage.stageHeight / 2 / SCALE, 90, stage.stageHeight / 2 / SCALE, 0.1);
addCubeAtPv3dWorldNoSave(3.32, stage.stageHeight / 2 / SCALE, 90, 1.5, 0.1);
addCubeAtPv3dWorldNoSave(4.58, stage.stageHeight / 2 / SCALE, 90, stage.stageHeight / SCALE, 0.1);

// elevator
for (var i:int = 0; i < 14; i++)
{
addCubeAtPv3dWorld(0.23, 0.1, true);
if (i % 2) addRectAtBox2dWorld(3.7, i * 0.4, 0, 0.23, 0.1, "elevator");
else addRectAtBox2dWorld(4.2, i * 0.4, 0, 0.23, 0.1, "elevator");
}

// balls
for (i = 0; i < 4; i++)
{
addSphereAtPv3dWorld(40, 30, OBJ_SIZE);
addCircleAtBox2dWorld(40, 30, OBJ_SIZE);
}
}

private function addCubeAtPv3dWorldNoSave(posX:Number, posY:Number, degree:Number, hx:Number, hy:Number, id:String = "", density:Number = 0.0, restitution:Number = 0.0,
setMass:Boolean = false):void
{
var obj3d:DisplayObject3D = scene.addChild(
new Cube(
new MaterialsList( { all: mat } ),
hx * m_physScale * 2,
30,
hy * m_physScale * 2));

obj3d.x = + posX * m_physScale - worldWidth / 2;
obj3d.y = - posY * m_physScale + worldHeight / 2;
obj3d.rotationZ = - degree
}

/**
* AddItem at Papervision3D World
*/
private function addSphereAtPv3dWorld(posX:Number, posY:Number, radius:Number):void
{
var obj3d:DisplayObject3D = scene.addChild(new Sphere(ballMat, radius / 2, 6, 5));
pv3dObjsArr.push(obj3d);
}

/**
* AddItem at Papervision3D World
*/
private function addCubeAtPv3dWorld(hx:Number, hy:Number, isSaveArray:Boolean):void
{
var obj3d:DisplayObject3D = scene.addChild(
new Cube(
new MaterialsList( { all: mat } ),
hx * m_physScale * 2,
hy * m_physScale * 2,
10));
if(isSaveArray) pv3dObjsArr.push(obj3d);
}

/**
* AddItem at Box2D World
*/
private function addCircleAtBox2dWorld(posX:Number, posY:Number, radius:Number):void
{
var obj3d:DisplayObject3D = pv3dObjsArr[pv3dObjsArr.length - 1];

var circleShape:b2CircleDef = new b2CircleDef();
circleShape.radius = radius / m_physScale / 2;
circleShape.density = 1;
circleShape.friction = 1;
circleShape.restitution = 0.6;
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set((posX + worldWidth / 2) / m_physScale, (posY + worldHeight / 2) / m_physScale);
bodyDef.userData = { id:"", obj:obj3d };
var body:b2Body = m_world.CreateBody(bodyDef);
body.CreateShape(circleShape);
//body.SetUserData( { obj:obj3d } );
body.SetMassFromShapes();

box3dSpapesArr.push(body);
}

/**
* AddItem at Box2D World
*/
private function addRectAtBox2dWorld(
posX:Number, posY:Number, degree:Number,
hx:Number, hy:Number, id:String = "",
density:Number = 0.0, restitution:Number = 0.0,
setMass:Boolean = false):void
{
var obj3d:DisplayObject3D = pv3dObjsArr[pv3dObjsArr.length - 1];

var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(posX, posY);
bodyDef.angle = degree * Math.PI / 180;
if (id) bodyDef.userData = { id:id, obj:obj3d };

var blockShape:b2PolygonDef = new b2PolygonDef();
blockShape.SetAsBox(hx, hy);
blockShape.density = density;
blockShape.restitution = restitution;

var body:b2Body = m_world.CreateBody(bodyDef);
body.CreateShape(blockShape);
//body.SetUserData(obj3d);

if (setMass) body.SetMassFromShapes();
}

/**
* Enter Frame
* @param event
*/
private function enterFrameHandler(event:Event):void
{
// update Box2D step
m_world.Step(m_timeStep, m_iterations);
// sync position to PV3D from Box2D
for (var bb:b2Body = m_world.GetBodyList(); bb; bb = bb.GetNext())
{
if (bb.m_userData)
{
if (bb.m_userData.id == "elevator")
{
bb.SetXForm(new b2Vec2(bb.GetPosition().x, bb.GetPosition().y - 0.02), 0);
if (bb.GetPosition().y < -0.1) bb.SetXForm(new b2Vec2(bb.GetPosition().x, stage.stageHeight / SCALE + 1), 0);
if (bb.GetPosition().y < 0.8) bb.SetXForm(bb.GetPosition(), bb.GetAngle() - 0.2);
}

if (bb.m_userData.obj is DisplayObject3D)
{
var obj:DisplayObject3D = bb.m_userData.obj;

obj.x = bb.GetPosition().x * m_physScale - worldWidth / 2;
obj.y = -bb.GetPosition().y * m_physScale + worldHeight / 2;
obj.rotationZ = -bb.GetAngle() * (180 / Math.PI);
}
}
}

// Mouse Interactive
easePitch += (cameraPitch - easePitch) * 0.2
easeYaw += (cameraYaw - easeYaw) * 0.2
camera.orbit(easePitch, easeYaw, true, cameraTarget);

camera.zoom += (easeZoom - camera.zoom) * 0.1;

singleRender();
}

private function createBackGround():void
{
graphics.beginFill(0xFFFFFF);
graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
}

//-------------------------------------------------------------------
// forked from Box2Dの練習
// http://wonderfl.kayac.com/code/5fdd0af34ca9e7a3369f74c52cca9ddb85d136e4
//-------------------------------------------------------------------

private const SCALE:uint = 100;

private function createPolygon(posX:Number, posY:Number, degree:Number, hx:Number, hy:Number, id:String = "", density:Number = 0.0, restitution:Number = 0.0,
setMass:Boolean = false):void
{
var blockBodyDef:b2BodyDef = new b2BodyDef();
blockBodyDef.position.Set(posX, posY);
blockBodyDef.angle = degree * Math.PI / 180;
if (id)
{
blockBodyDef.userData = new Object();
blockBodyDef.userData.id = id;
}

var blockShape:b2PolygonDef = new b2PolygonDef();
blockShape.SetAsBox(hx, hy);
blockShape.density = density;
blockShape.restitution = restitution;

var blockBody:b2Body = m_world.CreateBody(blockBodyDef);
blockBody.CreateShape(blockShape);

if (setMass) blockBody.SetMassFromShapes();
}

// ----------------------------------------------
// Mouse Interactive
// http://wonderfl.kayac.com/code/2af71dd58ee46ba3ebf7496c63b4726c84a20980
// ----------------------------------------------

private var isOribiting:Boolean;
private var cameraPitch:Number = 50;
private var cameraYaw:Number = 300;
private var cameraTarget:DisplayObject3D = DisplayObject3D.ZERO;
private var previousMouseX:Number;
private var previousMouseY:Number;
private var easePitch:Number = 90;
private var easeYaw:Number = 270;
private var easeZoom:Number = 150;
private var ballMat:FlatShadeMaterial;

private function onMouseDown(event:MouseEvent):void
{
isOribiting = true;
previousMouseX = event.stageX;
previousMouseY = event.stageY;
singleRender();
}

private function onMouseUp(event:MouseEvent):void
{
isOribiting = false;
}

private function onMouseMove(event:MouseEvent):void
{
var differenceX:Number = event.stageX - previousMouseX;
var differenceY:Number = event.stageY - previousMouseY;

if(isOribiting)
{
cameraPitch += differenceY * 0.25;
cameraYaw += differenceX * 0.25;

cameraPitch %= 360;

cameraPitch = cameraPitch > 0 ? cameraPitch : 0.0001;
cameraPitch = cameraPitch < 180 ? cameraPitch : 179.9999;

previousMouseX = event.stageX;
previousMouseY = event.stageY;
}
}

private function onMouseWheel(e:MouseEvent):void
{
easeZoom += e.delta;
easeZoom = Math.max(1, easeZoom);
}
}
}

This menu will enable switching to fullscreen mode

AS3 – org > application > CustomMenu.as


package org.application{

import flash.display.Sprite;
import flash.display.StageDisplayState;
import flash.events.ContextMenuEvent;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.net.URLRequest;
import flash.net.navigateToURL;

public dynamic class CustomMenu extends Sprite{;

public static var cm:ContextMenu = new ContextMenu;
public static var year:Date=new Date;

public static var menuItem1:ContextMenuItem=new ContextMenuItem("Go Fullscreen");
public static var menuItem2:ContextMenuItem=new ContextMenuItem("Exit Fullscreen");
public static var menuItem3:ContextMenuItem=new ContextMenuItem(year.getFullYear() + Global.data._company_website);

public static function goToSite(event:ContextMenuEvent):void {
var url:URLRequest = new URLRequest("http://"+Global.data._company_website);
navigateToURL(url,"_blank");
}

public static function goFullScreen(event:ContextMenuEvent):void {
Global.data._game.stage.displayState = StageDisplayState.FULL_SCREEN;
menuItem1.enabled = false;
menuItem2.enabled = true;
}

public static function exitFullScreen(event:ContextMenuEvent):void {
Global.data._game.stage.displayState = StageDisplayState.NORMAL;
menuItem1.enabled = true;
menuItem2.enabled = false;
}
public static function buildMenu(stage:Object):CustomMenu {
//trace("RIGHT CLICK MENU ENABLED");

var self:CustomMenu = new CustomMenu;

menuItem2.enabled=false;
menuItem3.separatorBefore=true;
menuItem3.enabled=false;

menuItem1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, goFullScreen);
menuItem2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,exitFullScreen);
menuItem3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, goToSite);

cm.hideBuiltInItems();
cm.customItems.push(menuItem1,menuItem2,menuItem3);
Global.data._game.contextMenu=cm;

return self;
}
}
}

/*cm.builtInItems.forwardAndBack = false;
cm.builtInItems.loop = false;
cm.builtInItems.play = false;
cm.builtInItems.print = false;
cm.builtInItems.quality = false;
cm.builtInItems.rewind = false;
cm.builtInItems.save = false;
cm.builtInItems.zoom = false;*/

For use with Papervision3D
org > addons > HUD.as


package org.addons{

import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.utils.*;
import flash.text.*;

import org.addons.Global;
import org.addons.movies.*;

/* ======================================================= */
/****** ** RAIDFORCE 3D GAME ENGINE ** *******/
/*** Year: 2010 ***/
/** Ken Clinton **/
/** **/
/*** ADMIN@TOGAGAMES.COM **/
/** **/
/* ================================================ */

public class HUD extends MovieClip {

public var chat_mc:ChatMC;
public var dev_mc:DevMC;
public var inventory_mc:InventoryMC;
public var menu_mc:MenuMC;
public var options_mc:OptionsMC;

public var msgBox:TextField;
private var format:TextFormat;

private var reloading:Boolean=false;
private var using:Boolean=false;
private var switching:Boolean=false;
private var openchat:Boolean=false;
private var openoptions:Boolean=false;
private var openinventory:Boolean=false;
private var escaping:Boolean=false;
public var opendev:Boolean=false;
private var entering:Boolean=false;

public function HUD():void {
Global.data._hud=this;
//
chat_mc=new ChatMC ;
chat_mc.alpha=.87;
chat_mc.x=Global.data._chatx;
chat_mc.y=Global.data._chaty;
//
dev_mc=new DevMC ;
dev_mc.alpha=.93;
dev_mc.x=Global.data._devx;
dev_mc.y=Global.data._devy;
//
inventory_mc=new InventoryMC ;
inventory_mc.alpha=.93;
inventory_mc.x=Global.data._invx;
inventory_mc.y=Global.data._invy;
//
menu_mc=new MenuMC ;
menu_mc.alpha=.93;
menu_mc.x=Global.data._menux;
menu_mc.y=Global.data._menuy;
//
options_mc=new OptionsMC ;
options_mc.alpha=.93;
options_mc.x=Global.data._opx;
options_mc.y=Global.data._opy;
//
format=new TextFormat ;
format.font="Tahoma";
format.color=0xFFFFFF;
format.size=13;
format.bold=true;
format.align="left";
//
msgBox=new TextField ;
msgBox.multiline=true;
msgBox.x=20;
msgBox.y=366;
msgBox.width=300;
msgBox.height=230;
msgBox.defaultTextFormat=format;
msgBox.antiAliasType=AntiAliasType.ADVANCED;
msgBox.type=TextFieldType.DYNAMIC;
msgBox.wordWrap=true;
msgBox.selectable=false;
msgBox.htmlText="Welcome to Raid Force Game Engine";
addChild(msgBox);

addListeners();
//set to have closed upon first HUD open
Global.data._chatopen=false;
Global.data._invopen=false;
Global.data._opopen=false;
Global.data._devopen=false;
Global.data._menuopen=false;

// check to see if they have things open
if (Global.data._chatopen) {
toggleBox("open",chat_mc);
}
if (Global.data._devopen) {
toggleBox("open",dev_mc);
}
if (Global.data._invopen) {
toggleBox("open",inventory_mc);
}
if (Global.data._menuopen) {
toggleBox("open",menu_mc);
}
if (Global.data._opopen) {
toggleBox("open",options_mc);
}
}
public function Chat(msg:String) {
msgBox.htmlText+= msg;
}
public function toggleBox(dowhat:String,towhat:MovieClip):void {
if (dowhat == "close") {
towhat.destroy();
} else if (dowhat == "open") {
addChild(towhat);
towhat.initialize();
}
}
private function addListeners():void {
Global.data._game.stage.addEventListener(KeyboardEvent.KEY_DOWN,handleKeyDown);
Global.data._game.stage.addEventListener(KeyboardEvent.KEY_UP,handleKeyUp);
}
private function removeListeners():void {
Global.data._game.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleKeyDown);
Global.data._game.stage.removeEventListener(KeyboardEvent.KEY_UP,handleKeyUp);
}
/*

Handlers

our main menu boxes include: menu > dev > options > inventory > chat
*/
private function handleKeyDown(evt:KeyboardEvent):void {
switch (evt.keyCode) {

case Global.data._kChat :
if (! openchat && ! Global.data._chatopen && ! Global.data._devopen && ! Global.data._menuopen) {
// open the chat box only
toggleBox("open",chat_mc);
}
openchat=true;
break;

case Global.data._kDev :
if (! opendev && ! Global.data._devopen && ! Global.data._chatopen && ! Global.data._menuopen) {
toggleBox("open",menu_mc);
toggleBox("open",dev_mc);
} else if (! opendev && ! Global.data._devopen && Global.data._menuopen && ! Global.data._chatopen) {
toggleBox("open",dev_mc);
} else if (! opendev && ! Global.data._chatopen && Global.data._devopen && Global.data._menuopen) {
toggleBox("close",menu_mc);
toggleBox("close",dev_mc);
}
opendev=true;
break;

case Global.data._kEnter :
if (! entering && Global.data._chatopen) {
chat_mc.submit();
toggleBox("close",chat_mc);
} else if (! entering && Global.data._devopen) {
dev_mc.submit();
}
entering=true;
break;

case Global.data._kInventory :
if (! openinventory && ! Global.data._invopen && ! Global.data._menuopen && ! Global.data._devopen && ! Global.data._chatopen) {
toggleBox("open",inventory_mc);
} else if (! openinventory && Global.data._invopen && ! Global.data._chatopen && ! Global.data._devopen && ! Global.data._menuopen) {
toggleBox("close",inventory_mc);
}
openinventory=true;
break;

case Global.data._kMenu :
if (! escaping && ! Global.data._menuopen && ! Global.data._chatopen && ! Global.data._devopen) {
toggleBox("open",menu_mc);
} else if (! escaping && ! Global.data._menuopen && Global.data._chatopen && ! Global.data._devopen) {
toggleBox("close",chat_mc);
openchat=false;
} else if (! escaping && Global.data._menuopen && ! Global.data._chatopen && ! Global.data._devopen) {
toggleBox("close",menu_mc);
} else if (! escaping && Global.data._menuopen && ! Global.data._chatopen && Global.data._devopen) {
toggleBox("close",dev_mc);
toggleBox("close",menu_mc);
}
escaping=true;
break;

case Global.data._kOptions :
if (! openoptions && ! Global.data._opopen && ! Global.data._menuopen && ! Global.data._devopen && ! Global.data._chatopen) {
toggleBox("open",options_mc);
} else if (! openoptions && Global.data._opopen && ! Global.data._chatopen && ! Global.data.devopen && ! Global.data._menuopen) {
toggleBox("close",options_mc);
}
openoptions=true;
break;

case Global.data._kReload :
reloading=true;
break;

case Global.data._kSwitch :
switching=true;
break;

case Global.data._kUse :
using=true;
break;
}
}
private function handleKeyUp(evt:KeyboardEvent):void {
switch (evt.keyCode) {

case Global.data._kChat :
openchat=false;
break;

case Global.data._kDev :
opendev=false;
break;

case Global.data._kEnter :
entering=false;
break;

case Global.data._kInventory :
openinventory=false;
break;

case Global.data._kMenu :
escaping=false;
break;

case Global.data._kOptions :
openoptions=false;
break;

case Global.data._kReload :
reloading=false;
break;

case Global.data._kSwitch :
switching=false;
break;

case Global.data._kUse :
using=false;
break;
}
}
}
}