当前位置: 首页 > news >正文

seo网站优化方html做网站标题的代码

seo网站优化方,html做网站标题的代码,汉中市建设工程项目审批管理系统,做网站维护累吗状态机系统概述 在游戏开发中,状态机是控制角色行为逻辑的核心系统。本文基于提供的代码,分析技能编辑器中状态机系统的设计与实现,特别是如何通过状态机管理复杂的技能逻辑。 状态机核心组件 1. 状态基类设计 (FSMStateBase) 状态基类是所…

状态机系统概述

在游戏开发中,状态机是控制角色行为逻辑的核心系统。本文基于提供的代码,分析技能编辑器中状态机系统的设计与实现,特别是如何通过状态机管理复杂的技能逻辑。

状态机核心组件

1. 状态基类设计 (FSMStateBase)

状态基类是所有具体状态的父类,定义了状态的基本行为:

class FSMStateBase {
public:virtual void enter();    // 进入状态virtual void update(uint32 dwElapsed); // 更新状态virtual void exit();     // 退出状态virtual void refreshState() {}; // 刷新状态protected:CUnit *m_pUnit; // 关联的游戏单位std::string m_strPresentationName; // 当前状态的表现名称
};

2. 状态机模板 (Fsm)

状态机模板类负责管理状态注册和状态切换:

template<typename classname, typename statetype, typename EVTID, typename PARAM>
class Fsm {
public:void SetState(statetype state) {// 退出当前状态if (m_stateFunc.find(m_state) != m_stateFunc.end()) {m_stateFunc[m_state].pBase->exit();}// 进入新状态m_last_state = m_state;m_state = state;if (m_stateFunc.find(m_state) != m_stateFunc.end()) {m_stateFunc[m_state].pBase->enter();}}void RegisterStateFunc(statetype state, FSMStateBase* cls) {m_stateFunc[state].pBase = cls;}void Update(float diff) {if (m_stateFunc.find(m_state) != m_stateFunc.end()) {m_stateFunc[m_state].pBase->update(diff);}}private:statetype m_state;        // 当前状态statetype m_last_state;   // 上一个状态MapStateFunc m_stateFunc; // 状态映射表
};

具体状态实现

1. 待机状态 (FSMStateStandBy)

void FSMStateStandBy::enter() {Base::enter();ref_ptr<CPresentationAction> p = m_pUnit->playStandbyPresentation();if (p) {Base::setPresentation(p->GetName());}
}void FSMStateStandBy::update(uint32 dwElapsed) {Base::update(dwElapsed);this->updateStandby(dwElapsed);
}

2. 移动状态 (FSMStateMove)

void FSMStateMove::enter() {Base::enter();ref_ptr<CPresentationAction> p = m_pUnit->playMovePresentation();if (p) {Base::setPresentation(p->GetName());}
}void FSMStateMove::update(uint32 dwElapsed) {Base::update(dwElapsed);this->updateMove(dwElapsed);
}

3. 受击状态 (FSMStateHitted)

void FSMStateHitted::enter() {Base::enter();ref_ptr<CPresentationAction> p = m_pUnit->playHittedPresentation();if (p) {Base::setPresentation(p->GetName());}// 特殊受击类型处理switch (mHittedType) {case zhuge_chuifeng:zhugeChuifengAction.readyToMove();break;}
}void FSMStateHitted::update(uint32 dwElapsed) {Base::update(dwElapsed);// 处理特殊受击类型的位移switch (mHittedType) {case zhuge_chuifeng:zhugeChuifengAction.move(dwElapsed);break;}
}

4. 技能状态 (FSMStateSkill)

void FSMStateSkill::enter() {Base::enter();// 获取技能数据S_SKILL *skillData = getData();// 播放技能表现ref_ptr<CPresentationAction> pa = gSPConditonMgr->getPresentationBySkillData(skillData);if (pa) {Base::setPresentation(pa->GetName());// 注册回调pa->OnStopSignal.notify(this, &FSMStateBase::OnStop);pa->OnFrameEventSignal.notify(this, &FSMStateBase::OnFrame);// 设置技能数据pa->SetUserData("SKILL_DATA", Any(skillData));}
}void FSMStateSkill::exit() {// 清理技能相关状态if (m_pUnit->isStatusById(IgnoreRTSRelation)) {m_pUnit->delStatusById(IgnoreRTSRelation);}Base::exit();
}

状态转换机制

1. 状态切换流程

2. 事件驱动的状态转换

// 注册事件处理
void RegisterEvt(statetype state, EVTID evt, classname* cls, statetype(classname::*f)(statetype, EVTID, PARAM)) 
{EvtProc& proc = m_mapTrans[state][evt];proc.notifyFunc.cls = cls;proc.notifyFunc.imp = f;
}// 事件分发
void DispatchEvent(EVTID evt, PARAM pms) {// 查找当前状态的事件处理auto itS = m_mapTrans.find(m_state);if (itS != m_mapTrans.end()) {auto itE = itS->second.find(evt);if (itE != itS->second.end()) {// 执行事件处理函数并切换状态SetState((itE->second.notifyFunc.cls->*itE->second.notifyFunc.imp)(m_state, evt, pms));return;}}
}

 

技能编辑器集成

1. 状态机在编辑器中的可视化

在技能编辑器中,状态机可以直观地展示:

[状态机视图]
| 当前状态: 技能状态 (STATE_SKILL_1) |
|------------------------------------|
| 可转换状态:                        |
|   - 待机状态 (STATE_STANDBY)       |
|   - 移动状态 (STATE_MOVE)          |
|   - 受击状态 (STATE_HITTED)        |
|   - 死亡状态 (STATE_DEAD)          |
|                                    |
| 事件列表:                          |
|   [动画事件] 帧事件(100): 触发伤害 |
|   [动画事件] 结束事件: 返回待机    |

2. 状态与技能时间轴的关联

在技能编辑器中,状态切换可以与时间轴上的关键帧关联:

{"tracks": [{"type": "State","keyframes": [{"time": 0.0, "state": "STATE_SKILL_1"},{"time": 2.5, "state": "STATE_STANDBY"}]}]
}

3. 状态机调试功能

技能编辑器提供状态机调试工具:

