首页 文章 精选 留言 我的

精选列表

搜索[游戏],共9336篇文章
优秀的个人博客,低调大师

疯狂ios讲义疯狂连载之实现游戏逻辑(2)

13.6.5定义获取通道的工具方法 这里所谓的通道指的是一个方块上、下、左、右4个方向上的空白方块图13.10显示了一个方块四周的通道。 图13.10方块四周的通道 下面是获取某个坐标点四周通道的4个方法。 程序清单codes/13/Link/Link/sources/board/FKGameService.m 13.6.6没有转折点的横向连接 如果两个FKPiece在FKPiece二维数组中的第二维索引值相等那么这两个FKPiece就位于同一行如前面的linkWithBeginPiece:endPiece:方法中①号代码所示此时程序需要调用isXBlockFromP1: toP2:pieceWidth:判断p1、p2之间是否有障碍。下面是该方法的代码。 程序清单codes/13/Link/Link/sources/board/FKGameService.m 从上面的判断可以看出如果两个方块位于同一行且它们之间没有障碍那么这两个方块就可以消除两个方块的连接信息就是它们的中心。 13.6.7没有转折点的纵向连接 与之相似的是如果两个FKPiece在FKPiece二维数组中的第一维索引值相等那么这两个FKPiece就位于同一列如前面的linkWithBeginPiece:endPiece:方法中②号代码所示此时程序需要调用isYBlockFromP1: toP2:pieceHeight:方法判断p1、p2之间是否有障碍。下面是该方法的代码。 程序清单codes/13/Link/Link/sources/board/FKGameService.m 13.6.8一个转折点的连接 对于两个方块的连接线上只有一个转折点的情况程序需要先找到这个转折点。为了找到这个转折点程序定义遍历两个通道并获取它们交点的一个方法。 程序清单codes/13/Link/Link/sources/board/FKGameService.m 为了找出两个方块连接线上的连接点程序同样需要分析p1、p2两个点的位置分布。根据前面的分析我们知道p2要么位于p1的右上角要么位于p1的右下角。 注意 对于p2位于p1的左上角和左下角的情况只要把p1、p2交换即可。 对于p2位于p1的右上角的情形如图13.11所示。 从图13.11可以看出当p2位于p1的右上角时应该计算p1的左通道与p2的向下通道是否有交点p1的向上通道与p2的向左通道是否有交点。 对于p2位于p1的右下角的情形如图13.12所示。 从图13.12可以看出当p2位于p1的右上角时应该计算p1的向右通道与p2的向上通道是否有交点p1的向下通道与p2的向左通道是否有交点。 图13.11p2位于p1的右上角 图13.12p2位于p1的右下角 考虑到p1与p2具有上面两种分布情形程序提供了如下方法进行处理。 程序清单codes/13/Link/Link/sources/board/FKGameService.m 上面的两行粗体字代码分别处理了p2位于p1的右上和右下的两种情形。 程序中用到了isLeftUp、isLeftDown、isRightUp、isRightDown方法来判断p2位于p1的左上、左下、右上、右下4种情形这4个方法的实现比较简单只要对它们的X、Y坐标进行简单判断即可代码如下。 程序清单codes/13/Link/Link/sources/board/FKGameService.m ——————本文节选自《疯狂ios讲义上》 本文转自 fkJava李刚51CTO博客,原文链接:http://blog.51cto.com/javaligang/1360987,如需转载请自行联系原作者

优秀的个人博客,低调大师

online游戏服务器架构--业务处理架构

