读书笔记----软件设计原则、设计模式

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/homework/11833
这个作业的目标 让学生了解和学习软件设计的原则、模式,并结合自身开发经历加深对相应知识的理解

参考书籍
《Game Programming Patterns》—— Robert Nystrom
内容简介:许多游戏程序员因为它们自己的代码太复杂了导致游戏项目失败。本书解决了这个问题。基于多年的经验,以开发模式模式解开和优化游戏,作为独立的工具书,使你可以选择你需要的模式组织。

架构,性能和游戏

重访设计模式

命令模式
享元模式
观察者模式
原型模式
单例模式
状态模式

序列模式

双缓冲模式
游戏循环
更新方法

行为模式

字节码
子类沙箱
类型对象

解耦模式

组件模式
事件队列
服务定位器

优化模式

数据局部性
脏标识模式
对象池模式
空间分区

命令模式精简定义为:

命令是具现化的方法调用。命令模式是一种回调的面向对象实现。

在每个游戏中都有一块代码读取用户的输入——按钮按下,键盘敲击,鼠标点击,诸如此类。 这块代码会获取用户的输入,然后将其变为游戏中有意义的行为:

一个手柄, A键调用swapWeapon(),B键调用lurch(),X键调用jump(),Y键调用fireGun()。

下面是一种简单的实现:

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

基类代表可触发的游戏行为:

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

当你有接口只包含一个没有返回值的方法时
我们为不同的游戏行为定义相应的子类:

`class JumpCommand : public Command
{
public:
  virtual void execute() { jump(); }
};
class FireCommand : public Command
{
public:
  virtual void execute() { fireGun(); }
};
`

为每个按键存储一个指向命令的指针。

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

注意在这里检测NULL同时我们可以定义一个命令类,它的execute()什么也不做。 这样,某些按键处理器不必设为NULL,只需指向这个类。这种模式被称为空对象。
存储

心得体会
1、这本书虽然是全英的但是这本书将游戏开发中经常涉及到的编程模式拎出来,结合具体开发中遇到的实例一步步的引出对应的模式,而且算法很少让我很容易能懂;
2、同时这本书教会了我要用合适的方法去解决问题,现实中我们面临的问题往往不是手里没有解决问题的工具,而是我们经常答非所问,不能对症下药,这比不使用任何设计模式还可怕。;
3、同时学习这本书让我开阔了很大的视野,听到了很多从没听过的知识。
4、现在程序这与冒险游戏主要的不同是,程序不是等待文本指令,而是等待用户输入事件——鼠标点击、按键按下之类的。 其他部分还是和以前的老式文本冒险游戏一样,程序阻塞等待用户的输入,这是个问题。
不像其他大多数软件,游戏即使在没有玩家输入时也继续运行。 如果你站在那里看着屏幕,游戏不会冻结。动画继续动着。视觉效果继续闪烁。 如果运气不好的话,怪物会继续吞噬英雄。
事件循环有“空转”事件,这样你可以无需用户输入间歇地做些事情。 这对于闪烁的光标或者进度条已经足够了,但对于游戏就太原始了。
这是真实游戏循环的第一个关键部分:它处理用户输入,但是不等待它。循环总是继续旋转:
之前的程序是这样

`
while (true)
{
  Event* event = waitForEvent();
  dispatchEvent(event);
}
但现在可以优化成如此
while (true)
{
  processInput();
  update();
  render();
}`

后台编辑

原文地址:https://www.cnblogs.com/bofujiang/p/14548801.html