I've been working on a game using c and sfml and I've been trying to implement the command pattern as seen in the link below: https://gameprogrammingpatterns.com/command.html. More specifically, I am trying to implement the command pattern so that it can be used for any character in the scene.
I've set up a general command class:
class Command
{
public:
~Command();
virtual void execute(Character& character) = 0;
};
And then a bunch of classes that inherit from this class, for example:
#include "Command.h"
class WalkDownCommand : public Command
{
public:
virtual void execute(Character& character) override
{
character.walkDown();
}
};
Then I created a character class that contains all the functions for walking, and a shape to represent it's 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;
};
These functions are then called using their respective command Class. I've also created a HandleInput function that checks whether a key is pressed and returns a reference to a specific command object:
#include "Command.h"
class InputHandler
{
public:
Command* handleInput();
private:
Command* W_KEY;
Command* A_KEY;
Command* S_KEY;
Command* D_KEY;
};
The handleInput function looks as follows:
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;
}
In the games main loop, I created a Command pointer object that calls the handleInput function to check for input. If it finds a command, it executes this command ('gloon' is the object of type Character):
Command* command = inputHandler.handleInput();
if (command)
{
command->execute(gloon);
}
When running this, the handleInput function gets correctly called and then returns one of the pressed keys. However, the program crashes right after, stating: Exception thrown: read access violation. command was 0xFFFFFFFFFFFFFFFF.
In the link I showed of the beginning of the page, the command pattern description also states that I need to bind the Command* objects to the correct function. This might be what is causing the issue, but I'm having trouble to understand how to do this. Any help is appreciated!
CodePudding user response:
Maybe, try something like this (to initialize pointers in your 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;
};
I'm not sure, but hope it will be helpful
