如何使用命令模式正确绑定键?

How do I correctly bind keys using the command pattern?

我一直在使用 C++ 和 sfml 开发游戏,并且一直在尝试实现命令模式,如下面 link 所示:https://gameprogrammingpatterns.com/command.html。更具体地说,我正在尝试实现命令模式,以便它可以用于场景中的任何角色。

我设置了一个通用命令class:

class Command
{
public:
    ~Command();
    virtual void execute(Character& character) = 0;

};

然后是继承自这个class的一堆class,例如:

#include "Command.h"

class WalkDownCommand : public Command
{
public:
    virtual void execute(Character& character) override
    {
        character.walkDown();
    }
};

然后我创建了一个角色class,其中包含所有行走功能,以及一个表示它的形状 body:



#include <SFML\Graphics.hpp>


class Character {

public:
    Character();
    ~Character();

    void draw(sf::RenderWindow* renderWindow);
    void walkRight();
    void walkLeft();
    void walkUp();
    void walkDown();
private:
    sf::CircleShape* tempShape;

};

然后使用各自的命令调用这些函数 Class。 我还创建了一个 HandleInput 函数,用于检查某个键是否被按下以及 returns 对特定命令的引用 object:

#include "Command.h"

class InputHandler
{
public:

    Command* handleInput();
    
private:
    Command* W_KEY;
    Command* A_KEY;
    Command* S_KEY;
    Command* D_KEY;

};

handleInput 函数如下所示:

Command* InputHandler::handleInput()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
    {
        std::cout << "W key is pressed" << std::endl;
        return W_KEY;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
    {
        std::cout << " A key is pressed" << std::endl;
        return A_KEY;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
    {
        std::cout << "S key is pressed" << std::endl;
        return S_KEY;
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
    {
        std::cout << "D key is pressed" << std::endl;
        return D_KEY;
    }

    return NULL;
    
}

在游戏主循环中,我创建了一个调用 handleInput 函数来检查输入的命令指针 object。如果它找到一个命令,它就执行这个命令('gloon' 是 Character 类型的 object):

Command* command = inputHandler.handleInput();
        if (command)
        {
            command->execute(gloon);
        }

当 运行 时,正确调用 handleInput 函数,然后 returns 按下的键之一。但是,程序立即崩溃,并指出: 抛出异常:读取访问冲突。命令是 0xFFFFFFFFFFFFFFFF。

在页面开头的 link I showed 中,命令模式描述还指出我需要将 Command* objects 绑定到正确的函数。这可能是导致问题的原因,但我无法理解如何执行此操作。感谢您的帮助!

也许,尝试这样的事情(在你的 class InputHandler 中初始化指针):

    #include "Command.h"
    
    class InputHandler
    {
    public:
        InputHandler()
        { 
            W_KEY = new WalkUpCommand; 
            A_KEY = new WalkLeftCommand; 
            D_KEY = new WalkRightCommand; 
            S_KEY = new WalkDownCommand;
        }
        ~InputHandler() 
        {
            delete W_KEY;
            delete A_KEY;
            delete S_KEY;
            delete D_KEY;
        }
        Command* handleInput();
        
    private:
        Command* W_KEY;
        Command* A_KEY;
        Command* S_KEY;
        Command* D_KEY;
    
    };

我不确定,但希望对您有所帮助