游戏编程模式——命令模式

命令模式

本文的参数书是《游戏编程模式》,作者:Bob Nystrom。当然学习资料是在网上下载的PDF版本,等学完了这本书,一定要买来这本书的纸质版留一个纪念。

GoF是这样定义命令模式的:
将一个请求封装为一个对象,从而使你可用不同的请求的客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

每个游戏都有一些用户输入要处理,比如键盘敲击,鼠标点击等等。例如:
在这里插入图片描述

下面是一种简单实现:

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();
}

这样的做法,通常要在游戏的每一帧循环调用函数。但是却不能支持更多的功能,比如当游戏允许玩家配置按键功能的时候就不那么实用了。(扯一句题外话,想当年老罗吹嘘锤子T1的时候,讲到有对称按键并且支持按键功能自定义,感觉好屌的样子,然后就屁颠屁颠的买了T1。现在想想这也许仅仅是软件上的一个小小的改变。)

为了实现这些功能,我们通过一个基类代表游戏触发的行为:

class Command
{
public:
	virtual ~Command(){}
	virtual void execute() = 0;
};

当你有一个接口只包含一个没有返回值的方法时,很可能你可以使用命令模式。

然后我们为不同的游戏行为定义相应的子类:

class JumpCommand : public Command
{
public:
	virtual void execute() { jump(); }
};
class FirCommand: public Command
{
public:
	virtual void execute(){ firGun(); }
};
//大概就是这样的思路了

在代码的输入处理部分,为每一个按键存储一个指向命令的指针

class InputHandler
{
public: void handleInput();
//绑定命令的方法
private:
	Command* buttonX_;
	Command* buttonY_;
	Command* buttonA_;
	Command* buttonB_;
};

现在输入部分这样处理

void InputHandler::handleInput()
{
	if(isPressed(BUTTON_X)) buttonX_->execute();
	else if(isPressed(BUTTON_Y)) buttonY_->execute();
	else if(isPressed(BUTTON_A)) buttonA_->execute();
	else if(isPressed(BUTTON_B)) buttonB_->execute();
};

以前每个函数直接调用函数,现在会有一层间接寻址:
在这里插入图片描述


重点在下面

又有一个新的需求,假设我们要控制游戏玩家角色之外的角色怎么办,这个时候就需要关联角色了:

class JumpCommand: public Command
{
public:
	virtual void execute(GameActor &actor)
	{
		actor.jump();
	}
};

现在可以让游戏中的任何角色跳来跳去了。在输入控制部分和在对象上调用命令之间,还缺少了输入的控制部分,handleInput如下:

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_;
	//没有按下任何按键,就什么都不做
	return NULL;
};

这里还不能立即执行,因为还不知道哪个角色会传进来。这里我们享受了命令是具体调用的好处——延迟到调用执行时再知道。
然会,需要一些接受命令的代码,作用在玩家角色身上。像这样:

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

将actor视为玩家角色的引用,但是这里我们也可以控制其他的任何角色,只需要向命令传入不同的角色。在实际应用中,大部分游戏角色被AI控制,这时候我们可以在AI和角色之间使用相同的命令模式,这样AI代码只需要生成Command对象。

AI命令流和玩家控制同时作用时足以是游戏充满多样化,这些在游戏展示和自动演示时会很有用。如果将指令序列化,再通过网络传输它们,我们可以接受玩家的输入,将其通过网络发送到另一台机器上,然后重现,这是网络多人游戏的基础。
贴一张图,感觉很高大上
在这里插入图片描述
另外在命令模式使用时还可以为命令提供一个撤销方法,在游戏进行中和游戏编辑过程中是很有用的,这里贴张图算了,具体实现也不难,无非就是保存历史操作记录。
在这里插入图片描述


控制其它游戏对象的游戏代码

class Command
{
public:
	virtual ~Command(){}
	virtual void execute(GameActor &actor) = 0;
};

这里GameActor是代表游戏世界中的角色的“游戏对象”类

class JunpCommand: public Command
{
public:
	virtual void execute(GameActor& actor)
	{
		actor.jump();
	}
};

现在可以跳来跳去了

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

