123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- import bge
- from random import randint
- import actionsFSMlist
-
- MAIN_LAYER = 10
- TRANS_LAYER = 12
-
- def getOwn():
- cont = bge.logic.getCurrentController()
- own = cont.owner
- return own
-
- def transPlaying():
- scene = bge.logic.getCurrentScene()
- skater = scene.objects['Char4']
- if skater.isPlayingAction(TRANS_LAYER):
- return True
- else:
- return False
-
- def stopTrans():
- scene = bge.logic.getCurrentScene()
- skater = scene.objects['Char4']
- if skater.isPlayingAction(TRANS_LAYER):
- skater.stopAction(TRANS_LAYER)
-
- def getCurFrame():
- scene = bge.logic.getCurrentScene()
- skater = scene.objects['Char4']
- if skater.isPlayingAction(TRANS_LAYER):
- num = round(skater.getActionFrame(TRANS_LAYER), 3)
- print('playing frame ', num)
- return num
- else:
- return None
-
- def interupt_request():
- cont = bge.logic.getCurrentController()
- own = cont.owner
- print(own['requestAction'])
- if own['requestAction'] in actionsFSMlist.reg_fliplist or own['requestAction'] in actionsFSMlist.fak_fliplist:
- print('flip is true')
- return True
-
- else:
- return False
-
- def actionPlayer(ac, FSM):
- scene = bge.logic.getCurrentScene()
- skater = scene.objects['Char4']
- deck = scene.objects['deck']
- trucks = scene.objects['trucks']
- name = ac.FSM.action.s_action
- start = ac.FSM.action.s_se[0]
- end = ac.FSM.action.s_se[1]
- layer = ac.FSM.action.layer
- mode = ac.FSM.action.mode
- speed = ac.FSM.action.speed
-
- skater.playAction(name, start,end, layer=layer, play_mode=mode, speed=speed)
-
- def transEndPlayer(ac, FSM):
-
- scene = bge.logic.getCurrentScene()
- skater = scene.objects['Char4']
- deck = scene.objects['deck']
- trucks = scene.objects['trucks']
- name = ac.FSM.action.s_action
- end = ac.FSM.action.s_se[1]
-
- skater.playAction(name, end,end, layer=TRANS_LAYER, play_mode=1, speed=1)
-
- #====================================
- class Transition(object):
- def __init__(self, toState):
- self.toState = toState
- def Execute(self):
- print('Transitioning ...', self.toState)
-
- #====================================
- #====================================
- #====================================
- #====================================
- #====================================
- #====================================
-
- State = type("State", (object,), {})
-
- class State(object):
- def __init__(self, FSM):
- self.FSM = FSM
- self.timer = 0
- self.startTime = 0
-
- def Enter(self):
- self.timer = randint(0,5)
- self.startTime = 0
- def Execute(self):
- print('Executing')
- def Exit(self):
- print('Exiting')
-
- #====================================
- #====================================
-
- class reg_roll(State):
- def __init__(self,FSM):
- super(reg_roll, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_roll, self).Enter()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- self.FSM.stateLife += 1
- actionPlayer(self, FSM)
- own = getOwn()
- if own['requestAction'] == 'reg_opos':
- self.FSM.ToTransition('toreg_roll_to_opos')
- if own['requestAction'] == 'reg_turnLeft':
- self.FSM.ToTransition('toreg_roll_to_left')
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
-
- class reg_opos(State):
- def __init__(self,FSM):
- super(reg_opos, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_opos, self).Enter()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- self.FSM.stateLife += 1
- dict = bge.logic.globalDict
- actionPlayer(self, FSM)
- own = getOwn()
- if own['requestAction'] != 'reg_opos':
- self.FSM.ToTransition(self.FSM.action.parentTrans)
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- class reg_left(State):
- def __init__(self,FSM):
- super(reg_left, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_left, self).Enter()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- self.FSM.stateLife += 1
- actionPlayer(self, FSM)
- own = getOwn()
- if own['requestAction'] != self.FSM.action.requestAction:
- self.FSM.ToTransition(self.FSM.action.parentTrans)
- print('initing left')
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- #====================================
- #====================================
-
- class reg_roll_to_opos(State):
- def __init__(self,FSM):
- super(reg_roll_to_opos, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_roll_to_opos, self).Enter()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- dict = bge.logic.globalDict
- self.FSM.stateLife += 1
- own = getOwn()
- if own['requestAction'] == 'reg_roll':
- print('requesting early out')
- self.FSM.ToTransition('toreg_opos_to_roll')
- if transPlaying() == False and self.FSM.stateLife > 2:
- self.FSM.ToTransition(self.FSM.action.parentTrans)
- transEndPlayer(self, FSM)
- else:
- actionPlayer(self, FSM)
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- class reg_opos_to_roll(State):
- def __init__(self,FSM):
- super(reg_opos_to_roll, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_opos_to_roll, self).Enter()
-
- old_state = self.FSM.prevState
- if getCurFrame() != None:
- print('do the things', old_state.FSM.currentFrame, getCurFrame())
- self.FSM.action.s_se[0] = getCurFrame()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- self.FSM.stateLife += 1
- if transPlaying() == False and self.FSM.stateLife > 2:
- self.FSM.ToTransition('toreg_roll')
- transEndPlayer(self, FSM)
- else:
- actionPlayer(self, FSM)
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- class reg_roll_to_left(State):
- def __init__(self,FSM):
- super(reg_roll_to_left, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_roll_to_left, self).Enter()
-
- old_state = self.FSM.prevState
- if getCurFrame() != None:
- print('current frame is', getCurFrame())
- self.FSM.action.s_se[0] = getCurFrame()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- dict = bge.logic.globalDict
- self.FSM.stateLife += 1
- own = getOwn()
- if own['requestAction'] == 'reg_roll':
- self.FSM.ToTransition('toreg_left_to_roll')
- if transPlaying() == False and self.FSM.stateLife > 2:
- self.FSM.ToTransition('toreg_left')
- transEndPlayer(self, FSM)
- else:
- actionPlayer(self, FSM)
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- class reg_left_to_roll(State):
- def __init__(self,FSM):
- super(reg_left_to_roll, self).__init__(FSM)
-
- def Enter(self):
- print('entering: ', type(self).__name__)
- self.FSM.action = getattr(actionsFSMlist, type(self).__name__)
- super(reg_left_to_roll, self).Enter()
-
- old_state = self.FSM.prevState
- if getCurFrame() != None:
- print('do the things', old_state.FSM.currentFrame, getCurFrame())
- self.FSM.action.s_se[0] = getCurFrame()
-
- def Execute(self):
- print('executing: ', type(self).__name__)
- dict = bge.logic.globalDict
- self.FSM.stateLife += 1
- if transPlaying() == False and self.FSM.stateLife > 2:
- self.FSM.ToTransition('toreg_roll')
- transEndPlayer(self, FSM)
- else:
- actionPlayer(self, FSM)
-
- def Exit(self):
- print('exiting: ', type(self).__name__)
-
- #===================================
- #====================================
-
- class FSM(object):
- def __init__ (self, character):
-
- try:
- self.char = self.char
-
- except:
-
- self.char = character
- self.states = {}
- self.transitions = {}
- self.curState = None
- self.prevState = None
- self.stateLife = 0
- self.currentFrame = 0.0
- self.name = ''
-
- self.action = []
-
- print('always init')
- def AddTransition(self, transName, transition):
- self.transitions[transName] = transition
-
- def AddState(self, stateName, state):
- self.states[stateName] = state
-
- def SetState(self, stateName):
- self.prevState = self.curState
- self.curState = self.states[stateName]
-
- def ToTransition(self, toTrans):
- self.trans = self.transitions[toTrans]
-
- def Execute(self):
- if (self.trans):
- self.curState.Exit()
- self.trans.Execute()
- self.SetState(self.trans.toState)
- self.curState.Enter()
- self.trans = None
- self.curState.Execute()
-
- #====================================
- Char = type("Char",(object,),{})
-
- class StateMachine(Char):
- def __init__(self):
- self.FSM = FSM(self)
-
- ##STATES
- self.FSM.AddState('reg_roll', reg_roll(self.FSM))
- self.FSM.AddState('reg_opos', reg_opos(self.FSM))
- self.FSM.AddState('reg_roll_to_opos', reg_roll_to_opos(self.FSM))
- self.FSM.AddState('reg_opos_to_roll', reg_opos_to_roll(self.FSM))
- self.FSM.AddState('reg_left', reg_left(self.FSM))
- self.FSM.AddState('reg_left_to_roll', reg_left_to_roll(self.FSM))
- self.FSM.AddState('reg_roll_to_left', reg_roll_to_left(self.FSM))
-
- #TRANSITIONS
- self.FSM.AddTransition('toreg_roll', Transition('reg_roll'))
- self.FSM.AddTransition('toreg_opos', Transition('reg_opos'))
- self.FSM.AddTransition('toreg_roll_to_opos', Transition('reg_roll_to_opos'))
- self.FSM.AddTransition('toreg_opos_to_roll', Transition('reg_opos_to_roll'))
- self.FSM.AddTransition('toreg_left', Transition('reg_left'))
- self.FSM.AddTransition('toreg_left_to_roll', Transition('reg_left_to_roll'))
- self.FSM.AddTransition('toreg_roll_to_left', Transition('reg_roll_to_left'))
-
- if self.FSM.curState == None:
- self.FSM.SetState('reg_roll')
- self.FSM.ToTransition('toreg_roll')
- print(' -= Initializing Action Player State Machine =-')
-
- def Execute(self):
- self.FSM.Execute()
- #====================================
- r = StateMachine()
- def main(cont):
- own = cont.owner
- if 'inited' not in own:
- own['inited'] = True
- own['frame'] = 0
- own['state'] = 'On'
- print('initing')
-
- r.Execute()
- own['frame'] += 1
- if interupt_request():
- print('interupt request')
|