Code Monkey home page Code Monkey logo

state-machine's Introduction

Hierarchical State Machine

About

This module allows you to create both single-level and hierarchical finite state machines. State Machines are composed of states, and each state has (optional) callbacks for entering and exiting state. It's also possible to restrict the transition from states using the from property.

Usage

Available states can be set with addState and initial state can be set using initialState setter.

The following example creates a state machine for a player model with 3 states (Playing, paused and stopped)

 var playerSM = new StateMachine();

 playerSM.addState("playing",{ enter: this.onPlayingEnter, exit: this.onPlayingExit, from:["paused","stopped"] });
 playerSM.addState("paused",{ enter: this.onPausedEnter, from:"playing"});
 playerSM.addState("stopped",{ enter: this.onStoppedEnter, from:"*"});

 playerSM.on('transition_denied', this.handleTransitionDenied);
 playerSM.on('transition_complete', this.handleTransitionComplete);

 playerSM.initialState = "stopped";

It's also possible to create hierarchical state machines using the argument "parent" in the addState method. This example shows the creation of a hierarchical state machine for the monster of a game (Its a simplified version of the state machine used to control the AI in the original Quake game)

 var monsterSM = new StateMachine();
 monsterSM.addState("idle",{enter:this.onIdle, from:["smash", "punch", "missle attack"]});
 monsterSM.addState("attack",{enter:this.onAttack, from:"idle"});
 monsterSM.addState("melee attack",{parent:"attack", enter:this.onMeleeAttack, from:"attack"});
 monsterSM.addState("smash",{parent:"melee attack", enter:this.onSmash});
 monsterSM.addState("punch",{parent:"melee attack", enter:this.onPunch});
 monsterSM.addState("missle attack",{parent:"attack", enter:this.onMissle});
 monsterSM.addState("die",{enter:this.onDead, from:["smash", "punch", "missle attack"]});

 monsterSM.initialState = "idle";

Install

Ports

License

Copyright (c) 2009-16 Cássio M. Antonio

Released under the Open Source MIT license, which gives you the possibility to use it and modify it in every circumstance.

state-machine's People

Contributors

cassiozen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

state-machine's Issues

Usage of Heirarchy

I have a question about the recommended use of the hierarchy.

I use the SM.state property to do alot of conditional evaluation. i.e: if(SM.state == "active")

I would like to have say 2 states , "dying" and "dead". If I was to check this
if(SM.state == "dead") , is there a way that I could have that condition also = "dying" ?

I thought maybe if dead was the parent state and dying was the child, but that doesn't work

do I need to do if(state == "dying" || state == "dead") everytime ? that doesn't feel right to me.

Or should I have 3 states "deadAsParent" as the parent, and "dying" and "dead' as the child
and then only ever test (SM.parentState == "deadAsParent")

I may be overcomplicating this, as I am still grasping how to use this class in real-world cases.

Thanks again
Ryan

StateMachineEvent giving me an error

I don't know much about State machines, this is my first attempt at working with them. Your classes looked clean, so thought I would try them out.

when I ran the code after creating a simple stateMachine I was getting an error saying it could not convert StateMachineEvent into StateChangedEvent

so in the StateMachineEvent.as I changed

public class StateMachineEvent extends Event

to

public class StateMachineEvent extends StateChangeEvent
and I don't get an error anymore.

I am using Flex SDK 3.4.1.

Do you have any feedback about what I am doing wrong, or if what I did was really needed. I have only touched the surface of your code, as I said, I am a beginner of these concepts, and mid-level with as3. Thanks for sharing this code, looking forward to making it a foundation in my game.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.