游戏思考06:游戏核心逻辑设计—战斗系统基础及进阶(未完待续,12/14)


客户端:负责接收玩家战斗指令,根据服务器的驱动进行表现
服务器:负责逻辑驱动

一、【第一章】游戏战斗系统核心抽象模型

1)技能过程定义

1)技能实体在生命过程中,可通过抽象划分为一系列的阶段
2)不同的技能类型即为这些阶段组合而成的过程

2)技能阶段(可以叫状态机,但这是时间驱动的各个阶段)

1)start 技能开始
2)Cost 消耗处理
3)reading 吟唱(读条)
4)channeling 引导(比如说持续性的对一个目标造成伤害或者一定的效果)
5)OnCast 出手(起手的时候通知客户端做预表现,做表现的期间掩盖网络延迟)
6)Project 弹道飞行中(飞镖做物理碰检测,战斗中引入物理碰撞是比较困难的事情)
7)OnHit 击中(打中的一些效果,实际上就是执行了一段lua脚本)
8)FInish 技能结束

补充:
技能在服务器就是一段数据+逻辑,也就是游戏编程精粹第一本的数据驱动的系统,也就是行为树
  • 自述
    在我的项目中,用的阶段是:
StageBegin技能开始->StagePrapare技能准备->StageGuide技能引导
->StageEffect技能作用->StatePost技能作用后->StageEnd技能作用结束

3)不同技能分类

  • 瞬发技能
    start-》cost-》oncast-》project-》onhit-》finish
  • 吟唱技能
    start-》reading->cost->oncast->project->onhit->finish
  • 引导技能
    start->cost->channel->oncast->project->onhit->effect->timeout? channel:finishi(时间没结束就回到channel)
  • combo技能(连击技能,大部分技能都是连招的技能)
    ①都是由很多个技能组合起来的
    ②与特殊引导技能的区别:combo技能需要玩家不停的点击
  • 特殊引导技的技能 (实际上在一个时间轴上是连续释放的,但是在中间会被各种事件打断)
    玩家只需要按一个技能,就可以连续的放很多技能

4)简单实现方式(定时器驱动不同阶段的状态机)

  • 可配置的阶段内容
    出手表现时间T1 ---->
    飞行时间T2=distance/project_speed ---->
    击中表现时间T3

在这里插入图片描述

二、【第二章】核心框架

1)战斗框架子系统(buff,也叫aura)

  • 定义
    依附于实体数据上持续一段时间的可交互对象
数据
逻辑
相关实体:event_source(时间产生的来源),event_target(技能打中的目标),deco_source(给技能上buff的这个目标,可以简单理解为施法者)
交互点:skillout、skillin

2)简单实现示例

三、【第三章】逻辑内容

四、【第四章】网络问题

五、【第五章】性能问题

六、【第六章】可维护性问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类和子类的泛型转换问题。 首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值