客户端发送消息,统一在服务器端触发战斗
服务器端驱动战斗过程
客户端端接收用户输入向服务器发送消息
客户端接收服务器消息显示客户端表现
 
1. 服务器--客户端交互(战斗流程)
整战斗流程分为4个状态:战斗准备,战斗开始,战斗进行,战斗结束。其中战斗进行状态时服务器客户端可以进行两种交互,一种是服务器端定时器触发战斗循环,另一种是客户端玩家发送战斗操作。具体如下:
a. 战斗准备
 
b. 战斗开始
· 初始化战斗相关信息,即从基础信息模块中获得角色、阵型、属性,从战斗中获得战场
· 启动战斗实例的定时器,一个战斗实例用一个定时器。
· 在初始化战斗,特别是定时器的数据步骤中,需要根据属性建立战斗对象的出招队列。战斗对象可以在战斗实例定时器下排成队列一个接一个地调用。看策划需求,相较而言ARPG的野怪可以实现为每个野怪在该心跳下的一个定时器而非队列。
 
c. 战斗循环
· buff发生改变的情况包括:
1. buff定时失效 ,根据buff到达失效时间发送消息
2. buff定时扣血,根据扣血间隔发送buff改变消息
· 客户端接收到buff改变的消息后要在相应操作:
buff扣血 ,客户端播放扣血与buff的动画特效
buff失效,客户端停止播放buff的动画特效
· 获得出招队列首位角色的仇恨对象,如果该角色没有仇恨对象,就直线向前移动,并结束该次心跳
仇恨角色的选取:
1. 玩家指定(我自己设计)
2. 系统指派,系统以一定半径搜索角色周围
· 通过与仇恨对象的距离判断是否攻击
与仇恨对象距离过远,则朝向仇恨对象移动,并结束该次心跳
与仇恨对象距离可以发动攻击,检查攻击间隔
攻击间隔已到则朝对象发动攻击
攻击间隔未到则结束该次心跳
· 如果发动攻击,计算扣血
如果仇恨对象被攻击死亡,清空进攻角色的仇恨对象
 
d. 战斗操作
我自己设计了玩家在场景中拖拽部队选择其攻击对象的功能。
战斗操作只是更改战斗对象的一些数据,这些数据不会即时影响战斗循环,故不需要与战斗循环的心跳做同步。
 
e. 战斗结束
 
2. 服务器端战斗系统结构
CWarMgr是服务器的一个单例组件,负责管理服务器所有的战斗,包括创建战斗、向战斗实例派发消息、维持战斗心跳、结束战斗。
 
IWar是战斗实例的接口,派生出CWarPve,CWarPvpOnline,CWarPvpOffline三种实现类去处理三种不同的战斗。
IWar的创建应用了抽象工厂模式,由IWarCreator接口派生的实现类创建。
IWar包含了战斗双方的数据,由于服务器战斗循环以及客户端发起战斗操作(在更改战斗双方的数据时需要考虑多线程数据的同步,固客户端更改数据需要加锁?)
 
3. 客户端战斗系统结构
相较服务器而言,客户端增加了一个CWarScene战斗场景类负责管理战斗场景,它将包含一些IWarEffect战斗特效类(战斗特效的更新与播放)。IWarEffect主要派生出四种具体特效实现类,包括操作特效(仅变化模型着色以提示玩家)、粒子特效(特效只包含粒子)、动画特效(特效包含粒子和动画)、跳字特效(用于扣血等属性数值的增减)。这些特效都在OnUpdate中查询对于的SBuffInfo结构体,以确定特效是否和如何播放。
 
4. 如何应对策划修改
多数情况下都是策划攻,程序受,一起来探讨一下逆天的策划会有什么逆天的设计,如何留好接口进行扩展去应对这些设计。
a. 世界boss,多个玩家挑战同一个超级boss 
b. 大乱斗,玩家中途参战 
c. 帮派战,前军中军后军3vs3 
d. 自动战斗,中途加入操作