除了网络架构,业务逻辑的处理更加复杂,为了保证实时性,在处理业务逻辑的时候尽量少用搜索技术,而应该用空间换时间,静态数组是不错的选择,业务逻辑的处理架构其实就是消息映射服务器,通过POST_MSG注册一个回调函数,这个回调函数就是处理具体的业务逻辑的,业务逻辑由协议实现,就是两端商量好的约定俗成的东西: #define POST_MSG(n,h) if (dispatch[n]) { return -1; } else dispatch[n] = (dispatcher_t)h Shm_push将业务数据从父进程压入对应子进程的共享内存当中,父进程对数据一无所知,然后子进程从shm_pop开始处理历程,其实就是在net_loop中的handle_recv_queue中调用的shm_pop,这是个循环处理的过程。一个switch开关将pop出来的数据进程分类,大致上分成了关闭包,数据包等等,如果是数据包的话就要进入handle_process的流程: int handle_process(uint8_t* recvbuf, int rcvlen, int fd, int is_conn) { int err = 0; sprite_t* p; if (is_conn) { fdsession_t* fdsess = get_fdsess(fd); if (fdsess) { fdsess->last_tm = now.tv_sec; if ( (err = parse_protocol(recvbuf, rcvlen, fdsess)) ) shm_ctl_block_push(&(config_cache.bc_elem->sendq), fd, FIN_BLOCK, 1); } } else { //如果是子进程的话,由于它要和数据库代理服务器进行交互,所以也要处理网络连接 if ( (err = worker_handle_net(fd, recvbuf, rcvlen, &p)) && p ) del_sprite_conn(p, 1); } return 0; } parse_protocol是核心的调用,在经过一些错误判断和处理后直接将处理流路由到dispatch_protocol函数,在说这个函数之前,有一点要注意,在parse_protocol中会从数据头得到一个session,从这个session中可以得到用户的ID,由于所有的登录用户都会由一个叫做sprite_t的解构体表征,而且只要登录后没有退出的时间段里,这个结构体一直都在,系统会将这些结构体放到一个hash中,这个hash的索引其实就是父进程接收的客户端连接的套接字描述符,由于所有的套接字描述符都在父进程处理,因此它们都是唯一的。等到parse_protocol中调用get_sprite_by_fd将之取出,由于是一个: sprite_t* get_sprite_by_fd(int fd) { sprite_t* p = g_hash_table_lookup(all_sprites, &fd); if ( !p || IS_NPC_ID(p->id) ) { return 0; } return p; } 如果说hash是通过fd来唯一索引的原因是因为父进程中套接字连接描述符的唯一性,那么子进程本身也要处理网络连接,比如和数据库代理服务器以及心跳服务器的连接,并且子进程的网络业务处理逻辑和父进程放入共享内存的数据的处理逻辑使用一套框架,如果这些网络连接描述符也加入到hash的话,势必会引起冲突,毕竟父子进程的描述符不必唯一。解决办法就是将请求发往数据库代理服务器的时候连同这个请求的发起者的客户端实体也一并发过去,这样在数据库代理的应答包当中就可以方便的取出原来的客户端实体,这里是用客户端的套结字描述符来作为客户实体标示的,在数据库的应答包当中可以取出来这个描述符fd,然后同样调用get_sprite_by_fd就可以取出关于这个请求的客户端的sprite_t。 总的来说,dispatch_protocol之前的处理逻辑都是和业务协议无关的,仅仅是数据本身以及用户会话实体方面的处理,接下来就是dispatch_protocol了,这个函数里面就开始了特定用户实体的业务协议相关的处理流程了,这个函数最终调用err = dispatch[cmd](p, body, len);,看看dispatch数组: dispatcher_t dispatch[MAX_PROC_MSG_NUM]; 刚才说到的POST_MSG宏的含义就是注册这些回调函数,这个dispatch_protocol函数可以解析数据包的协议类型,然后将请求路由到正确的处理函数中,以一个例子说明,比如一个报名协议的处理函数是race_sign_cmd: int race_sign_cmd(sprite_t* p, const uint8_t* body, int bodylen) { return send_request_to_db(SVR_PROTO_RACE_SIGN, p, 0, NULL, p->id); } 这个协议没有数据体,仅仅是一个头部,由于在online端无法处理这个和数据相关的请求,下一步就需要将请求进一步转发给数据库代理服务器,也就是send_request_to_db调用。以下就是数据层的处理了,如果online子进程可以处理客户端的清求,那么就会直接返回处理结果,这样就不需要进入数据层了,处理逻辑会朝着刚才说的相反的方向返回,如果进入数据层的话,就有点复杂了。 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274106

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册