75 lines
2.2 KiB
C++
75 lines
2.2 KiB
C++
#include "Chr_StateMachine.h"
|
|
#include "Actor/Object/CharacterObject.h"
|
|
#include "Asset/Squirrel/SquirrelManager.h"
|
|
|
|
void Chr_StateMachine::Init(CharacterObject *parent)
|
|
{
|
|
chr_Parent = parent;
|
|
parent->AddChild(this);
|
|
}
|
|
void Chr_StateMachine::ChangeState(int state)
|
|
{
|
|
// 对象存在
|
|
if (chr_Parent)
|
|
{
|
|
// 检查是否可以切换状态
|
|
SQBool CheckFlag = SQFalse;
|
|
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
|
|
SQInteger top = sq_gettop(v);
|
|
sq_pushroottable(v);
|
|
sq_pushstring(v, _SC("StateMachine_checkCanChangeState"), -1);
|
|
if (SQ_SUCCEEDED(sq_get(v, -2)))
|
|
{
|
|
sq_pushroottable(v);
|
|
sq_pushuserpointer(v, chr_Parent);
|
|
sq_pushinteger(v, chr_Parent->Job);
|
|
sq_pushinteger(v, state);
|
|
sq_call(v, 4, SQTrue, SQTrue);
|
|
sq_getbool(v, -1, &CheckFlag);
|
|
}
|
|
sq_settop(v, top);
|
|
|
|
if (CheckFlag == SQTrue)
|
|
{
|
|
sq_pushroottable(v);
|
|
sq_pushstring(v, _SC("StateMachine_SetState"), -1);
|
|
if (SQ_SUCCEEDED(sq_get(v, -2)))
|
|
{
|
|
sq_pushroottable(v);
|
|
sq_pushuserpointer(v, chr_Parent);
|
|
sq_pushinteger(v, chr_Parent->Job);
|
|
sq_pushinteger(v, state);
|
|
sq_call(v, 4, SQFalse, SQTrue);
|
|
}
|
|
sq_settop(v, top);
|
|
this->State = state;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Chr_StateMachine::Update(float deltaTime)
|
|
{
|
|
if (deltaTime == 0.f)
|
|
return;
|
|
if (chr_Parent)
|
|
{
|
|
if (this->State != -1)
|
|
{
|
|
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
|
|
SQInteger top = sq_gettop(v);
|
|
sq_pushroottable(v);
|
|
sq_pushstring(v, _SC("StateMachine_ProcState"), -1);
|
|
if (SQ_SUCCEEDED(sq_get(v, -2)))
|
|
{
|
|
sq_pushroottable(v);
|
|
sq_pushuserpointer(v, chr_Parent);
|
|
sq_pushinteger(v, chr_Parent->Job);
|
|
sq_pushinteger(v, this->State);
|
|
sq_pushfloat(v, deltaTime);
|
|
sq_call(v, 5, SQFalse, SQTrue);
|
|
}
|
|
sq_settop(v, top);
|
|
}
|
|
}
|
|
}
|