• 游戏状态机的设计与实现


    前言:
         游戏编程中对状态机的理解和应用,是体现程序猿是否对游戏编程入门的重要指标。本篇文章描写叙述状态机的原理,以及怎样实现。并探讨状态机的扩展性和易用性。



    什么是状态机:
         1、状态机是通过状态变量来描写叙述不同状态
         2、状态机变量是相互排斥的
         3、状态机的切割是状态机好坏的标准

    状态机的优点:
         1、减少整个系统的复杂性
         2、easy扩展
         3、easy维护

    怎样实现状态机:
         1、通过不同的状态切割逻辑
         2、通过面向对象思想来扩展和切割逻辑

    状态机简单类型:

    1、定义状态机类型

    enum PlayerState{
        INVALID,
        STAND,
        MOVE,
        ATTACK,
        DIE
    };

    2、实现更新状态,在不同的状态运行不同的逻辑

    void Player::Update(float ts){
        switch(user_state_){
            case STAND:
                Stand(ts);
                break;
            case MOVE:
                Move(ts);
                break;
            case ATTACK:
                Attack(ts);
                break;
            case DIE:
                Die();
                return;
            default:
                std::cout<<"error
    ";
    
        }
    
        if(hp_ <= 0){
            SetState(DIE);
        }
    }
    3、切换状态。在切换状态的时候做一些事情

    void Player::SetState(PlayerState state){
        if(state == user_state_){
            return;
        }
        switch(state){
            case STAND:
                std::cout << "----begin stand--------
    ";
                break;
            case MOVE:
                std::cout << "----begin move--------
    ";
                break;
            case ATTACK:
                std::cout << "----begin attack--------
    ";
                break;
            case DIE:
                std::cout << "----begin die--------
    ";
                break;
            default:
                std::cout <<"the state is error";
                break;
        }
        user_state_ = state;
    }

         这样的状态机小而精悍,假设在一个对象中有非常多标志量来标记实例的状态。这时候该考虑下通过这样的小型的状态机来实现了。可是这样的状态机假设状态变量比較多。扩展性并不好。而且复杂性会随着状态机的增多,指数型添加。整个编译单元的代码量也会非常大,对易读性和维护性都是负面影响。

    状态机面向对象类型:
         面向对象类的状态机是一种更easy扩展的新型状态机。通过单间实现方式。使用更少的内存,先看下整个状态机的uml设计图。



      首先是通过接口定义通用状态机接口。然后定义了单间的接口。这样的方式统一让全部的状态实现三个函数,这三个函数分别相应切入状态,在状态中,退出状态。须要运行的逻辑分别放在这三个函数里运行,通过这样的切割,状态非常easy扩展,也不会混乱。

    详细代码实现,请看以下说面里面github的地址。

         在StateManager是专门管理角色状态的管理类,每一个角色对象包括一个状态机管理类。

    总结:
         状态机的模型是非常简单,但并非每一个人都能设计好的状态机。由于好的状态机不仅须要对程序的把握要比較到位,同一时候须要对整个业务的理解比較到位。

    好的状态机使程序变的更加简洁。易扩展,easy查找bug,还非常稳定。坏得状态切割仅仅会让程序晦涩难懂。


    说明:
    1、通过两个状态机实现了两个简单的猜数打怪兽游戏。

    2、全部完整程序都能够到这个地址查看。下载,改动。
    3、整个代码都是通过C++ 完毕的,编译环境是osx 10.10 + LLVM 6.0 , C++使用 -std=c++1y。

    程序写了makefile。所以假设在其它平台仅仅须要简单改动下makefile就能够快乐的玩耍了。

  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6769024.html
Copyright © 2020-2023  润新知