你知道在游戏开发中怎么将算法与其作用的对象隔离开来吗?

news2024/11/25 6:59:38

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

杀青了杀青了

引言

你可能知道的设计模式-访问者模式

大家好,今天我们要来聊一聊在游戏开发中非常实用的设计模式——访问者模式。访问者模式是一种将算法与对象结构分离的软件设计模式,它可以让代码更加灵活、可扩展,同时也提高了代码的可读性和可维护性。有什么用?让以后的你或者别人看了你现在的代码不头疼。那么,访问者模式在游戏开发中是如何应用的呢?接下来就让我们一起探讨一下

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

什么是访问者模式?

嗯,还是两个Logo

访问者模式(Visitor Pattern)是一种将算法与对象结构分离的软件设计模式。在这种模式中,我们创建一个表示对象的接口,让具体的类实现这个接口,然后定义一个访问具体对象的访问者类,让它能够调用实现接口的具体类中的方法。这样,当需要修改算法时,只需要修改访问者类,而不需要修改具体类的结构。

访问者模式的优点

优秀的人总有很多优点

访问者模式有以下几个优点:

  • 封装了对象的操作和算法,使得它们可以独立于使用它的客户而变化。
  • 增加了新的操作很容易,因为新的定义可以被添加到现有的类中,而不需要修改这些类。
  • 降低了系统的耦合度,使得系统更具有可扩展性
  • 符合面向对象设计原则,将算法与对象结构分离,提高代码的可读性和可维护性

访问者模式在游戏开发中的应用

那应用可就多了

在游戏开发中,访问者模式可以应用于以下几个方面:

  • AI行为系统:游戏中的角色通常有很多行为,如移动、攻击、防御等。我们可以将这些行为封装成不同的类,然后通过访问者模式来组合这些行为,实现角色的AI行为。
  • 游戏事件处理:游戏中的事件处理通常涉及到多个对象之间的交互。通过访问者模式,我们可以将事件处理的逻辑封装在一个访问者类中,从而简化事件处理的代码。
  • 游戏资源管理:游戏中的资源管理通常涉及到多个对象的加载、卸载等操作。通过访问者模式,我们可以将资源管理的逻辑封装在一个访问者类中,从而简化资源管理的代码。

一起来使用访问者模式

下面是一个简单的访问者模式实现示例:

1.游戏对象

首先创建一个游戏对象类GameObject,它是不同游戏对象的基类,其中必须实现接受访问的方法accept,定义了动画组件,组件是FrameAnim序列帧动画组件,用于管理和播放角色的序列帧动画,大家可以通过文章《CocosCreator帧动画组件FrameAnim实现与使用》学习。

万物起源

2.具体游戏对象

然后我们实现两个具体的游戏对象,都实现访问者接口accept。在被访问者访问的时候进行攻击。

我是创造者

3.访问者

最后定义一下访问者接口,并且实现一个具体的访问者,去访问我们的游戏对象。

我是访问者

4.测试代码

首先我们又双叒叕创建2个游戏对象ConcreteGameObjectAConcreteGameObjectB,一左一右,添加"皮肤"。

能不能换点新意

然后分别给2个游戏对象添加一下点击事件,并且创建一个具体的访问者ConcreteVisitor,通过点击对应的游戏对象去访问他们。

终于要完结了

5.结果演示

当我们分别点击不同的游戏对象时,对象会进行皮肤的加载并且进行攻击。

设计模式最终章

在这个示例中,我们将游戏对象的访问算法(ConcreteVisitor类中的方法)与不同类型的游戏对象(ConcreteGameObjectAConcreteGameObjectB)分离开来。这使得我们能够轻松地为游戏对象和访问算法添加新操作,而不需要修改游戏对象的代码,保持了代码的可维护性和可扩展性。这正是访问者模式的强大之处

结语

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

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

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

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

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

推荐专栏:

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

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

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

关注我,发送"访问者模式"获取源码和源工程。

点击下方绿色按钮+关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1179624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.6区间估计、置信区间

已知总体方差 就是说,在总体里随机取样的时候,取样的均值服从总体的均值,方差为总体均值方差与样本量比值的正态分布,样本量越小,方差越大,样本量越大,方差越小,取样的样本均值浮动…

VMware ifconfig ip报错解决记录

1.报错 ifconfig后出现以下报错 lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 9216 b…

5.5逆波兰表达式求值(LC150-M)

算法&#xff1a; 其实就是后缀表达式。 本题中每一个子表达式要得出一个结果&#xff0c;然后拿这个结果再进行运算&#xff0c;那么这岂不就是一个相邻字符串消除的过程&#xff0c;和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了…

PostgreSQL JDBC连接详解(附DEMO)

PostgreSQL JDBC连接详解 PostgreSQL JDBC连接详解摘要引言1. JDBC基础1.1 JDBC简介1.2 JDBC驱动程序1.3 建立JDBC连接 2. 配置PostgreSQL JDBC连接2.1 PostgreSQL连接JDBC2.2 PostgreSQL连接JDBC是否成功2.3 PostgreSQL连接JDBC获取表信息注释等2.4 PostgreSQL连接JDBC根据表名…

Unity热更新那些事

