如何使用命令模式正确绑定键?
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;
};
我不确定,但希望对您有所帮助
我一直在使用 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;
};
我不确定,但希望对您有所帮助