  • 状态切换历史记录

  • 当前状态变量查看

  • 事件触发模拟

  • 断点调试功能

高级特性实现

1. 状态过渡机制

void FSMStateMove::enter() {// 检查是否可以进入过渡状态if (m_pUnit->canEnterTransitionToMove(m_pUnit->getLastFsmPrt())) {m_pUnit->setFsmState(STATE_TRANSITION_MOVE);return;}// 否则进入普通移动状态Base::enter();
}

2. 动画事件驱动状态切换

void RegisterAniEvt(statetype state, EVENT_ANI_E aniEvent, statetype retState) 
{AniEvtProc& proc = m_mapAniTrans[state][aniEvent];proc.retState = retState;
}void DispatchAniEvent(EVENT_ANI_E evt, CPresentationAction* anim, int param) {auto itS = m_mapAniTrans.find(m_state);if (itS != m_mapAniTrans.end()) {auto itE = itS->second.find(evt);if (itE != itS->second.end()) {SetState(itE->second.retState); // 切换到新状态}}
}

3. 状态特定的资源管理

void FSMStateDead::enter() {// 根据角色类型加载不同的死亡表现if (m_pUnit->isStatusById(Ghost)) {m_pUnit->doPressentation("ghost_dead");} else {m_pUnit->doPressentation("enter_dead");m_pUnit->doPressentation("enter_dead_effect");}
}

性能优化策略

1. 状态对象池

class StatePool {
public:FSMStateBase* Acquire(StateType type) {if (pool[type].empty()) {return CreateState(type);}auto state = pool[type].back();pool[type].pop_back();return state->Reset();}void Release(FSMStateBase* state) {pool[state->GetType()].push_back(state);}private:std::map<StateType, std::vector<FSMStateBase*>> pool;
};

2. 状态切换优化

// 避免不必要的状态切换
void SetState(statetype newState) {if (m_state == newState) {// 仅刷新状态,不执行完整切换if (m_stateFunc.find(m_state) != m_stateFunc.end()) {m_stateFunc[m_state].pBase->refreshState();}return;}// 执行完整状态切换...
}

3. 基于状态的LOD优化

void FSMStateBase::update(uint32 dwElapsed) {// 根据距离相机的距离调整更新频率float distance = Camera::Main()->DistanceTo(m_pUnit->Position);if (distance > LOD_DISTANCE) {// 低细节更新,每3帧更新一次if (frameCount % 3 == 0) {UpdateLOD(dwElapsed * 3);}} else {// 全细节更新UpdateFull(dwElapsed);}frameCount++;
}

总结

本文详细分析了技能编辑器中状态机系统的设计与实现,核心要点包括:

  1. 分层状态架构

    • 基础状态机模板提供核心状态管理功能

    • 具体状态实现游戏逻辑(待机、移动、技能等)

    • 状态过渡机制实现平滑切换

  2. 事件驱动设计

    • 支持普通事件和动画事件驱动状态转换

    • 灵活的事件注册和分发机制

    • 时间轴关键帧与状态绑定

  3. 编辑器集成

    • 可视化状态机编辑

    • 状态与技能表现关联

    • 实时调试和模拟功能

  4. 性能优化

    • 状态对象池减少内存分配

    • LOD策略按需更新

    • 避免冗余状态切换

这种状态机设计为技能编辑器提供了强大的逻辑控制能力,使设计师能够创建复杂的技能行为,同时保持代码的可维护性和运行时性能。

最佳实践建议:在技能编辑器中实现状态机时,重点考虑:

  1. 状态划分的粒度 - 不宜过细也不宜过粗

  2. 状态转换的可视化调试支持

  3. 与时间轴编辑器的深度集成

  4. 状态机的版本兼容性和序列化方案

http://www.yayakq.cn/news/612111/

相关文章:

  • 孵化基地网站怎么建设电子商务网站建设的发展趋势
  • 网站建设行业发展史wordpress 儿童主题
  • 做写手一般上什么网站好南京广告公司地址
  • 网站子域名怎么设置专门做顶账房的网站
  • 建筑公司网站大全县级门户网站建设的报告
  • 视频直播网站怎么做线上营销怎么推广
  • 广州seo建站河北省建设工程信息网首页
  • 自己做网站需要收费吗哈尔滨网络公司平台
  • 网站建设ppt百度文库神马网站快速排名软件
  • wordpress整站安装wordpress设置权限设置方法
  • 做外贸网站的公司广告开户
  • 网站推广包年建安培训官网
  • 抚养网站建设一级做爰片a视频网站试看
  • 公司展厅设计费沈阳seo优化排名公司
  • 用树莓派做网站服务器好吗网站做qq链接代码
  • 网站建网站建设专业黑龙江建设网官
  • 重庆网站推广机构深圳做网站乐云seo598
  • 个体户怎么做购物网站seo课程培训学校
  • 12306网站如何做火车票候补汉邦未来网站开发有限公司
  • 以家乡为主题做网站WordPress文章相似推荐
  • 紫竹桥网站建设百度推广电话销售话术
  • dw进行网站建设包含哪些步骤免费网页制作成品
  • 顺义区专业网站制作网站建设wordpress 获取
  • 建行网站网址是多少陕西网站开发
  • 入驻京东需要自己做网站吗长春网络优化最好的公司
  • 企业网站备案海珠建网站公
  • 外贸php网站源码thinkphp做的网站源码
  • 域名的网站建设方案书网站备案大概需要多久
  • 邯郸网站设计联系电话局域网内部网站建设app下载
  • 学做网站书籍重庆seo代理价格