目录 热更新方案Unity程序的两种编译方式编译阶段执行阶段Mono方式IL2CPP方式两种方式打包以后的项目目录结构 其他 ILRuntime热更新ILRuntime使用注意ILRuntime的实现原理ILRuntime的性能优化建议ILRuntime的性能优化建议 HybridCLR热更新 参考链接 Unity热更新那些事 一小时极…

关闭 win10自动更新、关闭激活

做工控或者数据大屏、服务器之类的,都不想系统自动更新,不知不觉自动重启类。 激活过了一段时间,又要重新激活这些事情,所以需要手工去关闭这些服务。 一、关闭 win10自动更新 首先打开 服务,找到windows update: window +R 输入:Services.msc 停止windows update ,然…

Python 海龟绘图基础教学教案(六)

Python 海龟绘图——第 9 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 综合应用&#xff0c;绘制长方形。 答案&#xff1a; 不使用循环。 Python 海龟绘图——第 10 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 综合命令使用。 答案&#xff1a; 使用循环…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候&#xff0c;需要对两张表进行…

【ES分词】

分词 #测试分词器 POST /_analyze {"text": "小米手机和华为手机都是国产mobilephone", "analyzer": "english" }不管analyzer是改成&#xff1a;standard还是chinese都无法实现中文分词。 处理中文分词一般采用IK分词器 安装链接&…

Mongoose 开源库--json 使用笔记

一、 json相关API mongoose 开源库可以使用json进行数据处理。 ①创建json字符串 // A helper macro for printing JSON: mg_snprintf(buf, len, "%m", MG_ESC("hi")) #define MG_ESC(str) mg_print_esc, 0, (str) char *mg_mprintf(const char *fmt, ...)…

银行项目网上支付接口调用测试实例详解

前言 公司最近有一个网站商城项目要开始开发了&#xff0c;这几天老板和几个同事一起开着需求会议&#xff0c;讨论了接下来的业务规划和需求策略&#xff0c;等技术需求一下来还要讨论技术需求&#xff0c;确认后再慢慢的进入开发阶段&#xff0c;趁着闲暇时间想总结一下进入…

【0基础学Java第七课】-- 类和对象02

7.类和对象02 7.6 封装7.6.1 封装的概念7.6.2 访问限定符7.6.3封装扩展之包a.包的概念b. 导入包中的类c. 自定义包d 常见的包 7.7 static 成员7.7.2 静态修饰成员变量7.7.4 static修饰成员方法7.7.5 static成员变量初始化 7.8 代码块7.8.1 代码块概念以及分类7.8.2 普通代码块7…

Linux个性化登录提示信息

在Linux系统中&#xff0c;您可以为每个用户登录后显示个性化的提示信息。这通常通过修改用户的shell配置文件来实现&#xff0c;这个文件通常是用户的.bashrc或.bash_profile文件。以下是一些示例步骤&#xff0c;来实现这个目标&#xff1a; 打开终端并登录到Linux系统。 使…

AI:64-基于深度学习的口罩佩戴检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

“2024上海智博会”为我国智能科技产业发展注入新的动力

作为开年智能科技第一展“2024上海智博会”将于2024年三月份在国际大都市上海隆重召开&#xff0c;本届展会将充分展示我国智能科技产业新技术、新产品及未来发展方向。 据悉&#xff0c;本届展会将汇聚全球智能科技产业的领军企业和人物&#xff0c;共同探讨和分享最新的技术趋…

Mysql8与mariadb的安装与常用设置

一、v10服务器mariadb的安装与常用设置 V10服务器默认安装了mariadb数据库。也可使用命令sudo yum install mariadb手动安装或升级默认安装的版本。 1.1 修改数据库密码 systemctl restart mariadb,重启mariadb服务&#xff1b;mysql -u root -p,要求输入密码直接回车&#…

贝叶斯建模:从先验合理性到后验分布

一、说明 本文探讨贝叶斯模型&#xff0c;首先用摸球游戏展开模型构建步骤&#xff0c;然后讨论分类算法&#xff0c;以及实际操作方法&#xff1a;网格法、二次近似、蒙特卡洛。 二、针对贝叶斯的模型构建 2.1 分支剪枝和假设 在贝叶斯分析中&#xff0c;我们可以将这个过程想…

【C++】多文件的代码规范

算是C嘎嘎入门教程(但至少需要知道HelloWorld怎么写 内容不能说全&#xff0c;因为是想到哪写到哪&#xff0c;再次就是C是真的很杂。 (写完后博文编辑器提示我&#xff0c;本文章可能要20分钟读完&#xff0c;做好心理准备… 1、头文件(*.h)、源文件(*.cpp&#xff09; 头文件…

bin.zip和bin.tar.gz以及src.zip和src.tar.gz以及rpm和dmg的区别

下载JDK时Java Downloads | Oracle会有很多文件&#xff0c;时间长了容易混淆&#xff0c;在此记录一下。 如上面三张图所示: bin代表二进制文件&#xff0c;是编译后的文件&#xff0c;而src是源码。.tar.gz是linux的压缩包&#xff0c;.zip是windows的压缩包 所以: bin.ta…

11.6哈夫曼树

创建哈夫曼树 经过这一步后&#xff0c;树的集合里就有n个叶子结点 不断从树集合里取出两个权重最小的树合并成一个新树&#xff0c;这时候就是两个根节点并成兄弟到一个新的根节点下&#xff0c;这个新的根节点的权重是两个兄弟的权重和&#xff0c;之后再把 每次合并的时…