用“qwer”打造类似梦幻西游中比巧克力还丝滑的状态机

news2024/12/28 5:01:38

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

请往下看

引言

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

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

梦幻西游是流量密码吗?本文不讲它

一起来看

在游戏开发中,通常用状态机来管理游戏对象的各种状态和行为。状态机模型包括一组有限的状态、状态之间的转换规则以及与每个状态相关的操作。其中核心的设计模式是状态模式

本文将介绍如何在游戏开发中运用状态模式来实现玩家动作的状态机

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

什么是状态模式?

状态模式是一种行为型设计模式,它用于管理对象在内部状态发生变化时如何改变其行为。状态模式的主要思想是将不同状态封装成单独的类,使对象可以动态地切换状态,同时保持其接口一致性。这有助于减少条件语句的使用,提高代码的可读性和可维护性

在游戏开发中,状态模式常常用于管理游戏对象的状态,例如玩家角色的状态(站立、行走、奔跑、攻击等),NPC的状态,或者游戏关卡的状态。

下面我们来看下如何用状态模式实现玩家动作的状态机

一起来实现玩家动作的状态机

我们根据以下的步骤简单地通过状态模式实现一下玩家动作的状态机:

1.状态接口

首先声明一个状态接口IPlayerState,它包含状态的进入enter、状态的退出exit以及状态的更新update

还是要听我的

2.角色状态

定义不同的角色状态,并且在进入状态之后通过FrameAnim组件去播放不同的动画。

待机状态和移动状态:

待机、移动

攻击状态和死亡状态:

攻击、死亡

3.动画组件

简单敲一个帧动画的动画组件。

(杀鸡焉用牛刀!?)

初始化加载一下配置,包括帧动画的图片和帧动画配置

起因

写一个播放的接口DoFrameAnim去播放指定的动作,包含动作的方向和是否循环。

经过

最后通过update去更新角色的帧动画。

结果

4.准备资源

把珍藏在云盘的82年的资源拿出来。

包括一张包含着角色基本动作的图片,可以看出来是个漂亮的小女孩。

降龙十八掌,掌掌有爷名

以及控制动画的核心配置数据。

武功秘诀

5.测试代码

首先我们还是要利用一下Cocos的Logo,并且通过cc.SystemEvent.EventType.KEY_DOWN事件监听我们的键盘事件。

受伤的还是我

然后分别监听qwer,来控制角色进入待机、移动、攻击、死亡状态。

qwer一顿输出

对应的状态切换接口。

复制粘贴我最在行

6.结果演示

通过qwer,来控制角色进入待机、移动、攻击、死亡状态。

还是玉足

成功实现玩家动作的状态机。

能跑就行,非常丝滑

结语

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

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

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

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

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

推荐专栏:

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

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

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

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

点击下方绿色按钮+关注

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

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

相关文章

Trace 在多线程异步体系下传递最佳实践

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

Sui特性将推动下一波游戏大发展

随着游戏行业的竞争日益激烈&#xff0c;区块链技术为游戏工作室提供了必要的优势&#xff0c;以保持观众对他们的兴趣。实际上&#xff0c;区块链技术可能是未来游戏设计中最令人愉快和吸引人的关键。游戏在深入探索世界方面表现很棒&#xff0c;它们通过视觉、叙事和社区建设…

Scala入门到放弃—02—函数

文章目录 函数方法定义默认参数命名参数可变参数条件语句循环表达式 函数 方法定义 def 方法名(参数: 参数类型): 返回值类型 {//方法体//最后一行作为返回值(不需要使用return) } def max(x: Int, y: Int): Int {if(x > y)xelse y }package org.example object App {de…

C++ 模板的编译链接讨论

//头文件 #ifndef Test_h__ #define Test_h__ template<class T> class Test1 { public: static T Add(const T& x, const T& y); }; #endif // Test_h__ //cpp文件 #include "Test.h" template<class T> T Test1<T>::Add(const …

Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径

Qt 使用QNetworkReply或者URLDownloadToFile两种不同方式下载http、https链接资源文件&#xff0c;并且获取下载进度。 目录 一、 使用 URLDownloadToFile 下载二、 使用 QNetworkReply 下载三、 打包好的可执行程序示例下载四、 会员或订阅专栏下载源码 一、 使用 URLDownload…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

【算法训练-动态规划 二】【线性DP问题】最长递增子序列

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

跨境电商:经济合作新引擎,技术赋能新亮点

随着数字化浪潮席卷全球&#xff0c;跨境电商正蓬勃发展&#xff0c;成为中国外贸高质量发展的新引擎。中国的跨境电商行业在"买全球、卖全球"方面正经历着显著的增长&#xff0c;延展出新的商业生态&#xff0c;以技术创新和国际合作为支撑&#xff0c;促进了中国制…

Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)

