• Tidak ada hasil yang ditemukan

Implementasi Algoritma A Berbasis Pathfinding Dalam Pengembangan Game Menanam Pohon

N/A
N/A
Protected

Academic year: 2017

Membagikan "Implementasi Algoritma A Berbasis Pathfinding Dalam Pengembangan Game Menanam Pohon"

Copied!
25
0
0

Teks penuh

(1)

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 {

(2)

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":

(3)

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":

(4)

{

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; }

(5)

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);

(6)

//

_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 {

(7)

...

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);

(8)

{

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

(9)

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++) {

(10)

{

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;

(11)

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;

(12)

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();

(13)

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) {

(14)

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;

(15)

}

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++) {

(16)

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;

(17)

{

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);

(18)

{

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;

(19)

} 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"); }

(20)

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

(21)

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) {

(22)

{

_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(); }

}

(23)

CURRICULUM VITAE

Nama

: Rahmat Irfan Pohan

Tempat/Tanggal Lahir : Sisumut/ 19 Maret 1993

Jenis Kelamin

: Laki-Laki

Tinggi/Berat Badan : 170 cm / 72 kg

Agama

: Islam

Kewarganegaraan

: Indonesia

Alamat

: Jl. Asrama/Ampera II no. 19 A

Telp/ Hp

: 082274376735

Email

: r.irfanpohan@gmail.com

Riwayat Pendidikan

2011 – 2016

: S-1 Ilmu Komputer Universitas Sumatera Utara, Medan

2008 – 2011

: SMA Harapan 1 Medan

2005 – 2008

: SMP Harapan 2 Medan

1999 – 2005

: SD IKAL Medan

1997 – 1999

: TK IKAL Medan

Keahlian

Bahasa

: Indonesia, Inggris

Bahasa Pemrograman : Java, Actionscript, C#.NET, PHP, JavaScript

Database

: Microsoft Access, Mysql, Microsoft SQL

Design

: Adobe Photoshop, Adobe Ilustrator

Pengalaman Organisasi

[2012 – 2013] Anggota RisTek BKM AL-KHUWARIZMI

[2013 – 2014] Anggota Syiar UKMI AL-KHUWARIZMI

[2013 – sekarang] Anggota Sobat Bumi Medan

[2013 – 2014] Anggota RisTek PEMA FASILKOM-TI

[2013 – 2015] Asisten Laboratory IKLC(Ilmu Komputer Laboratory Center)

[2014 – 2015] Anggota Kemenlu PEMA USU

Pengalaman Kepanitiaan

[2011] Anggota Publikasi dan Dokumentasi ArTechno

[2011] Anggota Publikasi dan Dokumentasi Dies Natalis Ilmu Komputer

(24)

[2012] Anggota Humas Sahur on The Road

[2013] Anggota Publikasi dan Dokumentasi Porseni Imilkom 2013

[2013] Anggota Publikasi dan Dokumentasi Al-Khuwarizmi Festival

[2013] Anggota Bidang Dana dan Usaha PORSENI IMILKOM 2013

[2013] Koordinator Publikasi dan Dokumentasi PMB S1 Ilmu Komputer 2013

[2014] Anggota Publikasi dan Dokumentasi PMB Fasilkom-TI 2013

[2014] Koordinator Peralatan, Tempat, dan Perlengkapan Penerimaan Beasiswa

Sobat Bumi 2014

Pengalaman Kerja

[2011-sekarang] Freelancer Software Developer (Flash, Web, Mobile, Desktop)

[2012-2014] Gitaris (Entertain) Parfi (Persatuan Artis Film Indonesia) SUMUT

[2012-2014] Freelancer Graphic Designer

[2015-sekarang] Owner, Founder, Creative Director Noire Pomade

[2015-sekarang] Direktur CV. Vuseon (Virtue Synergy Solution)

Pengalaman Pembicara

[2013] Pemateri Sosialisasi Sistem Informasi Akuntasi Koperasi Simpan Pinjam,

Binjai

[2013-2014] Tentor Pelatihan Animasi Flash di Al-Khuwarizmi Academy, UKMI

Al-Khuwarizmi Fasilkom-TI USU, Medan

[2013] Pemateri di Pelatihan Animasi Flash, Imilkom Goes To School, SMA

Harapan Mandiri Medan

[2013] Pemateri Workshop Animasi Flash pada Penerimaan Mahasiswa Baru

Muslim (PMBM) 2013, USU, Medan

[2014] Pemateri Sosialisasi Sistem Informasi Akuntasi Koperasi Simpan Pinjam,

Rantau Prapat

[2014] Pemateri di Pelatihan Animasi Flash dalam Pengabdian di SMK Amal Bakri

Lubuk Pakam

[2014] Pemateri di Pelatihan Animasi Flash, Imilkom Goes To School, SMA Negeri

1 Binjai, Binjai

[2014] Pemateri di Pelatihan Animasi Flash, Imilkom Goes To School, SMA Negeri

1 Medan, Medan

[2016] Narasumber dalam Temu Usaha Forum Bisnis Medan, Hotel Darma Deli,

(25)

Prestasi

[2013] Juara II Kontes Programming Porseni Imilkom 2013

[2013] Penerima Beasiswa Pertamina Sobat Bumi

[2014] Finalis Telkomsel Digital Creative Innovation 2013

[2015] Finalis Gemastik 8 Kategori Bisnis Teknologi

[2015] Finalis Big Idea Competition SEC USU 2016

[2016] Delegasi dari Indonesia Student ASEAN Entreprenur Entrepreneur Network

Referensi

Dokumen terkait

[r]

[r]

Pada hari ini Rabu, tanggal lima belas bulan Mei tahun dua ribu tiga belas (15-05-2013) pada pukul 09.00 WIB sesuai dengan jadwal lelang pemilihan langsung pekerjaan

Kutacane pada tanggal 10 sld 13 Mei 2013 dan telah mengadakan rapat evaluasi pekerjaan tersebut bertempat di Ruang Rapat Kantor SAR Banda Aceh Jl.Suftan

Sehubungan dengan hal tersebut diatas, kami memberikan waktu untuk menyampaikan keberatan / sanggahan terhadap hasil pemberitahuan ini sampai dengan tanggal 23 Mei 2013,

[r]

Aplikasi yang dipaketkan dalam OpenGeo Suite adalah PostGIS 1.14.3 sebagai perangkat lunak untuk manajemen database, GeoServer 2.2 Snapshot sebagai web map server

If there is a change in the ownership of shares, the original owner who is registered in the list of holders of securities accounts or the Company’s Shareholder Register shall