自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 使用typescript实现游戏中的JPS跳点寻路算法

JPS是一种优化A*算法的路径规划算法,主要用于网格地图,通过跳过不必要的节点来提高搜索效率。它利用路径的对称性,只扩展特定的“跳点”,从而减少计算量。deepseek生成的总是无法完整运行,因此决定手写一下。需要根据父节点方向进行方向剪枝,避免不必要的检查。:对角线移动使用√2成本,直线移动使用1单位成本。方法是算法核心,需要完整实现强制邻居检查逻辑。:使用适合网格移动的切比雪夫距离。

2025-04-03 23:31:38 213

原创 go游戏后端开发25:红中麻将规则介绍

在开发红中麻将游戏之前,我们需要先了解其基础规则。红中麻将的牌面由 a、b、c、d 四种花色组成,其中 a、b、c 分别代表万、条、筒,每种花色都有 1 - 9 的九种牌,每种牌各有四张,总计 36 张 × 4 = 144 张牌。而 d 花色则只包含红中牌,数量可由游戏规则设定为 4 张或 8 张。牌型方面,玩家需通过摸牌、打牌等操作,组合出特定牌型来胡牌。常见的牌型包括顺子(如 123 万)、刻子(如 333 条)、对子(两张相同的牌)等。

2025-04-03 16:02:55 680

原创 go游戏后端开发24:写完赢三张游戏

下分完成后,系统会向所有玩家推送当前各玩家的下分情况,包括每个座位的下分金额、当前座位的总下分金额以及所有座位的总下分金额。玩家点击“比牌”按钮后,系统会比较双方的牌面大小,根据比较结果判定输赢,并向所有玩家推送比牌结果。玩家点击“弃牌”按钮后,系统判定该玩家输掉当前局游戏,并向所有玩家推送弃牌信息。:下分完成后,系统向所有玩家推送当前的下分情况,包括每个座位的下分金额、当前座位的总下分金额以及所有座位的总下分金额。:下分完成后,游戏轮次推进到下一个玩家,系统推送当前轮次信息和下一个玩家的操作提示。

2025-04-03 13:32:59 478

原创 go游戏后端开发23:赢三张游戏逻辑

例如,一个房间最多可容纳6人,当玩家进入房间时,系统会根据当前房间内的空位情况,为玩家分配一个座位号,从0号开始,依次递增。在分配座位号的过程中,我们需要确保线程安全,避免多个玩家同时加入房间时出现座位号冲突的问题。然而,在游戏过程中,可能会出现玩家离开房间的情况,这会导致座位号出现空缺。当玩家加入房间时,系统会调用该函数,检查当前房间内的座位占用情况,并为玩家分配一个空闲的座位号。:玩家根据自己的牌面情况,选择下分的金额。:推送游戏的当前状态,例如“发牌中”“下分中”等,以便玩家了解游戏的进度。

2025-04-02 14:01:35 426

原创 go游戏后端开发22:游戏房间功能

新玩家加入后,服务器更新房间内玩家列表,将新玩家信息推送给房间内所有玩家,同时将房间内已有游戏相关信息(如当前游戏阶段、其他玩家准备状态等)推送给新加入玩家,实现信息同步。:客户端收到通知后,解析数据包,提取游戏类型等信息,在界面上显示相关提示,如“您已进入房间,当前游戏类型为[具体类型]”,并根据游戏类型加载相应资源,为进入游戏做好准备。当玩家创建房间或加入房间时,系统需通知该玩家进入房间,同时告知其房间内当前的游戏类型等关键信息,以便玩家知晓并进行后续操作,如准备游戏等。若玩家准备,取消定时任务;

2025-04-01 19:15:01 725

原创 go游戏后端开发21:处理nats消息

在 WebSocket 的管理模块中,我们之前已经处理了一些消息。这些消息通过 NATS 订阅过来,我们需要对这些消息进行进一步的处理。一旦消息到达,我们需要执行相应的操作,并将结果发送回去,包括之前的操作。理论上,所有消息都应该能够到达这里进行处理。目前,我们还没有对这部分进行处理,接下来需要完善这部分逻辑。