Linux中的shell外壳与权限[包含目录文件的权限,粘滞位的来龙去脉] 一.shell外壳的理解1.为什么需要有shell外壳的存在?2.什么是shell外壳?3.shell外壳的运行原理是什么?4.shell和bash的关系 二.Linux中的用户权限1.用户分类与身份切换1.用户分类2.root用户切换为普通用户1.s…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

JSX 样式处理

学习目标&#xff1a; 能够在 JSX 中实现 CSS 样式处理  1. 行内样式 实现&#xff1a; 在元素身上绑定一个 style 样式   - 行内样式 style function APP(){return (<div className"App"><div style{{color:red,fontSize:10px}}>this is div</d…

Swagger基本使用

文章目录 1. 接口文档2. Open API3. Swagger 简介4. Springfox5. Swagger 基本用法6. Swagger-UI使用7. Swagger配置 1. 接口文档 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要&#xff0c;但是由于项目周期等…

MySQL数据同步到达梦数据库

1.服务器配置 达梦数据库的初始状态是不兼容其他任何数据库模式的&#xff0c;所以必须先设置系统的兼容性&#xff0c;从安装路径的tool文件夹中打开console工具&#xff08;DM控制台工具&#xff09;&#xff0c;设置兼容MySQL。 2.创建用户&#xff08;需要分配权限的操作&…

K8s 之 Helm 部署 MySQL 5.7

Author&#xff1a;rab 目录 一、环境二、部署2.1 安装 NFS2.2 安装 Helm2.3 安装 MySQL2.3.1 创建 Namespace2.3.2 创建 PV2.3.3 配置 MySQL2.3.4 部署 MySQL 2.4 MySQL 可用性验证 小结 一、环境 # K8s版本 v1.23.6# Docker版本 v20.10.20# Helm版本 v3.10.3# NFS v4说明&am…

建筑能源管理(6)——建筑能源监管

中国建筑(公共机构)能耗的总量逐年上升&#xff0c;在能源总消费量中所占的比例已从20世纪70年代末的10%&#xff0c;上升到近年的超过30%。2006年&#xff0c;《中华人民共和国国民经济和社会发展第十一个五年规划纲要》提出了“十一五”期间单位国内生产总值能耗降低20%左右&…

SocketBase类库

SocketBase类库主要是方便创建Socket客户端和Socket服务端的基础实现。 抽象基类&#xff1a;主要实现创建Socket public abstract class NetworkBase{} 通用基类&#xff1a;指定了消息的解析规则&#xff0c;指定了数据转换的规则 的基本实现 /// <summary>/// 支持长…

Flume基本使用--mysql数据输出

MySQL数据输出 在MySQL中建立数据库school&#xff0c;在数据库中建立表student。SQL语句如下&#xff1a; create database school; use school; create table student(id int not null,name varchar(40),age int,grade int,primary key(id) ); 请使用Flume实时捕…

SQL sever中的函数(基础)

目录 一、聚合函数 1.1聚合函数概述 1.2SUM(求和)函数 1.3AVG(平均值)函数 1.4MIN(最小值)函数 1.5MAX(最大值)函数 1.6COUNT(统计)函数 1.6.1COUNT函数用法分类 1.6.2COUNT函数用法示例 1.7DISTINCT(取不重复记录)函数 1.8查询重复记录 二、数学函数 2.1数学函数…

【Java小知识点】类加载器的区别

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Java类加载器的区别&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1faf…

TDengine(taos)数据库导出历史数据

业务需求&#xff1a;导出某个站点的累计充电量&#xff0c;累计放电量&#xff0c;光伏总放电量&#xff0c;进线总功率的所有数据‘ 1、登录taos&#xff0c;使用存数据的库&#xff1b; 提示Database changed&#xff1b;即为使用成功&#xff1b; 2、找到你想要导出的字段…