From 4d8464e98d8b44652f181da1b99a2a709738d480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8C=85=E7=BA=B8?= <141250108@smail.nju.edu.cn> Date: Tue, 21 Nov 2017 16:35:21 +0800 Subject: [PATCH] =?UTF-8?q?06=20In=20Practice\2D-Game\08=20PowerUps?= =?UTF-8?q?=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2D-Game/07 Postprocessing.md | 2 +- docs/06 In Practice/2D-Game/08 Powerups.md | 332 +++++++++++++++++- docs/img/06/Breakout/08/powerups.png | Bin 0 -> 23760 bytes 3 files changed, 330 insertions(+), 4 deletions(-) create mode 100644 docs/img/06/Breakout/08/powerups.png diff --git a/docs/06 In Practice/2D-Game/07 Postprocessing.md b/docs/06 In Practice/2D-Game/07 Postprocessing.md index 28ad558..dfa6472 100644 --- a/docs/06 In Practice/2D-Game/07 Postprocessing.md +++ b/docs/06 In Practice/2D-Game/07 Postprocessing.md @@ -169,7 +169,7 @@ void Game::Render() 无论我们需要什么,我们只需要将需要的PostProcessor类中的特效属性设置为true,其效果就可以立即可见。 -##Shake it +## Shake it 作为这些效果的演示,我们将模拟球击中坚固的混凝土块时的视觉冲击。无论在哪里发生碰撞,只要在短时间内实现晃动(shake)效果,便能增强撞击的冲击感。 diff --git a/docs/06 In Practice/2D-Game/08 Powerups.md b/docs/06 In Practice/2D-Game/08 Powerups.md index 347e824..38a0c5f 100644 --- a/docs/06 In Practice/2D-Game/08 Powerups.md +++ b/docs/06 In Practice/2D-Game/08 Powerups.md @@ -1,7 +1,333 @@ # 道具 -**暂无翻译** +原文 | [Powerups](https://learnopengl.com/#!In-Practice/2D-Game/Powerups) +----- | ---- +作者 | JoeydeVries +翻译 | [包纸](https://github.com/ShirokoSama) +校对 | 暂无 -这篇教程暂时还没有进行翻译,您可以先阅读[原文](https://learnopengl.com/#!In-Practice/2D-Game/Powerups),或经常来刷新看看是否有更新的进展。当然,我们更欢迎您在[GitHub上](https://github.com/LearnOpenGL-CN/LearnOpenGL-CN)认领翻译这篇文章,帮助我们完善这个教程系列。 +Breakout已经接近完成了,但我们可以至少再增加一种游戏机制让它变得更酷。“充电”(译注:Powerups,很多游戏中都会用这个单词指代可以提升能力的道具,本文之后也会用道具一词作为其翻译)怎么样? - \ No newline at end of file +这个想法的含义是,无论一个砖块何时被摧毁,它都有一定几率产生一个道具块。这样的道具快会缓慢降落,而且当它与玩家挡板发生接触时,会发生基于道具类型的有趣效果。例如,某一种道具可以让玩家挡板变长,另一种道具则可以让小球穿过物体。我们还可以添加一些可以给玩家造成负面影响的负面道具。 + +我们可以将道具建模为具有一些额外属性的GameObject,这也是为什么我们定义一个继承自GameObjectPowerUp类并在其中增添了一些额外的成员属性。 + +```c++ +const glm::vec2 SIZE(60, 20); +const glm::vec2 VELOCITY(0.0f, 150.0f); + +class PowerUp : public GameObject +{ +public: + // 道具类型 + std::string Type; + GLfloat Duration; + GLboolean Activated; + // 构造函数 + PowerUp(std::string type, glm::vec3 color, GLfloat duration, + glm::vec2 position, Texture2D texture) + : GameObject(position, SIZE, texture, color, VELOCITY), + Type(type), Duration(duration), Activated() + { } +}; +``` + +PowerUp类仅仅是一个有一些额外状态的GameObject, 所以我们简单地将它定义为一个头文件,你可以在[这里](https://learnopengl.com/code_viewer.php?code=in-practice/breakout/power_up.h)找到它。 + +每个道具以字符串的形式定义它的类型,持有表示它有效时长的持续时间与表示当前是否被激活的属性。在Breakout中,我们将添加4种增益道具与2种负面道具: + +![](../../img/06/Breakout/08/powerups.png) + +- **Speed**: 增加小球20%的速度 +- **Sticky**: 当小球与玩家挡板接触时,小球会保持粘在挡板上的状态直到再次按下空格键,这可以让玩家在释放小球前找到更合适的位置 +- **Pass-Through**: 非实心砖块的碰撞处理被禁用,使小球可以穿过并摧毁多个砖块 +- **Pad-Size-Increase**: 增加玩家挡板50像素的宽度 +- **Confuse**: 短时间内激活confuse后期特效,迷惑玩家 +- **Chaos**: 短时间内激活chaos后期特效,使玩家迷失方向 + +你可以在下面找到道具的高质量纹理: + +- **Texture**: [Speed](https://learnopengl.com/img/in-practice/breakout/textures/powerup_speed.png),[Sticky](https://learnopengl.com/img/in-practice/breakout/textures/powerup_sticky.png),[Pass-Through](https://learnopengl.com/img/in-practice/breakout/textures/powerup_passthrough.png),[Pad-Size-Increase](https://learnopengl.com/img/in-practice/breakout/textures/powerup_increase.png),[Confuse](https://learnopengl.com/img/in-practice/breakout/textures/powerup_confuse.png),[Chaos](https://learnopengl.com/img/in-practice/breakout/textures/powerup_chaos.png). + +与关卡中的砖块纹理类似,每个道具纹理都是完全灰度的,这使得我们在将其与颜色向量相乘时可以保持色彩的平衡。 + +因为我们需要跟踪游戏中被激活的道具的类型、持续时间、相关效果等状态,所以我们将它们存储在一个容器内: + +```c++ +class Game { + public: + [...] + std::vector PowerUps; + [...] + void SpawnPowerUps(GameObject &block); + void UpdatePowerUps(GLfloat dt); +}; +``` + +我们还定义了两个管理道具的函数,SpawnPowerUps在给定的砖块位置生成一个道具,UpdatePowerUps管理所有当前被激活的道具。 + +## SpawnPowerUps + +每次砖块被摧毁时我们希望以一定几率生成一个道具,这个功能可以在GameSpawnPowerUps函数中找到: + +```c++ +GLboolean ShouldSpawn(GLuint chance) +{ + GLuint random = rand() % chance; + return random == 0; +} +void Game::SpawnPowerUps(GameObject &block) +{ + if (ShouldSpawn(75)) // 1/75的几率 + this->PowerUps.push_back( + PowerUp("speed", glm::vec3(0.5f, 0.5f, 1.0f), 0.0f, block.Position, tex_speed + )); + if (ShouldSpawn(75)) + this->PowerUps.push_back( + PowerUp("sticky", glm::vec3(1.0f, 0.5f, 1.0f), 20.0f, block.Position, tex_sticky + ); + if (ShouldSpawn(75)) + this->PowerUps.push_back( + PowerUp("pass-through", glm::vec3(0.5f, 1.0f, 0.5f), 10.0f, block.Position, tex_pass + )); + if (ShouldSpawn(75)) + this->PowerUps.push_back( + PowerUp("pad-size-increase", glm::vec3(1.0f, 0.6f, 0.4), 0.0f, block.Position, tex_size + )); + if (ShouldSpawn(15)) // 负面道具被更频繁地生成 + this->PowerUps.push_back( + PowerUp("confuse", glm::vec3(1.0f, 0.3f, 0.3f), 15.0f, block.Position, tex_confuse + )); + if (ShouldSpawn(15)) + this->PowerUps.push_back( + PowerUp("chaos", glm::vec3(0.9f, 0.25f, 0.25f), 15.0f, block.Position, tex_chaos + )); +} +``` + +这样的SpawnPowerUps函数以一定几率(1/75普通道具,1/15负面道具)生成一个新的PowerUp对象,并设置其属性。每种道具有特殊的颜色使它们更具有辨识度,同时根据类型决定其持续时间的秒数,若值为0.0f则表示它持续无限长的时间。除此之外,每个道具初始化时传入被摧毁砖块的位置与上一小节给出的对应纹理。 + +## 激活道具 + +接下来我们更新游戏的DoCollisions函数使它不只检查小球与砖块和挡板的碰撞,还检查挡板与所有未被销毁的道具的碰撞。注意我们在砖块被摧毁的同时调用SpawnPowerUps函数。 + +```c++ +void Game::DoCollisions() +{ + for (GameObject &box : this->Levels[this->Level].Bricks) + { + if (!box.Destroyed) + { + Collision collision = CheckCollision(*Ball, box); + if (std::get<0>(collision)) + { + if (!box.IsSolid) + { + box.Destroyed = GL_TRUE; + this->SpawnPowerUps(box); + } + [...] + } + } + } + [...] + for (PowerUp &powerUp : this->PowerUps) + { + if (!powerUp.Destroyed) + { + if (powerUp.Position.y >= this->Height) + powerUp.Destroyed = GL_TRUE; + if (CheckCollision(*Player, powerUp)) + { // 道具与挡板接触,激活它! + ActivatePowerUp(powerUp); + powerUp.Destroyed = GL_TRUE; + powerUp.Activated = GL_TRUE; + } + } + } +} +``` + +对所有未被销毁的道具,我们检查它是否接触到了屏幕底部或玩家挡板,无论哪种情况我们都销毁它,但当道具与玩家挡板接触时,激活这个道具。 + +激活道具的操作可以通过将其Activated属性设为true来完成,实现其效果则需要将它传给ActivatePowerUp函数: + +```c++ +void ActivatePowerUp(PowerUp &powerUp) +{ + // 根据道具类型发动道具 + if (powerUp.Type == "speed") + { + Ball->Velocity *= 1.2; + } + else if (powerUp.Type == "sticky") + { + Ball->Sticky = GL_TRUE; + Player->Color = glm::vec3(1.0f, 0.5f, 1.0f); + } + else if (powerUp.Type == "pass-through") + { + Ball->PassThrough = GL_TRUE; + Ball->Color = glm::vec3(1.0f, 0.5f, 0.5f); + } + else if (powerUp.Type == "pad-size-increase") + { + Player->Size.x += 50; + } + else if (powerUp.Type == "confuse") + { + if (!Effects->Chaos) + Effects->Confuse = GL_TRUE; // 只在chaos未激活时生效,chaos同理 + } + else if (powerUp.Type == "chaos") + { + if (!Effects->Confuse) + Effects->Chaos = GL_TRUE; + } +} +``` + +ActivatePowerUp的目的正如其名称,它按本章教程之前所预设的那样激活了一个道具的效果。我们检查道具的类型并相应地改变游戏状态。对于**Sticky**和**Pass-through**效果,我们也相应地改变了挡板和小球的颜色来给玩家一些当前被激活了哪种效果的反馈。 + +因为**Sticky**和**Pass-through**效果稍微改变了一些原有的游戏逻辑,所以我们将这些效果作为属性存储在小球对象中,这样我们可以根据小球当前激活了什么效果而改变游戏逻辑。我们只在BallObject的头文件中增加了两个属性,但为了完整性下面给出了更新后的代码: + +- **GameObject**: [头文件](https://learnopengl.com/code_viewer.php?code=in-practice/breakout/ball_object.h),[代码](https://learnopengl.com/code_viewer.php?code=in-practice/breakout/ball_object) + +这样我们可以通过改动DoCollisions函数中小球与挡板碰撞的代码便捷地实现**Sticky**效果。 + +```c++ +if (!Ball->Stuck && std::get<0>(result)) +{ + [...] + Ball->Stuck = Ball->Sticky; +} +``` + +在这里我们将小球的Stuck属性设置为它自己的Sticky属性,若**Stikcy**效果被激活,那么小球则会在与挡板接触时粘在上面,玩家不得不再次按下空格键才能释放它。 + +在同样的DoCollisions函数中还有个为了实现**Pass-through**效果的类似小改动。当小球的PassThrough属性被设置为true时,我们不对非实习砖块做碰撞处理操作。 + +```c++ +Direction dir = std::get<1>(collision); +glm::vec2 diff_vector = std::get<2>(collision); +if (!(Ball->PassThrough && !box.IsSolid)) +{ + if (dir == LEFT || dir == RIGHT) // 水平碰撞 + { + [...] + } + else + { + [...] + } +} +``` + +其他效果可以通过简单的更改游戏的状态来实现,如小球的速度、挡板的尺寸、PostProcessor对象的效果。 + +## 更新道具 + +现在剩下要做的就是保证道具生成后可以移动,并且在它们的持续时间用尽后失效,否则道具将永远保持激活状态。 + +在游戏的UpdatePowerUps函数中,我们根据道具的速度移动它,并减少已激活道具的持续时间,每当时间减少至小于0时,我们令其失效,并恢复相关变量的状态。 + +```c++ +void Game::UpdatePowerUps(GLfloat dt) +{ + for (PowerUp &powerUp : this->PowerUps) + { + powerUp.Position += powerUp.Velocity * dt; + if (powerUp.Activated) + { + powerUp.Duration -= dt; + + if (powerUp.Duration <= 0.0f) + { + // 之后会将这个道具移除 + powerUp.Activated = GL_FALSE; + // 停用效果 + if (powerUp.Type == "sticky") + { + if (!isOtherPowerUpActive(this->PowerUps, "sticky")) + { // 仅当没有其他sticky效果处于激活状态时重置,以下同理 + Ball->Sticky = GL_FALSE; + Player->Color = glm::vec3(1.0f); + } + } + else if (powerUp.Type == "pass-through") + { + if (!isOtherPowerUpActive(this->PowerUps, "pass-through")) + { + Ball->PassThrough = GL_FALSE; + Ball->Color = glm::vec3(1.0f); + } + } + else if (powerUp.Type == "confuse") + { + if (!isOtherPowerUpActive(this->PowerUps, "confuse")) + { + Effects->Confuse = GL_FALSE; + } + } + else if (powerUp.Type == "chaos") + { + if (!isOtherPowerUpActive(this->PowerUps, "chaos")) + { + Effects->Chaos = GL_FALSE; + } + } + } + } + } + this->PowerUps.erase(std::remove_if(this->PowerUps.begin(), this->PowerUps.end(), + [](const PowerUp &powerUp) { return powerUp.Destroyed && !powerUp.Activated; } + ), this->PowerUps.end()); +} +``` + +你可以看到对于每个效果,我们通过将相关元素重置来停用它。我们还将PowerUpActivated属性设为false,在UpdatePowerUps结束时,我们通过循环PowerUps容器,若一个道具被销毁切被停用,则移除它。我们在算法开头使用remove_if函数,通过给定的lamda表达式消除这些对象。 + +!!! important + + remove_if函数将lamda表达式为true的元素移动至容器的末尾并返回一个迭代器指向应被移除的元素范围的开始部分。容器的erase函数接着擦除这个迭代器指向的元素与容器末尾元素之间的所有元素。 + +可能会发生这样的情况:当一个道具在激活状态时,另一个道具与挡板发生了接触。在这种情况下我们有超过1个在当前PowerUps容器中处于激活状态的道具。然后,当这些道具中的一个被停用时,我们不应使其效果失效因为另一个相同类型的道具仍处于激活状态。出于这个原因,我们使用isOtherPowerUpActive检查是否有同类道具处于激活状态。只有当它返回false时,我们才停用这个道具的效果。这样,给定类型的道具的持续时间就可以延长至最近一次被激活后的持续时间。 + +```c++ +GLboolean IsOtherPowerUpActive(std::vector &powerUps, std::string type) +{ + for (const PowerUp &powerUp : powerUps) + { + if (powerUp.Activated) + if (powerUp.Type == type) + return GL_TRUE; + } + return GL_FALSE; +} +``` + +这个函数简单地检查是否有同类道具处于激活状态,如果有则返回GL_TRUE。 + +最后剩下的一件事便是渲染道具: + +```c++ +void Game::Render() +{ + if (this->State == GAME_ACTIVE) + { + [...] + for (PowerUp &powerUp : this->PowerUps) + if (!powerUp.Destroyed) + powerUp.Draw(*Renderer); + [...] + } +} +``` + +结合所有的这些功能,我们有了一个可以运作的道具系统,它不仅使游戏更有趣,还使游戏更具有挑战性。它看上去会像这样: + + + +你可以在下面找到所有更新后的代码(当关卡重置时我们同时重置所有道具效果): + +- **Game**: [头文件](https://learnopengl.com/code_viewer.php?code=in-practice/breakout/game_powerups.h),[代码](https://learnopengl.com/code_viewer.php?code=in-practice/breakout/game_powerups) \ No newline at end of file diff --git a/docs/img/06/Breakout/08/powerups.png b/docs/img/06/Breakout/08/powerups.png new file mode 100644 index 0000000000000000000000000000000000000000..ff56be040e3e9d13ecbb3d20ff9bacf1377241cb GIT binary patch literal 23760 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 Oprr;?EqnAd^uGX2NYhpT literal 0 HcmV?d00001