Treść książki
Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Zamiastwywoływaćfunkcje,któresameodnajdująobiekty,którychdo-
tyczypolecenie,przekażemyobiekt,któremuchcemyrozkazywać:
classCommand
{
public:
virtual~Command(){}
virtualvoidexecute(GameActor&actor)=0;
};
WtymprzypadkuGameActortonaszaklasanobiektugry”,którare-
prezentujejakąśpostaćwświeciegry.Przekazujemyjądoexecute(),
takbypochodnepoleceniemogłowywoływaćmetodynatychposta-
ciach,któresobiewybierzemy,np.wtakisposób:
classJumpCommand:publicCommand
{
public:
virtualvoidexecute(GameActor&actor)
{
actor.jump();
}
};
Terazmożemywykorzystaćtęjednąklasę,abysprawić,żedowolna
postaćwgrzebędzieskakać.Międzykodemobsługiwejściaapolece-
niembrakujenamjedyniejakiegośkawałka,któryprzyjmujepolecenie
iwywołujejenawłaściwymobiekcie.
NajpierwzmieniamyhandleInput()tak,byzwracałopolecenia:
Command*InputHandler::handleInput()
{
if(isPressed(BUTTON_X))returnbuttonX_;
if(isPressed(BUTTON_Y))returnbuttonY_;
if(isPressed(BUTTON_A))returnbuttonA_;
if(isPressed(BUTTON_B))returnbuttonB_;
//Nicniezostałowciśnięte,więcnicnierób.
returnNULL;
}
Niemożemywykonaćpoleceniaodrazu,ponieważniewieono,do
któregoaktoraprzekazać.Wtymmiejscuwykorzystujemyfakt,żepo-
leceniejestzreifikowanymwywołaniem-możemyopóźnićmoment
wykonaniawywołania.Następniepotrzebnenambędzietrochękodu,
któryprzyjmujetopolecenieiwykonujejenaaktorzereprezentującym
gracza.Cośtakiego:
Command*command=inputHandler.handleInput();
if(command)
{
command->execute(actor);
}
Programowaniegier–Wzorceprojektowerazjeszcze25