btw saya ada post problem disini :
programming - Implementing a FSM with ActionScript 2 without using classes? - Game Development
dan dapat pattern FSM untuk AS 2.0 kayak gini :
PHP Code:
onUpdate(){
switch(state){
case STATE_1:
do state 1 stuff
if(conditionThatLeadsToState2){
state = STATE_2;
}
break;
case STATE_2:
do state 2 stuff
if(conditionThatLeadsToState3){
state = STATE_3;
}
break;
... etc ...
}
}
kemudian pattern ke 2 :
PHP Code:
var count = 0;
function state1(){
count++;
if(count == 10){
state = state2;
}
trace("state 1, increasing: " + count);
}
function state2(){
count--;
if(count == 0){
state = state1;
}
trace("state 2, decreasing: " + count);
}
var state = state1;
function onEnterFrame(){
state();
}
karena saya kurang ngerti pattern 1 , jadi saya coba pattern kedua ...
n hasil nya agak kacau =.=a
PHP Code:
AI_mc.onEnterFrame = function() {
aiState()
};
saya pisahkan semua function nya , dan functionnya saya buat seperti layak nya state :
PHP Code:
var aiState;
// trigger untuk gameOn True
function AiTrigger() {
if (TargetArray.length>=MaxSpawn/8) { trigger kalo gameOn true , maka CheckDistanceState()
GameOn = true;
aiState = CheckDistanceState()
}
function CheckDistanceState() {
for (i=0; i<=TargetArray.length; i++) {
Target = TargetArray[i].myMc;
//trace(Target)
Target.id = i;
distanceX = Target._x-AI_mc._x;
distanceY = Target._y-AI_mc._y;
jrk = Math.round(Math.sqrt(distanceX*distanceX+distanceY*distanceY));
Target.jarak = jrk;
TargetArray[i].jarak = jrk;
Targetscore = TargetArray[i].skor
Target.locked = false;
}
EnemyArray = TargetArray.sortOn("jarak", Array.NUMERIC);
EnemyArray[0].myMc.locked = true; // target yang di locked = true
lockedTarget = EnemyArray[0].myMc;
lockedscore = EnemyArray[0].skor // ambil score target
statusObject = EnemyArray[0].myMc.hidup; // status untuk target
if (statusObject) // trigger pergantian state jika ada statusObject yang hidup = true
{
aiState = moveAI() // aiState sebagai penampung
}
}
function moveAI() {
deltaX = (lockedTarget._x-AI_mc._x);
deltaY = (lockedTarget._y-AI_mc._y);
AI_mc._x += deltaX/step;
AI_mc._y += deltaY/step;
if (_root.AI_mc.hitTest(lockedTarget)) { // trigger untuk ganti state , kalo colide -> HitState()
aiState = HitState()
}
}
function HitState()
{
_root.attachMovie("spark_mc","spark_mc",400,{_x:lockedTarget._x, _y:lockedTarget._y});
removeMovieClip(lockedTarget);
TargetArray.shift();
AIscore = AIscore + lockedscore
//trace(AIscore)
numdead++;
scoreboard_mc.computerscore_txt.text= AIscore
}
hasilnya , si AI ada bergerak , tetapi sayang nya sendat2 pada saat mencari target...
apakah implementasi trigger saya salah ya ?? ato karena pemakaian fungsi state() , yang pengerjaan nya mesti per state jadi nya sendat2 ?
yang saya tangkap dari artikel2 , kunci utama dari sebuah FSM itu ada pemicu nya untuk pergantian state , dan rata2 pemakaian FSM memakai switch case ( walaupun tidak dianjurlkan dalam skala state AI yang besar, tetapi kasus saya kayak nya state masih dikit, jadi gpp )
Bookmarks