《游戏编程模式》一7.1 我们曾经相遇过

简介:

本节书摘来异步社区《游戏编程模式》一书中的第7章,第7.1节,作者: 【美】Robert Nystrom (尼斯卓姆) 译者: 赵卫兵 , 许新星 , 姜召阳 , 陈侃 , 屈光辉 , 郑炯彬 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

7.1 我们曾经相遇过

假设我们现在正在开发一款横版游戏。我们的任务是实现女主角——游戏世界中玩家的图像。我们需要根据玩家的输入来控制主角的行为。当按下B键的时候,她应该跳跃。我们可以这样实现:

void Heroine::handleInput(Input input)
{
 if (input == PRESS_B)
 {
  yVelocity_ = JUMP_VELOCITY;
  setGraphics(IMAGE_JUMP);
 }
}

找找看,bug在哪里?

这里应该还有如果主角着地将isJumping_设置回false的代码。为了简洁起见,我省略了。
我们没有阻止主角“在空中跳跃”——当主角跳起来后持续按下B键。这样会导致她一直飘在空中,简单的修复方法可以是:在Heroine类中添加一个isJumping_布尔值变量来跟踪主角的跳跃,然后这么做:

void Heroine::handleInput(Input input)
{
 if (input == PRESS_B)
 {
  if (!isJumping_)
  {
   isJumping_ = true;
   // Jump...
  }
 }
}

接下来,我们想实现主角的闪避动作。当主角站在地面上的时候,如果玩家按下下方向键,则躲避,如果松开此键,则站立。

void Heroine::handleInput(Input input)
{
 if (input == PRESS_B)
 {
  // Jump if not jumping...
 }
 else if (input == PRESS_DOWN)
 {
  if (!isJumping_)
  {
   setGraphics(IMAGE_DUCK);
  }
 }
 else if (input == RELEASE_DOWN)
 {
  setGraphics(IMAGE_STAND);
 }
}

找找看,bug在哪里?

通过上面的代码,玩家可以:

1.按下方向键来闪避。

2.按B键从闪避的状态直接跳起来。

3.玩家还在空中的时候松开下键。

此时,当女主角在跳跃状态的时候,显示的是站立的图像。是时候添加另外一个布尔标志位来解决该问题了······

void Heroine::handleInput(Input input)
{
 if (input == PRESS_B)
 {
  if (!isJumping_ && !isDucking_)
  {
   // Jump...
  }
 }
 else if (input == PRESS_DOWN)
 {
  if (!isJumping_)
  {
   isDucking_ = true;
   setGraphics(IMAGE_DUCK);
  }
 }
 else if (input == RELEASE_DOWN)
 {
  if (isDucking_)
  {
   isDucking_ = false;
   setGraphics(IMAGE_STAND);
  }
 }
}

接下来,如果我们的主角可以在跳起来的过程中,按下方向键进行一次俯冲攻击那就太酷了,代码如下:

void Heroine::handleInput(Input input)
{
 if (input == PRESS_B)
 {
  if (!isJumping_ && !isDucking_)
  {
   // Jump...
  }
 }
 else if (input == PRESS_DOWN)
 {
  if (!isJumping_)
  {
   isDucking_ = true;
   setGraphics(IMAGE_DUCK);
  }
  else
  {
   isJumping_ = false;
   setGraphics(IMAGE_DIVE);
  }
 }
 else if (input == RELEASE_DOWN)
 {
  if (isDucking_)
  {
   // Stand...
  }
 }
}

你崇拜一些程序员,他们总是看起来会编写完美无瑕的代码,然而他们并非超人。相反,他们有一种直觉会意识到哪种类型的代码容易出错,然后避免编写出这种代码。

复杂的分支和可变的状态——随时间变化的字段,这是两种容易出错的代码,上面的例子就是这样。
又到寻找bug的时间了。找到了吗?

我们发现主角在跳跃状态的时候不能再跳,但是在俯冲攻击的时候却可以跳跃。又要添加一个成员变量······

很明显,我们的这种做法有问题。每次我们添加一些功能的时候,都会不经意地破坏已有代码的功能。而且,我们还有很多“行走”等动作没有添加。如果我们还是采用类似的做法,那bug可能会更多。

相关文章
|
6天前
|
人工智能 运维 安全
|
4天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
548 16
|
11天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
898 109
|
5天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。