00001
00002 #ifndef INCLUDED_WalkNode_h_
00003 #define INCLUDED_WalkNode_h_
00004
00005 #include "Behaviors/StateNode.h"
00006 #include "Motion/MotionManager.h"
00007 #include "Motion/WalkMC.h"
00008 #include "Motion/MMAccessor.h"
00009
00010
00011 class WalkNode : public StateNode {
00012 public:
00013
00014 WalkNode(StateNode * p=NULL)
00015 : StateNode("WalkNode",p), walkid(MotionManager::invalid_MC_ID), walkidIsMine(true), x(0), y(0), a(0)
00016 {
00017 setRetain(false);
00018 }
00019
00020
00021 WalkNode(float xvel, float yvel, float avel, StateNode * p=NULL)
00022 : StateNode("WalkNode",p), walkid(MotionManager::invalid_MC_ID), walkidIsMine(true), x(xvel), y(yvel), a(avel)
00023 {
00024 setRetain(false);
00025 }
00026
00027
00028 void setVelocity(float xvel, float yvel, float avel) {
00029 x=xvel;
00030 y=yvel;
00031 a=avel;
00032 updateWalk(x,y,a);
00033 }
00034
00035
00036 void setXVelocity(float xvel) { x=xvel; updateWalk(x,y,a); }
00037
00038
00039 float getXVelocity() { return x; }
00040
00041
00042 void setYVelocity(float yvel) { y=yvel; updateWalk(x,y,a); }
00043
00044
00045 float getYVelocity() { return y; }
00046
00047
00048 void setAVelocity(float avel) { a=avel; updateWalk(x,y,a); }
00049
00050
00051 float getAVelocity() { return a; }
00052
00053 virtual void DoStart() {
00054 StateNode::DoStart();
00055 updateWalk(x,y,a);
00056 }
00057
00058 virtual void DoStop() {
00059 updateWalk(0,0,0);
00060 StateNode::DoStop();
00061 }
00062
00063
00064 virtual void teardown() {
00065 if(walkidIsMine) {
00066 motman->removeMotion(walkid);
00067 walkid=MotionManager::invalid_MC_ID;
00068 }
00069 }
00070
00071
00072 virtual void setWalkID(MotionManager::MC_ID id) {
00073 if(walkidIsMine) {
00074 motman->removeMotion(walkid);
00075 walkid=MotionManager::invalid_MC_ID;
00076 }
00077 walkid=id;
00078 walkidIsMine=(id==MotionManager::invalid_MC_ID);
00079 }
00080
00081
00082 virtual MotionManager::MC_ID getWalkID() { return walkid; }
00083
00084
00085 virtual bool ownsWalkID() { return walkidIsMine; }
00086
00087 protected:
00088
00089 void updateWalk(float xvel, float yvel, float avel) {
00090 if(walkid==MotionManager::invalid_MC_ID) {
00091 SharedObject<WalkMC> walk;
00092 walk->setTargetVelocity(xvel,yvel,avel);
00093 walkid=motman->addPersistentMotion(walk);
00094 walkidIsMine=true;
00095 } else {
00096 MMAccessor<WalkMC> walk(walkid);
00097 walk->setTargetVelocity(xvel,yvel,avel);
00098 }
00099 }
00100
00101 MotionManager::MC_ID walkid;
00102 bool walkidIsMine;
00103 float x;
00104 float y;
00105 float a;
00106 };
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 #endif