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

编程入门 行业动态 更新时间:2024-10-09 09:15:59

《游戏编程<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式》一7.1 我们曾经相遇过"/>

《游戏编程模式》一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可能会更多。

更多推荐

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

本文发布于:2024-02-07 02:03:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752226.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   游戏

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!