2025-04-01 14:21:05 797

原创 go游戏后端开发20:房间消息推送处理

主要步骤包括接收参数、查询用户信息、创建房间、生成房间号以及将房间号和游戏类型推送给客户端。我们需要创建一个名为“Union”的管理类,用来管理联盟。房间关联一个具体的游戏。在这个基础上,我们可以创建一个接口,通过这个接口实现多种不同的游戏。为键,以联盟的代理为值,构建一个联盟信息的映射。一个联盟下可能有多个房间,每个房间有一个房间号作为标识。一个联盟下可能挂载多个房间,这是我们的第一个概念。在编写创建房间的逻辑之前,我们需要先创建几个关键概念。:根据解析出的参数和用户信息,创建房间并生成房间号。

2025-03-31 20:03:50 525

原创 go游戏后端开发19:创建房间

在正式开发赢三张游戏之前,我们先来了解一下它的基础玩法,这样在开发过程中就能明白我们正在做的事情。赢三张的基本规则其实很简单,主要是比大小。牌库由除大小王之外的52张牌组成,每个人随机发三张牌,通过比大小来决定胜负。三张牌会有不同的组合形式。例如“单牌”,即三张牌各不相同,既不连续,花色也不同。比较单牌时,先从最大的牌开始比,谁的大谁就赢。“对子”是指两张牌的点数相同,比如两张8。对子的牌型一定大于单牌。如果双方都是对子,则按照对子的规则进行比较。“顺子”是指花色不同但点数相连的三张牌。

2025-03-31 18:59:32 958

原创 go游戏后端开发18:用户接入

在models// UpdateUserAddressRequest 定义更新用户地址的请求参数// UpdateUserAddressResponse 定义更新用户地址的响应参数// Address 定义地址信息。

2025-03-28 17:39:23 243

原创 go游戏后端开发17: node节点搭建