2018年10月19日

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 前言 第一部分 Perl基础 第1学时 Perl入门 3 1.1 安装Perl 3 1.1.1 等一等,也许你已经安装了Perl 4 1.1.2 在Windows 95/98/NT上安装Perl 5 1.1.3 在UNIX上安装Perl 6 1.1.4 在Macintosh系统上安装Perl 7 1.2 文档资料 7 1.2.1 某些特殊的文档资料举例 8 1.2.2 如果无法找到文档该怎么办 9 1.3 编写你的第一个Perl程序 9 1.3.1 键入程序 9 1.3.2 运行程序 9 1.3.3 程序正确将会发生什么情况 10 1.3.4 Perl程序的具体运行过程 10 1.3.5 必须知道的一些情况 11 1.4 课时小结 12 1.5 课外作业 12 1.5.1 专家答疑 12 1.5.2 思考题 12 1.5.3 解答 13 1.5.4 实习 13 第2学时 Perl的基本构件:数字和 字符串 14 2.1 直接量 14 2.1.1 数字 14 2.1.2 字符串 15 2.2 标量变量 16 2.3 表达式和运算符 18 2.3.1 基本运算符 18 2.3.2 数字运算符 19 2.3.3 字符串运算符 19 2.4 其他运算符 20 2.4.1 单参数运算符 20 2.4.2 递增和递减 21 2.4.3 尖括号运算符 21 2.4.4 其他赋值运算符 22 2.4.5 关于字符串和数字的一些说明 22 2.5 练习:利息计算程序 23 2.6 课时小结 24 2.7 课外作业 24 2.7.1 专家答疑 24 2.7.2 思考题 24 2.7.3 解答 25 2.7.4 实习 25 第3学时 控制程序流 26 3.1 语句块 26 3.2 if语句 27 3.2.1 其他关系运算符 28 3.2.2 “真”对于Perl意味着什么 29 3.2.3 逻辑运算符 30 3.3 循环 32 3.3.1 用while进行循环 32 3.3.2 使用for循环 33 3.4 其他流控制工具 33 3.4.1 奇特的执行顺序 33 3.4.2 明细控制 34 3.4.3 标号 35 3.4.4 退出Perl 35 3.5 练习:查找质数 35 3.6 课时小结 37 3.7 课外作业 37 3.7.1 专家答疑 37 3.7.2 思考题 37 3.7.3 解答 38 3.7.4 实习 38 第4学时 基本构件的堆栈:列表与数组 39 4.1 将数据放入列表和数组 39 4.2 从数组中取出元素 41 4.2.1 寻找结尾 42 4.2.2 关于上下文的详细说明 43 4.2.3 回顾以前的几个功能 44 4.3 对数组进行操作 45 4.3.1 遍历数组 46 4.3.2 在数组与标量之间进行转换 46 4.3.3 给数组重新排序 48 4.4 练习:做一个小游戏 49 4.5 课时小结 51 4.6 课外作业 51 4.6.1 专家答疑 51 4.6.2 思考题 51 4.6.3 解答 52 4.6.4 实习 52 第5学时 进行文件操作 53 5.1 打开文件 53 5.1.1 路径名 54 5.1.2 出色的防错措施 55 5.1.3 以适当的方式运行die函数 56 5.2 读取文件 56 5.3 写入文件 58 5.4 自由文件、测试文件和二进制数据 60 5.4.1 自由文件句柄 60 5.4.2 二进制文件 60 5.4.3 文件测试运算符 61 5.5 课时小结 62 5.6 课外作业 62 5.6.1 专家答疑 62 5.6.2 思考题 63 5.6.3 解答 63 5.6.4 实习 63 第6学时 模式匹配 64 6.1 简单的模式 64 6.2 元字符 66 6.2.1 一个简单的元字符 66 6.2.2 非输出字符 66 6.2.3 通配符 66 6.2.4 字符类 68 6.2.5 分组和选择 69 6.2.6 位置通配符 69 6.3 替换 70 6.4 练习:清除输入数据 70 6.5 关于模式匹配的其他问题 71 6.5.1 对其他变量进行操作 71 6.5.2 修饰符与多次匹配
游戏编程模式是一本关于游戏开发的编程指南,它提供了各种游戏编程模式和技巧。这本书以中文版pdf的形式提供,使得读者可以方便地在电脑上阅读和学习。 游戏编程模式中的编程模式指的是一种可以重复应用的经过验证的解决方案。游戏编程中存在许多常见的问题,如游戏物体的创建和管理、游戏场景的转换和渲染、游戏角色的行为和交互等等。通过学习这些编程模式,开发者可以更加高效地解决这些问题,并且在游戏开发中更好地组织和管理代码。 此外,游戏编程模式还包含了一些关于游戏设计和架构的技巧。游戏开发不仅仅是编写代码,还需要考虑游戏的整体设计和架构。这本书将介绍一些在游戏开发中常用的设计原则和模式,如单例模式命令模式、状态模式等,帮助开发者构建更加可维护和可扩展的游戏系统。 游戏编程模式中文版pdf的发布使得更多的中文读者能够获得这本书的内容。对于想要从事游戏开发的人来说,这本书是一个宝贵的学习资源,可以帮助他们理解游戏开发中的常见问题和挑战,并且提供解决这些问题的方法和技巧。 总之,游戏编程模式中文版pdf是一本关于游戏开发的编程指南,通过介绍游戏编程模式和技巧,帮助读者更好地组织和管理游戏开发中的代码,构建可维护和可扩展的游戏系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值