LISTING PROGRAM
GuardianTree.cs
package com.vuseon.guardiantree {
import com.vuseon.guardiantree.screen.MainMenu; import flash.desktop.NativeApplication;
...
import com.vuseon.guardiantree.properties.GameProperties;
public class GuardianTree extends Sprite {
private var stats:Stats; private var starling:Starling; private var s:String;
private var tf:TextField;
public function GuardianTree() {
initScreen();
Starling.handleLostContext = true;
var viewPort:Rectangle = new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight)
starling = new Starling(Game, stage, viewPort); s = starling.stage.stageWidth + " " +
starling.stage.stageHeight + " " + starling.stage.stageWidth + " " + starling.stage.stageHeight;
starling.stage.stageWidth = GameProperties.stageW; starling.stage.stageHeight = GameProperties.stageH; starling.antiAliasing = 1;
starling.start();
Starling.current.nativeStage.addEventListener(KeyboardEvent.KEY_DOWN , keyPressed);
}
private function initScreen():void {
stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT;
stage.addEventListener(Event.RESIZE, stageResize); }
private function stageResize(e:Event):void {
removeEventListener(Event.RESIZE, stageResize); }
private function deactivate(e:Event):void {
private function keyPressed(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.BACK) {
e.preventDefault();
e.stopImmediatePropagation(); trace("Back button is pressed"); }
} }
}
Game.as
package com.vuseon.guardiantree {
import com.vuseon.guardiantree.events.NavigationEvent; import com.vuseon.guardiantree.properties.GameProperties; ...
import starling.events.Event;
public class Game extends Sprite {
private var screenMainMenu:MainMenu; private var screenInGame:InGame; ...
private var currentState:Sprite;
public function Game() {
new MetalWorksMobileTheme();
this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void {
this.removeEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
Starling.current.showStats = true;
this.addEventListener(NavigationEvent.CHANGE_SCREEN, onChangeScreen);
addChild(new Intro());
}
private function onChangeScreen(event:NavigationEvent):void {
switch (event.params.id) {
case "intro": break; case "main_menu":
screenAboutGame.disposeTemporarily();
if (screenInGame != null) {
removeChild(screenInGame); screenInGame = null; }
if (screenMainMenu == null) {
screenMainMenu = new MainMenu(); screenMainMenu.initialize(); this.addChild(screenMainMenu); }else{
screenMainMenu.visible = true; }
addChild(new Transition(this)); break;
case "about":
trace("ABOUT");
if (screenAboutGame == null)
screenAboutGame = new AboutGame(); screenAboutGame.initialize();
this.addChild(screenAboutGame); screenMainMenu.disposeTemporarily(); addChild(new Transition(this)); break;
case "help":
if (screenHelp == null)
screenHelp = new Help(); screenHelp.initialize();
this.addChild(screenHelp);
screenMainMenu.disposeTemporarily(); addChild(new Transition(this)); break;
case "level":
screenMainMenu.disposeTemporarily();
if (screenInGame != null) {
removeChild(screenInGame); screenInGame = null
}
if (screenLevel == null)
screenLevel = new LevelSelection(); else{
screenLevel.revive(); }
screenLevel.initialize(); this.addChild(screenLevel);
screenMainMenu.disposeTemporarily(); addChild(new Transition(this)); break;
case "play":
{
removeChild(screenInGame); screenInGame = null
}
if (screenInGame == null)
screenInGame = new InGame();
screenInGame.initialize(); this.addChild(screenInGame); screenLevel.disposeTemporarily(); addChild(new Transition(this)); break;
} }
} }
MainMenu.cs
package com.vuseon.guardiantree.screen {
import com.vuseon.guardiantree.Assets;
import com.vuseon.guardiantree.events.NavigationEvent; ...
import starling.events.Event;
public class MainMenu extends Sprite {
private var _bg:Image;
private var _btnOption:Button; ...
private var _btnQuit:Button;
public function MainMenu() {
super();
}
public function initialize():void {
this.visible = true;
this.addEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
}
public function disposeTemporarily():void {
this.visible = false; }
this.removeEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
trace("welcome screen initialized");
_bg = new Image(Assets.getTexture("MainMenuBmp")); addChild(_bg);
_btnPlay = new
Button(Assets.getAtlas().getTexture("menu_play"));
_btnPlay.x = GameProperties.stageW / 4 - 30; _btnPlay.y = 300;
_btnPlay.addEventListener(Event.TRIGGERED, onTriggered);
addChild(_btnPlay);
/*_btnOption = new
Button(Assets.getAtlas().getTexture("main_options")); _btnOption.x =
GameProperties.stageW/4+_btnOption.width+60; _btnOption.y = 300; addChild(_btnOption);*/
_btnHelp = new
Button(Assets.getAtlas().getTexture("menu_help"));
_btnHelp.x = GameProperties.stageW / 4 + _btnHelp.width * 2.5 - 50;
_btnHelp.y = 300;
_btnHelp.addEventListener(Event.TRIGGERED, onTriggered);
addChild(_btnHelp);
_btnAbout = new
Button(Assets.getAtlas().getTexture("menu_information")); _btnAbout.x = GameProperties.stageW / 4 + _btnAbout.width * 5 - 50;
_btnAbout.y = 300;
_btnAbout.addEventListener(Event.TRIGGERED, onTriggered);
addChild(_btnAbout);
_btnQuit = new
Button(Assets.getAtlas().getTexture("menu_xcross"));
_btnQuit.x = GameProperties.stageW / 4 + _btnAbout.width * 7.5 - 50;
_btnQuit.y = 300;
_btnQuit.addEventListener(Event.TRIGGERED, onTriggered);
addChild(_btnQuit);
_btnOption = new
Button(Assets.getAtlas().getTexture("menu_menu"));
_btnOption.x = GameProperties.stageW / 10 + _btnAbout.width * 7.5 - 50;
_btnOption.y = 0;
_btnOption.addEventListener(Event.TRIGGERED, onTriggered);
//
_btnOption.visible = false;
var title:Image = new Image(Assets.getTexture("TitleBmp"));
title.x = GameProperties.stageW / 4; title.y = GameProperties.stageH / 6; addChild(title);
}
private function onTriggered(e:Event):void {
var btn:Button = e.target as Button; switch (btn)
{
case _btnPlay:
this.dispatchEvent(new
NavigationEvent(NavigationEvent.CHANGE_SCR EEN, {id: "level"}, true));
break; case _btnHelp:
this.dispatchEvent(new
NavigationEvent(NavigationEvent.CHANGE_SCR EEN, {id: "help"}, true));
break; case _btnAbout:
this.dispatchEvent(new
NavigationEvent(NavigationEvent.CHANGE_SCR EEN, {id: "about"}, true));
break; case _btnQuit:
NativeApplication.nativeApplication.exit(); break;
case _btnOption: showOption(); break;
}
}
private function showOption():void {
new OptionPanel(this);
}
} }
AStar.as
package com.vuseon.guardiantree.pathfinding {
...
import starling.utils.Color;
public class AStar {
private var _open:Array; private var _closed:Array; ...
private var ii:uint = 0;
public function AStar() {
}
public function findPath(grid:Grid):Boolean {
_time = getTimer();
trace("waktu awal: " + _time); _grid = grid;
_open = new Array(); _closed = new Array();
_startNode = _grid.startNode; _endNode = _grid.endNode; _searchPath = new Array();
_startNode.g = 0;
_startNode.h = _heuristic(_startNode); _startNode.f = _startNode.g + _startNode.h;
return search(); }
public function search():Boolean {
var node:Node = _startNode; var iii:int = 0;
while (node != _endNode) {
var startX:int = Math.max(0, node.x - 1); var endX:int = Math.min(_grid.numCols - 1,
node.x + 1); var startY:int = Math.max(0, node.y - 1); var endY:int = Math.min(_grid.numRows - 1, node.y + 1);
for (var i:int = startX; i <= endX; i++) {
for (var j:int = startY; j <= endY; j++) {
var test:Node = _grid.getNode(i, j);
{
continue; }
var cost:Number = _straightCost;
if (!((node.x == test.x) || (node.y == test.y)))
{
cost = _diagCost; continue;
}
var g:Number = node.g + cost; var h:Number = _heuristic(test); var f:Number = g + h;
if (isOpen(test) || isClosed(test)) {
if (test.f > f) {
test.f = f; test.g = g; test.h = h;
test.parent = node;
if (GameProperties.showPath) {
_searchPath.push(test); }
} }
else {
test.f = f; test.g = g; test.h = h;
test.parent = node; _open.push(test)
if (GameProperties.showPath) {
_searchPath.push(test);
} }
} }
for (var o:int = 0; o < _open.length; o++) {
}
_closed.push(node); if (_open.length == 0) {
trace("no path found"); return false
var index:uint = getShortestF();
node = _open[index] as Node;//as sama dengan cast
_open.splice(index, 1); //iii++;
}
buildPath();
trace("waktu awal :" + _time + " waktu akhir:" + getTimer() + " Operasi A* berhasil dilakukan dalam " + (getTimer() - _time) + " ms atau" + ((getTimer() - _time) / 1000) + " detik");
trace(getTimer());
trace("panjang pencarian:" + _searchPath.length); return true;
}
private function getShortestF():uint {
var f1:uint = _open[0].f; var f2:uint;
var index:uint=0;
for (var i:uint = 1; i < _open.length; i++) {
f2 = _open[i].f; if (f1 > f2) {
f1 = f2; index = i; }
}
trace("index:" + index); return index;
}
private function buildPath():void {
_path = new Array(); var node:Node = _endNode; _path.push(node);
while (node != _startNode) {
node = node.parent; _path.unshift(node);
}
}
public function get path():Array {
return _path; }
private function isOpen(node:Node):Boolean {
for (var i:int = 0; i < _open.length; i++) {
{
return true; }
}
return false; }
private function isClosed(node:Node):Boolean {
for (var i:int = 0; i < _closed.length; i++) {
if (_closed[i] == node) {
return true; }
}
return false; }
private function manhattan(node:Node):Number {
return Math.abs(node.x - _endNode.x) * _straightCost + Math.abs(node.y - _endNode.y) * _straightCost;
}
public function get visited():Array {
return _closed.concat(_open); }
public function get searchPath():Array {
return _searchPath; }
public function set searchPath(value:Array):void {
_searchPath = value; }
} }
InGame.as
package com.vuseon.guardiantree.screen {
import com.vuseon.guardiantree.Assets;
import com.vuseon.guardiantree.events.NavigationEvent; ...
import com.vuseon.guardiantree.objects.Character;
public class InGame extends Sprite {
private var _cellSize:int = 60; private var _grid:Grid;
public var _grounds:Vector.<Vector.<Image>>;
public function InGame() {
//stage.align = StageAlign.TOP_LEFT;
//stage.scaleMode = StageScaleMode.NO_SCALE;
//this.addEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
}
public function initialize():void {
this.addEventListener(starling.events.Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void {
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
GameProperties.gameWorld = this; makeGrid();
setUi();
setDefaultProperties(); setEvent();
}
private function setEvent():void {
_myTimer = new StarlingTimer(Starling.juggler, 1000, 0);
_myTimer.addEventListener(StarlingTimerEvent.TIMER, onTimerUpdate);
_myTimer.start();
this.addEventListener(EnterFrameEvent.ENTER_FRAME, gameLoop);
}
private function onTimerUpdate(e:Event):void {
trace("Current Time:" + _timer + " TIME SPAWN:" + GameProperties.timeEnemySpawn);
trace("Current Enemy:" + _enemies.length + " Enemy In:" + GameProperties.enemyIn);
}
private function gameLoop(e:EnterFrameEvent):void {
if (GameProperties.isPaused) return;
if (_trees != null && _trees.length > 0) {
_startGame = true;
if (_enemies.length < GameProperties.MAX_ENEMY) _timer++;
if (_timer > GameProperties.timeEnemySpawn && GameProperties.timeEnemySpawn > 60 && _enemies.length <
GameProperties.MAX_ENEMY) {
_timer = 0; spawnEnemy();
GameProperties.enemyIn++;
if (GameProperties.enemyIn % 3 == 0) {
GameProperties.timeEnemySpawn -= 30;
}
if (GameProperties.enemyIn % 6 == 0) {
GameProperties.maxEnemy++; }
} }
if (_trees != null && _trees.length == 0 && _startGame) {
this.removeEventListener(EnterFrameEvent.ENTER_FRAME, gameLoop); GameProperties.isPaused = true;
Starling.juggler.pause();
addChild(new PopUpMenu("game_over", this)); }
}
private function showMenu():void {
}
public function gameOver():void {
_startGame = false; destroyChild(); resetTileColor(); dispose();
}
private function setDefaultProperties():void {
_enemies = new Array(); _heroes = new Array(); _trees = new Array();
GameProperties.timeEnemySpawn = GameProperties.TIME_ENEMY_SPAWN;
GameProperties.enemyIn = 0;
GameStatistic.oxy = GameProperties.START_OXY; GameStatistic.score = 0;
GameStatistic.times = 0
GameStatistic.oxygentxt.text = "OXY : 300"; GameStatistic.scoreText.text = "SCORE : 0"; GameStatistic.timetxt.text = "TIME : 0"
GameProperties.isPaused = false;
}
private function setUi():void {
characterHUD(); consoleText(); statusHUD(); buttonHUD();
}
private function buttonHUD():void {
_btnPause = new
Button(Assets.getAtlas().getTexture("menu_pause")); _btnPause.x = 30;
_btnPause.y = 460; addChild(_btnPause);
_btnPause.addEventListener(Event.TRIGGERED, onTriggered);
var str:String = (GameProperties.showPath) ? "menu_check" :
"menu_xcross"; _btnDev = new
Button(Assets.getAtlas().getTexture(str));
_btnDev.x = 50 + _btnDev.width; _btnDev.y = 460;
_btnDev.text = "Developer Mode?";
_btnDev.addEventListener(Event.TRIGGERED, onTriggered); addChild(_btnDev);
_btnPause.addEventListener(Event.TRIGGERED, onTriggered);
}
private function onTriggered(e:Event):void {
if (e.target as Button == _btnPause) {
if (!GameProperties.isPaused) {
addChild(new PopUpMenu("pause", this)); }
else {
GameProperties.isPaused = false; Starling.juggler.start();
} }
else if (e.target as Button == _btnDev) {
if ((GameProperties.showPath)) {
_btnDev.upState =
Assets.getAtlas().getTexture("menu_xcross"); resetTileColor();
GameProperties.showPath = false;
} else {
_btnDev.upState =
Assets.getAtlas().getTexture("menu_check");
GameProperties.showPath = true; }
} }
private function statusHUD():void {
GameStatistic.time = new Timer(); GameStatistic.time.start();
GameStatistic.scoreText = new TextField(200, 32, "SCORE : " + GameStatistic.score, Assets.getFont().name, 20, 0xffffff);
GameStatistic.scoreText.hAlign = HAlign.LEFT; GameStatistic.scoreText.x = 200;
GameStatistic.scoreText.y = GameProperties.stageH - 60; addChild(GameStatistic.scoreText);
GameStatistic.oxygentxt = new TextField(200, 32, "OXY : " + GameProperties.START_OXY, Assets.getFont().name, 20, 0xffffff);
GameStatistic.oxygentxt.hAlign = HAlign.LEFT; GameStatistic.oxygentxt.x = 330;
GameStatistic.oxygentxt.y = GameProperties.stageH - 60; addChild(GameStatistic.oxygentxt);
GameStatistic.timetxt = new TextField(200, 32, "TIME : " + GameStatistic.times + " s", Assets.getFont().name, 20, 0xffffff);
GameStatistic.timetxt.hAlign = HAlign.LEFT; GameStatistic.timetxt.x = 460;
GameStatistic.timetxt.y = GameProperties.stageH - 60; //GameStatistic.timetxt.border = true;
//GameStatistic.timetxt.height = GameStatistic.oxygentxt.textBounds.height + 10;
}
private function spawnEnemy():void {
trace("Game tree: " + _trees.length); var _enemy:Enemy = new Enemy(this, _grid,
_trees[Math.round(Math.random() * (_trees.length - 1))], _cellSize, _path);
_enemy.x = (Math.pow(14, Math.round(Math.random() * 1)) * _cellSize) + 30;
_enemy.y = (Math.pow(5, Math.round(Math.random() * 1)) * _cellSize) + 30;
if (GameProperties.currentLevel == 1) {
_enemy.x = 30;
_enemy.y = _cellSize + 30; }
else if (GameProperties.currentLevel == 3) {
_enemy.x = 30; _enemy.y = 30; }
else if (GameProperties.currentLevel == 4) {
_enemy.x = 30;
_enemy.y = 8 * _cellSize + 30; }
this.addChild(_enemy); _enemy.findTarget(_trees); _enemies.push(_enemy); }
private function makeGrid():void {
if (GameProperties.currentLevel <= 3) {
_grid = new Grid(16, 7); //max level GameProperties.GameAreaH = 400; }
else {
_grid = new Grid(16, 9); GameProperties.GameAreaH = GameProperties.stageH;
}
//membuat node yang tidak bisa di lewati if (!GameProperties.developerMode)
var level:Array = GameProperties["level" + GameProperties.currentLevel];
for (var i:int = 0; i < _grid.numCols; i++) {
if (GameProperties.developerMode) {
break; }
else {
if (level[j][i] == 1)
_grid.setWalkable(i, j, false);
} }
}
drawGrid(); }
private function drawGrid():void {
_grounds = new Vector.<Vector.<Image>>(); for (var i:int = 0; i < _grid.numCols; i++) {
_grounds.push(new Vector.<Image>());
for (var j:int = 0; j < _grid.numRows; j++) {
var tile:Image = new
Image(Assets.getAtlas().getTexture("tile_" + Math.ceil(Math.random() * 6)));
tile.x = (i * _cellSize); tile.y = (j * _cellSize); addChild(tile);
_grounds[i][j] = tile;
if (!_grid.getNode(i, j).walkable) {
var block:Image = new Image(Assets.getAtlas().getTexture("stoneblock"));
block.x = (i * _cellSize); block.y = (j * _cellSize); addChild(block);
}
}
}
}
Enemy.as
package com.vuseon.guardiantree.objects {
import com.greensock.easing.Expo; import com.vuseon.guardiantree.Assets; ...
import starling.utils.Color;
{
private var _xpos:uint; private var _ypos:uint; private var _game:InGame; private var _tree:Tree; ...
private var _myTimer:StarlingTimer; private var jj:uint = 0;
public function Enemy(game:InGame, grid:Grid, tree:Tree, cellSize:uint,
path:Array) {
_game = game; _grid = grid; ...
_myTimer = new StarlingTimer(Starling.juggler, 400, 0);
}
private function onTouch(e:TouchEvent):void {
var touch:Touch = e.getTouch(stage);
if (touch !== null && touch.phase == TouchPhase.ENDED) {
if (GameStatistic.oxy > 0)
GameStatistic.addOxy(-10); takeDmg(5);
}
if (_health <= 0)
InGame._enemies.splice(InGame._enemies.indexOf(this), 1);
}
public function findTarget(trees:Array):void {
if (trees.length > 0) {
_htrees = new Array(); _trees = trees;
xpos = Math.floor(x / _cellSize); ypos = Math.floor(y / _cellSize);
var astar:AStar = new AStar(); var tempLength:Array = new Array();
for (var i:uint = 0; i < _trees.length; i++) {
_grid.setEndNode(_trees[i].xpos, _trees[i].ypos);
_grid.setStartNode(xpos, ypos);
{
var temp:Array = new Array(); temp[0] = i;
temp[1] = astar.path.length; temp[2] = astar.path;
temp[3] = astar.searchPath; tempLength.push(temp);
} }
_index = 0;
trace(tempLength);
tempLength.sortOn("1", Array.NUMERIC); trace(tempLength);
_path = tempLength[0][2];
_targetIndex = tempLength[0][0];
trace("tree " + _trees[_targetIndex].xpos + " " + _trees[_targetIndex].ypos);
for (var j:uint = 0; j < _path.length; j++) trace(_path[j].x + " " + _path[j].y);
if (GameProperties.showPath) {
ii = 0;
jj = _path.length - 1;
_searchPath = tempLength[0][3];
_myTimer.addEventListener(StarlingTimerEvent.TIMER, onTimerUpdate); _myTimer.start();
}else {
addEventListener(Event.ENTER_FRAME, enterFrame);
}
tempLength = null; //trace(_path); }
}
private function onTimerUpdate(e:Event):void {
if (ii >= _searchPath.length) {
if (jj <= 0) {
addEventListener(Event.ENTER_FRAME, enterFrame);
_myTimer.removeEventListener(StarlingTimerEvent.TIMER, onTimerUpdate);
_myTimer.stop(); return;
}
GameProperties.gameWorld._grounds[_path[jj].x][_path[jj].y].color = Color.GREEN;
} else {
GameProperties.gameWorld._grounds[_searchPath[ii].x][_searchPath[ii] .y].color = Color.GRAY;
ii++; }
}
private function findPath():void {
var astar:AStar = new AStar(); if (astar.findPath(_grid)) {
_path = astar.path; _index = 0;
addEventListener(Event.ENTER_FRAME, enterFrame); }
}
private function enterFrame(event:Event):void {
if (GameProperties.isPaused) return;
if (_index < _path.length) {
xpos = Math.floor(x / _cellSize); ypos = Math.floor(y / _cellSize);
var targetX:Number = _path[_index].x * _cellSize +
(_cellSize / 2);
var targetY:Number = _path[_index].y * _cellSize +
(_cellSize / 2);
var dx:Number = targetX - x; var dy:Number = targetY - y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
var vx:Number; var vy:Number;
if (dx > 0) {
vx = _moveSpeed;
_enemymc.play("walk_right"); }
else if (dx < 0) {
vx = -_moveSpeed;
_enemymc.play("walk_left"); }
vx = 0; }
if (dy > 0) {
vy = _moveSpeed;
_enemymc.play("walk_down"); }
else if (dy < 0) {
vy = -_moveSpeed;
_enemymc.play("walk_up"); }
else {
vy = 0; }
if (dist < 1) {
trace("index:" + _index + " path length:" +
_path.length); _index++;
} else {
if (_index >= _path.length - 1) {
var dxx:Number = (x - 30) – _trees[_targetIndex].x;
var dyy:Number = y - _trees[_targetIndex].y;
if (Math.sqrt(dx * dx + dy * dy) < 15)
{
_index++; return; }
}
x += vx; y += vy;
} }
else if (!_distrupt && _trees.length > 0 && _trees[_targetIndex]
!= null && _attackTimer >= _attackSpd) {
_trees[_targetIndex].takeDmg(GameProperties.enemyDmg); _attackTimer = 0;
if ((x - 30) - _trees[_targetIndex].x < 0) _enemymc.play("attack_right"); else
if (_trees[_targetIndex].health <= 0) {
_enemymc.stop();
_trees.splice(_trees.indexOf(_trees[_targetIndex]), 1);
_targetIndex = -1;
GameProperties.gameWorld.changeEnemyTarget();
GameProperties.gameWorld.resetTileColor(); return;
}
}
else if (_trees.length <= 0 && !_distrupt) {
_targetIndex = 0; _enemymc.stop();
removeEventListener(Event.ENTER_FRAME, enterFrame);
}
else if (_distrupt && _target != null && _attackTimer >=
_attackSpd) {
_enemymc.stop();
if ((x - 30) - _target.x < 0)
_enemymc.play("attack_right"); else
_enemymc.play("attack_left"); _target.takeDmg(GameProperties.enemyDmg); _attackTimer = 0;
//if(_trees[_targetIndex]==null) rem if (_target.health <= 0)
{
_distrupt = false;
_enemymc.stop();
InGame._heroes.splice(InGame._heroes.indexOf(_target), 1); _targetIndex = 0;
removeEventListener(Event.ENTER_FRAME, enterFrame);
GameProperties.gameWorld.resetTileColor(); findTarget(_trees);
} }
if (_attackTimer < _attackSpd) _attackTimer++;
}
public function changeTargets(value:Array, str:String):void {
if (!_distrupt) {
{
_trees = value;
} if
(hasEventListener(EnterFrameEvent.ENTER_FRAME))
removeEventListener(Event.ENTER_FRAME, enterFrame);
findTarget(value); }
}
public function takeDmg(dmg:int):void {
addChild(new PopUpText(-25, -103, dmg, Color.RED)); _health -= dmg;
if (_healthBar) {
_healthBar.takeDamage(dmg); }
if (_health <= 0) {
destroy(); }
}