中,我们同样需要集成 NATS 客户端,用于接收和发送消息。我们为 NATS 客户端定义了两个通道(在搭建游戏服务节点(Node)时,我们需要实现一个工作节点,用于处理实际的游戏逻辑。服务不同,它不涉及 WebSocket 的管理,而是作为 NATS 的客户端,处理游戏逻辑。中,我们需要处理接收到的消息,并根据路由信息调用相应的处理器。中,我们需要实现具体的业务逻辑。),用于实现具体的业务逻辑。:用于处理默认逻辑或配置选项。类似,但功能上有所不同。,它包含一个应用程序(:用于接收和发送消息。

2025-03-27 14:55:26 290

原创 go游戏后端开发16: connector服务构建nats远程调用

在项目中创建一个remote目录,用于存放远程调用相关的代码。在remote。

2025-03-26 18:33:13 338

原创 go游戏后端开发15: 进入游戏接口实现

在// EntryRequest 定义进入游戏请求的参数结构Token string `json:"token"` // 用户的TOKENName string `json:"name"` // 用户昵称Avatar string `json:"avatar"` // 用户头像Gender int `json:"gender"` // 用户性别。

2025-03-26 17:25:18 263

原创 go游戏后端开发14: websocket本地消息处理

启动完成后,我们打开前端页面并清理了缓存。清理完成后,连接被断开,我们需要重新登录。点击微信登录后,前端发起了请求,但服务器返回了一个rest错误。看起来注册流程并未完成,程序在某个地方挂掉了。我们检查了日志,但没有发现具体的错误位置。暂时先不管这个问题,我们重新启动了服务。这可能是一个潜在的问题,但目前没有明确的错误指向。接下来,我们启动了网关服务。重新刷新页面后,我们再次点击登录按钮。登录成功后,我们收到了一个TOKEN和对应的Connector地址,随后进行了 WebSocket 连接。

2025-03-26 15:09:46 727

原创 go游戏后端开发13: websocket读写消息处理

在实际开发中,我们还需要通过命令行参数动态设置服务器 ID,而不是写死在代码中。我们还需要判断客户端是否仍然存在,如果不存在,则关闭连接并从列表中移除。如果读取消息失败,我们发送一个关闭消息通知客户端连接已关闭,并记录日志。通过这些步骤,我们可以实现一个基本的 WebSocket 通信框架,支持客户端和服务端的消息交互。在写消息时,我们同样需要处理消息类型和内容,确保消息以二进制形式发送。而当我们需要给客户端发送消息时,我们通过。如果消息类型不符合预期,我们打印错误信息,提示不支持该消息类型。

2025-03-26 14:02:20 285

原创 go游戏后端开发12:websocket管理器

当收到消息时,根据消息的类型进行相应的处理。每个连接的客户端都有一个唯一的标识符(CID),我们通过这个标识符来区分不同的客户端,并将它们存储在一个管理器中,方便后续的操作。为了提高代码的可读性和可维护性,我们将 WebSocket 的连接和消息处理逻辑封装成一个独立的类。我们的目标是创建一个高效且易于管理的连接组件,将其整合到框架中,方便后续的使用和扩展。通过 WebSocket 的 API,建立与服务器的连接,并设置相关的回调函数,以便在连接建立、消息接收和连接关闭时执行相应的操作。

2025-03-25 17:34:48 802

原创 go游戏后端开发11: 游戏框架开发说明

在编写过程中,我们不会直接编写框架,而是在编写服务的过程中,将涉及通信的部分内容抽象出来,变成框架的一部分。游戏服务器处理完成后,我们会将消息发送给 Websocket,Websocket 接收到后进行处理,然后根据协议进行编码,最后发送给客户端。整个流程就是这样:客户端连接到 Connect 组件,通过 Websocket 管理器接收数据,根据路由信息将数据发送到对应的游戏服务器,游戏服务器处理完成后,数据通过 Websocket 返回给客户端。大家要明白这个流程,首先搞清楚流程后,我们再开始编写代码。

2025-03-24 14:36:27 349

原创 go游戏后端开发10:实现注册功能

其中,头部定义了加密算法,载荷用于存储数据(如用户 ID),签名用于验证令牌的合法性。在实现过程中,我们需要注意不要在载荷中存储敏感数据,只需要存储用户 ID(UID)即可。我们将用户实体存入数据库后,通过 Redis 生成一个自增的数字序列作为用户的唯一 ID,并将其返回给前端。在这个过程中,我们使用 MongoDB 作为数据库,并通过一个分布式 ID 生成器(如 MongoDB 的。时,我们需要提供一个密钥(Secret Key),这个密钥用于加密和签名。在注册过程中,我们还需要处理用户输入的参数。

2025-03-21 18:51:59 335

原创 go游戏后端开发9:etcd解析器实现

例如,我们可以实现一个定时同步机制,每隔一分钟同步一次数据,以确保信息的最新性。我们还可以监听 ETCD 的事件,如节点的添加或删除,并触发相应的操作。我们可以在代码中找到相关的配置选项,并将其复制到合适的位置。最后,我们还需要实现一个关闭操作,用于在连接关闭时清理资源。调用时传递的内容,就是我们需要处理的信息。在编写解析器的过程中,主要的实现是在 gRPC 中的一个名为。是带有前缀的,因此我们进行的是前缀查找,而不是精确查找。模块中,我们创建一个自己的结构体,用于执行相应操作。是我们在配置中设置的。

2025-03-21 14:11:00 377

原创 go游戏后端开发8:grpc客户端构建

在实现业务逻辑时,我们需要注意,我们的服务类需要实现 proto 文件中定义的接口。生成的代码中包含了服务端和客户端的相关代码,这些代码是我们后续实现功能的基础。在初始化时,我们需要指定服务的地址,这个地址可以通过 ETCD 获取。这个目录是我们指定的生成代码的存放位置,同时,生成的 Go 代码的包名(package)也命名为。实现完成后,我们可以在服务类中打印一些日志信息,以便在调用时能够看到服务是否被正确调用。至于服务地址,为了简单起见,我们暂时直接返回一个固定的地址,后续再逐步实现负载均衡等功能。

2025-03-20 19:12:36 921

原创 go游戏后端开发7:gate服务

因此,请求的入口是网关,我们需要先搭建网关的请求流程,建立完整的链路。etcd是必不可少的,我们通过etcd的地址来找到对应的用户服务。当然,在配置时,我们也可以根据需求配置一些策略,比如随机返回地址,或者将地址注册到etcd中,以便根据策略进行选择。在代码编写过程中,我们需要加载配置文件。服务中,我们不会启用服务端,也不会进行注册操作,但仍然需要初始化相关的库。我们将配置文件复制到程序中,虽然有些部分暂时用不到,但主要会用到与网关相关的配置。服务的相关代码复制过来,并进行必要的修改,比如将导入的包从。

2025-03-19 14:36:45 144

原创 go游戏后端开发6:数据库

接下来,我们开始实现我们的功能。我们使用的数据库是Mongo,同时在注册时,由于需要生成前端所需的唯一ID,我们还需要接入Redis,利用其自增功能来保证ID的唯一性。在Mongo的配置中,我们有一个URL,用于连接Mongo地址。创建连接池之后,我们需要将对应的连接管理操作注入到对应的GRPC service中,以便后续使用。封装的好处在于,我们可以在此基础上添加自己的方法,以便根据项目需求进行更便捷的操作。在代码中,我们可以创建一个统一的管理器,将Mongo和Redis的管理器统一管理起来。

2025-03-19 14:17:47 323

原创 go游戏后端开发5

接下来,我们将实现 ETCD 注册中心,用于将 GRPC 服务注册到 ETCD 中,并通过心跳机制保持服务状态。这样,客户端可以通过 ETCD 获取服务地址,实现动态负载均衡。配置文件中包含 ETCD 的地址和服务信息(如名称、地址、版本、权重等)。注册服务:将服务信息(如名称、地址、版本、权重等)注册到 ETCD。:在网关中集成 ETCD 客户端,实现服务发现和负载均衡。:实现客户端从 ETCD 获取服务地址的逻辑。中初始化 ETCD 注册中心,并注册服务。撤销租约,清理服务信息。

2025-03-18 19:07:30 235

原创 go游戏后端开发4

在前面的步骤中,我们已经完成了 User 服务的基本开发,包括加载配置文件、启动监控和 GRPC 服务。接下来,我们需要进一步完善服务,包括实现日志功能。日志功能对于服务的调试和运维至关重要。我们需要一个支持彩色日志的库,以便区分不同级别的日志(如。为了方便使用,我们将日志功能封装到一个单独的模块中。,它支持彩色日志输出,方便我们区分日志级别。我们选择使用开源日志库。文件,实现日志初始化和封装。的目录,并在其中创建。在代码中,可以直接使用。

2025-03-18 18:39:32 162

原创 go游戏后端开发3

通过以上步骤,我们完成了User 服务的基础开发:加载配置文件。启动监控服务。启动 GRPC 服务,并实现优雅启停。接下来,我们可以继续完善User 服务的业务逻辑,如微信登录、账号注册等。

2025-03-18 17:28:33 344

原创 go游戏后端开发2

这是用户模块,用于处理用户相关的业务逻辑,如登录、注册、积分、充值等 HTTP 业务。用户登录后,首先会进入大厅页面,因此大厅相关的功能将集中在此模块中。接下来,我们就可以进入具体的开发环节,开始编写代码。例如,开发麻将或扑克等游戏时,相关逻辑将写入此模块。这是核心模块,主要用于存放数据库操作和业务逻辑相关的代码。我们根据路由信息将请求转发到对应的业务处理模块,并执行相应的业务逻辑。中,完成整个项目的组织。模块中,其他模块可以直接调用,而无需重复编写代码。,因为它主要用于存放配置文件,而不是代码模块。

2025-03-18 17:03:18 278

原创 go游戏后端开发1

Go Work 的组织方式允许我们将多个模块放在一个目录下,而不需要放在同一个 Go Module 下,这种方式类似于 Java 等语言的模块化开发,非常方便。它主要管理用户连接,将请求转发到游戏服务器,并通过它中转所有请求数据,最终返回给客户端。的方式组织,这种方式是 Go 1.18 版本引入的新功能,非常方便模块化开发。这不是一个 Go 模块,而是一个普通目录,用于存放配置文件,如游戏相关配置文件等。这是网关模块,主要负责转发客户端的 HTTP 请求,并返回连接地址。地址,大家可以自行学习。

2025-03-18 16:57:40 396

原创 THREEJS中用shader实现边框效果,附代码

首先需要对mesh的geometry加上一个新的attribute——center,这里 是根据法线来计算的,原理是当相邻的法线间角度太大,就代表这里有一个硬的边框。这里通过之前添加的vCenter属性,计算边框的位置。

2023-05-16 18:27:29 1174 1

原创 THREEJS中的屏幕空间LOD(Screen-Space LOD)的技术研究

在这个示例中,我们创建了一个辅助帧缓冲区(Framebuffer)用于渲染,并根据相机与立方体之间的距离动态调整其尺寸。随着距离的增加,渲染目标的尺寸会减小,从而降低渲染负担。最后,我们使用一个全屏四边形(Quad)将渲染目标的纹理渲染到屏幕上。这里没有涉及自定义着色器,仅使用了Three.js提供的基础材质。需要注意的是,这个示例仅适用于简单场景。对于更复杂的场景,可以考虑将自定义着色器与屏幕空间LOD技术结合使用。

2023-04-24 15:19:31 458 1

原创 THREEJS中的SAOShader阴影计算

SAO(Scalable Ambient Obscurance):可扩展环境光遮蔽是一种改进的环境光遮蔽技术,它在保持性能的同时,生成更精确和连续的阴影效果。SAO 采用一种基于深度缓冲区的近似算法,可以在不同的场景和分辨率下保持高质量的阴影效果。然而,SAO 相对于 SSAO 更复杂,可能需要更多的计算资源。

2023-04-23 15:12:57 569 1

原创 THREEJS中的SSAOShader阴影计算

需要注意的是,深度值在 [0, 1] 范围内的分布通常是非线性的,这意味着距离相机较近的像素深度值变化较大,而距离相机较远的像素深度值变化较小。这是一个GLSL函数,用于将屏幕空间中的点(screenPosition 和 depth)转换为视图空间中的位置(三维坐标)。视口空间考虑了摄像机的近裁剪面(cameraNear)和远裁剪面(cameraFar),它将裁剪空间中的坐标映射到一个可见的 3D 场景范围。视图空间是将场景中的物体变换到摄像机坐标系中的空间,因此 Z 坐标表示物体距离摄像机的距离。

2023-04-21 14:47:52 683 1

原创 THREEjs中的定点着色器

什么是着色器着色器是用 GLSL 编写的程序,发送到 GPU。它们用于定位几何体的每个顶点并为几何体的每个可见像素着色。术语“像素”并不准确,因为渲染中的每个点并不一定与屏幕的每个像素相匹配,这就是为什么我们用“片段”这个词的原因。顶点着色器顶点着色器的目的是确定几何体的顶点位置。我们需要发送顶点位置、网格变换(如位置、旋转和缩放)、相机信息(如位置、旋转和视野)。然后,GPU 将遵循顶点着色器中的指令来处理所有这些信息,以便将顶点投影到一个 2D 空间,也就是我们的渲染器——换句话

2023-04-20 10:48:22 485 2

ke模拟器,手机模拟

yuandaima,ke手机模拟器,发ichangbucuo1

2011-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除