我所理解的网络游戏<?>:战斗逻辑设计的更多相关文章

  1. 深入理解计算机系统(4.2)------逻辑设计和硬件控制语言HCL

    上一篇博客我们简单介绍了Y86指令集体系,而这篇博客我们将介绍指令集体系的逻辑设计和硬件控制语言HCL,为后面去实现Y86打下基础. 在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器 ...

  2. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  3. MySQL 数据库设计 笔记与总结(2)逻辑设计

    [实例演示 —— 实体之间的关系] [逻辑设计的工作] ① 将需求转化为数据库的逻辑模型 ② 通过 ER 图的形式对逻辑模型进行展示 ③ 同所选用的具体的 DBMS 系统无关 [名词解释] 候选码可以 ...

  4. 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计

    基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述:    2 TLC5620型DAC芯片引脚说明:    2 TLC5620型DAC芯片详细介绍:    3 TLC ...

  5. 图解 CSS: 理解样式表的逻辑(转载)

    原文:http://www.cnblogs.com/del/archive/2009/02/01/1382141.html 样式表可以是外部的.内联的或嵌入的; 链接外部样式文件一般是:<lin ...

  6. 数据库设计理论与实践·<二>概念设计与逻辑设计

    2一.概念设计 1.1 概念设计关键知识 1.2 辨析 实体与属性的区别: ①实体能进一步用多个属性来描述,属性却不能,属性是不可再细分/分割的原子项. ②实体内部或者多个实体之间存在联系,而属性无. ...

  7. project开发的程序设计与逻辑设计

    非常多时候我们要做庞大project, 就像一棵大树, 方方面面都有自己的细枝末节,而作为开发员的我们,无法时时刻刻去保持对程序的全面认知,所以我们要把程序设计与逻辑设计区分开来. 那么什么是程序设计 ...

  8. ASP.NET中登录功能的简单逻辑设计

     ASP.NET中登录功能的简单逻辑设计                               概述                               逻辑设计             ...

  9. Mysql业务设计(逻辑设计)

    逻辑设计 数据库设计三大范式 数据库设计第一大范式 数据库表中所有的字段都只具有单一属性 单一属性的列是由基本数据类型所构成 设计出来的表都是简单的二维表 数据库设计的第二大范式 要求表中只有一个业务 ...

  10. 理解RESTful架构——Restful API设计指南

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

随机推荐

  1. 全排列12 · Permutations

    无重复 [抄题]: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have ...

  2. jquery之DataTables的使用

      jquery之DataTables的使用  document jquery function lsquo 强大的表格解决方案,有多强大,一起来看下吧: 1.DataTables的默认配置 $(do ...

  3. cron,at的权限控制

      /etc/cron.deny存在 /etc/cron.deny不存在 /etc/cron.allow存在 只有/etc/cron.allow中列出的用户才能运行crontab -e:忽略/etc/ ...

  4. 为什么二代测序的原始数据中会出现Read重复现象?

    为什么二代测序的原始数据中会出现Read重复现象? 要搞清楚这个read重复(duplicate)的问题,我想我们需要从NGS数据的产出过程说起,具体来说如下: 基因组DNA提取: DNA随机打断,最 ...

  5. window下装redis扩展(以php5.5为例)

    一.安装redis服务 1.下载并解压 https://github.com/dmajkic/redis/downloads 2.运行redis服务 3.检查能否正常访问  二.安装redis扩展 1 ...

  6. Netty 零拷贝(一)NIO 对零拷贝的支持

    Netty 零拷贝(二)NIO 对零拷贝的支持 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 非直接缓冲区(HeapBy ...

  7. c++11 随机代码记录

    // RadomTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #includ ...

  8. centos / debian 安装iptables服务

    debian: #使用可参考 https://www.debian.cn/archives/991 #配置文件位于 /etc/iptables #重新配置使用dpkg-reconfigure ipta ...

  9. for() 和$.each()的用法区别

    一.对于数组 var arr=['姚明','易建联','张继科']; $.each(arr,function(index,value){ document.write(index+"=&qu ...

  10. 为什么c++中返回成员变量的指针,会破坏了封装?

    上述代码中,get()函数返回的是类成员变量的name的地址,这是很危险的,name是私有的,意味这不想被客户访问,但是如果返回name的地址,那么外部函数就可以修改name,这就破坏了封装性. 为什 ...