你知道如何使用优雅的代码为游戏角色切换不同技能吗?

点击上方亿元程序员+关注和★星标

引言

大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。

本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。

优雅的代码,需要策略

大家好 ,今天我想和大家分享一下游戏开发中常用的设计模式 之一------策略模式 。策略模式是一种行为型设计模式 ,它通过定义一系列算法 ,将它们封装起来 ,并使它们可以相互替换 ,从而使算法的变化独立于使用算法的客户端。在游戏开发中,策略模式可以帮助我们实现更灵活、可维护的代码。

本文源码和源工程在文末获取,小伙伴们自行前往。

什么是策略模式?

首先 ,让我们来了解一下策略模式的基本概念。策略模式包含三个主要角色

  1. 环境(Context):持有一个策略类的引用,提供接口给客户端使用。
  2. 抽象策略(Strategy):定义了一组算法,为所有具体策略类所共享。
  3. 具体策略(ConcreteStrategy):实现抽象策略中的算法,提供具体的业务逻辑。

一起来使用策略模式

接下来,让我们看一个简单的例子 来说明策略模式的应用。假设我们正在开发一个角色扮演游戏 ,玩家可以通过选择不同的技能来进行攻击。我们可以使用策略模式来实现这个功能。

首先 ,我们定义一个策略类Skill,它有一个方法attack()用于执行技能。然后,我们创建两个具体策略类skill0skill1,分别实现紫色攻击和粉色攻击的逻辑。最后,我们在环境类Charater中使用这些策略。

1.准备资源

我们还是从82年祖传 的资源里面找到一个紫色的技能攻击特效 。但是一个技能可能不够演示策略模式。

但是对于一个PS大神 来说(不是),二话不说 我们打开熟悉PS,并且把紫色技能拖进去

然后通过ctrl+u调整色相 到87并点击确定,神奇的一幕出现了,技能变成了粉色。

最后通过文件-存储为-修改技能名字-保存生成新的粉色技能。

这样我们就得到一个粉色新技能(???)

2.环境

首先 定义我们的环境类Charater,其中包含attacklearnSkill接口,先在构造函数里面添加一个FrameAnim帧动画组件,关于帧动画组件的实现与使用 可以阅读《CocosCreator帧动画组件FrameAnim实现与使用》。

3.抽象策略

然后 定义一个抽象策略类Skill,包含attack接口,同时在构造函数中添加一个FrameAnim组件。

4.具体策略

最后 实现2个具体的策略类,分别是Skill0Skill1,唯一的区别就是加载不同的技能效果,正是我们准备的紫色技能和粉色技能资源。

5.测试代码

创建一个主角 ,同时实例化2个具体的技能。

监听 键盘事件,qwe分别执行空手攻击、装备Skill0后攻击和装备Skill1后攻击。

6.结果演示

在上面的例子中,我们通过将技能抽象成策略类 ,使得玩家可以自由选择不同的技能进行攻击 。如果以后需要添加更多的技能 ,只需要创建一个新的具体策略类 即可,而不需要修改 其他代码。这样,我们的代码就变得更加灵活、可维护了。

结语

在哪里 可以看到如此清晰的思路,快跟上我的节奏!关注我 ,和我一起了解 游戏行业最新动态,学习游戏开发技巧。

本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

8年主程手把手打造Cocos独立游戏开发框架

从零开始开发贪吃蛇小游戏到上线系列

游戏开发的技巧、心得、资讯

关注我,发送"策略模式"获取源码和源工程。

点击下方绿色按钮+关注

相关推荐
薛一半10 分钟前
PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
前端·javascript·vue.js
@蒙面大虾14 分钟前
CSS综合练习——懒羊羊网页设计
前端·css
MarcoPage27 分钟前
第十九课 Vue组件中的方法
前端·javascript·vue.js
.net开发29 分钟前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
**之火1 小时前
Web Components 是什么
前端·web components
顾菁寒1 小时前
WEB第二次作业
前端·css·html
前端宝哥1 小时前
10 个超赞的开发者工具,助你轻松提升效率
前端·程序员
你好龙卷风!!!1 小时前
vue3 怎么判断数据列是否包某一列名
前端·javascript·vue.js
兔老大的胡萝卜2 小时前
threejs 数字孪生,制作3d炫酷网页
前端·3d
齐 飞3 小时前
MongoDB笔记02-MongoDB基本常用命令
前端·数据库·笔记·后端·mongodb