zoukankan      html  css  js  c++  java
  • 1_Command 游戏开发命令模式

    A dead simple implementation looks like:
    
    ```
    // simple 
    void InputHandler::handleInput()
    {
      if (isPressed(BUTTON_X)) jump();
      else if (isPressed(BUTTON_Y)) fireGun();
      else if (isPressed(BUTTON_A)) swapWeapon();
      else if (isPressed(BUTTON_B)) lurchIneffectively();
    }
    
    
    // command pattern
    class Command
    {
    public:
      virtual ~Command() {}
      virtual void execute() = 0;
      //virtual void execute(Actor *) = 0;
    };
    
    class JumpCommand : public Command
    {
    public:
      virtual void execute() { jump(); }
    };
    
    class FireCommand : public Command
    {
    public:
      virtual void execute() { fireGun(); }
    };
    
    
    class InputHandler
    {
    public:
      void handleInput();
    
      // Methods to bind commands...
    
    private:
      Command* buttonX_;
      Command* buttonY_;
      Command* buttonA_;
      Command* buttonB_;
    };
    
    
    
    Command* InputHandler::handleInput()
    {
      if (isPressed(BUTTON_X)) return buttonX_;
      if (isPressed(BUTTON_Y)) return buttonY_;
      if (isPressed(BUTTON_A)) return buttonA_;
      if (isPressed(BUTTON_B)) return buttonB_;
    
      // Nothing pressed, so do nothing.
      return NULL;
    }
    
    Command* command = inputHandler.handleInput();
    if (command)
    {
      command->execute(actor);
    }
    ```
    
    #### use command stream, decoupled producer and consumer
    
    ## undo and redo
    
    
    ```
    
    class Command
    {
    public:
      virtual ~Command() {}
      virtual void execute() = 0;
      virtual void undo() = 0;
    };
    
    class MoveUnitCommand : public Command
    {
    public:
      MoveUnitCommand(Unit* unit, int x, int y)
      : unit_(unit),
        xBefore_(0),
        yBefore_(0),
        x_(x),
        y_(y)
      {}
    
      virtual void execute()
      {
        // Remember the unit's position before the move
        // so we can restore it.
        xBefore_ = unit_->x();
        yBefore_ = unit_->y();
    
        unit_->moveTo(x_, y_);
      }
    
      virtual void undo()
      {
        unit_->moveTo(xBefore_, yBefore_);
      }
    
    private:
      Unit* unit_;
      int xBefore_, yBefore_;
      int x_, y_;
    };
    ```
  • 相关阅读:
    mysql:基础管理、体系结构、升级降级
    Linux网络基础
    mysql 忘记本地密码
    seq命令的用法
    mysql03-SQL应用
    SolidWorks 如何改变封闭草图的背景颜色
    新版 AD 无法选中某些部件(如 Via,Pad)的问题
    安装 dot net 时出现严重错误 0x80070643 安装时发生严重错误 1603 ndp48
    IO 口扩展
    自动波特率检测
  • 原文地址:https://www.cnblogs.com/lightlfyan/p/4224231.html
Copyright © 2011-2022 走看看