当前位置: 首页 > news >正文

lua 游戏架构 之 游戏 AI (三)ai_attack

这段Lua脚本定义了一个名为 `ai_attack` 的类,继承自 `ai_base` 类。

lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客文章浏览阅读119次。定义了一套接口和属性,可以基于这个基础类派生出具有特定行为的AI组件。例如,可以创建追逐敌人的AI、巡逻的AI或使用特定策略的AI等,都继承自这个基础类https://blog.csdn.net/heyuchang666/article/details/140624481?spm=1001.2014.3001.5501

这个类用于处理游戏中AI的攻击逻辑。以下是对代码的详细解释:

1. **引入基类**:
   - `local BASE = require("logic/entity/ai/ai_base").ai_base;` 这行代码引入了基类 `ai_base`。

2. **定义 `ai_attack` 类**:
   - `ai_attack = class("ai_attack", BASE);` 这行代码定义了 `ai_attack` 类并指定其基类为 `BASE`。

3. **构造函数 (`ctor`)**:
   - `function ai_attack:ctor(entity)` 构造函数接受一个 `entity` 参数,并设置 `_type` 属性为 `eAType_ATTACK`。

4. **`IsValid` 方法**:
   - 这个方法用于验证AI是否可以执行攻击。它检查实体是否死亡、是否可以攻击、是否是特定类型的实体等条件。

5. **`CanAttackNoneTarget` 方法**:
   - 这个方法用于判断是否可以攻击没有目标的情况,当前实现返回 `false`。

6. **`OnEnter` 方法**:
   - 当AI组件进入激活状态时执行。该方法处理目标定位、实体朝向调整、攻击开始逻辑等。
   - 如果实体有目标并且速度大于0,则计算目标和实体之间的旋转角度,并设置实体面向目标。

7. **`OnLeave` 方法**:
   - 当AI组件离开激活状态时执行。该方法处理停止攻击的逻辑,并恢复实体的移动能力。

8. **`OnUpdate` 方法**:
   - 每帧调用,用于更新AI状态。如果基类的 `OnUpdate` 方法返回 `false`,则当前方法也返回 `false`。

9. **`OnLogic` 方法**:
   - 逻辑更新方法,用于处理技能序列、检查攻击持续时间等。
   - 如果技能序列有效且是当前技能的子技能,则执行相关逻辑。
   - 检查自攻击开始以来的时间是否已经超过技能的持续时间,如果是,则返回 `false`。

10. **创建组件函数**:
    - `function create_component(entity, priority)` 这个函数用于创建 `ai_attack` 类的新实例,传入一个实体和一个优先级。

代码中的一些关键函数和方法:
- `IsDead()`:检查实体是否死亡。
- `CanAttack()`:检查实体是否可以攻击。
- `GetEntityType()`:获取实体的类型。
- `GetMapEnter()`:获取地图进入的状态。
- `Test(eEBAttack)`:测试实体的行为是否包含攻击行为。
- `CanUse()`:检查技能是否可以使用。
- `IsPlayer()`:检查目标是否是玩家。
- `GetRadius()`:获取实体的半径。
- `vec3_sub1()`:计算两个向量的差。
- `vec3_len()`:计算向量的长度。
- `vec3_angle1()`:计算两个向量之间的夹角。
- `SetFaceDir()`:设置实体的面向方向。
- `StartAttack()`:开始攻击。
- `StopAttack()`:停止攻击。
- `FinishAttack()`:完成攻击。

这个脚本为游戏中的AI提供了一个攻击行为的基础框架,可以根据具体游戏的需求进行扩展和修改。

----------------------------------------------------------------local require = requirelocal BASE = require("logic/entity/ai/ai_base").ai_base;------------------------------------------------------
ai_attack = class("ai_attack", BASE);
function ai_attack:ctor(entity)self._type = eAType_ATTACK;
endfunction ai_attack:IsValid()local entity = self._entity;if entity:IsDead() or not entity:CanAttack() thenreturn false;endif entity:GetEntityType() == eET_Player and entity._DigStatus == 2 thenreturn false;endif entity:GetEntityType() == eET_Trap thenif entity._ntype ~= eEntityTrapType_AOE thenreturn false;elseif entity._curSkill and entity._curSkill:CanUse() thenreturn trueendendendif not g_game_context:GetMapEnter() thenreturn false;endif entity._behavior:Test(eEBAttack) thenreturn true;endif entity._curSkill and entity._curSkill:CanUse() thenlocal target = entity._target;if target thenif not target:IsPlayer() and target:GetEntityType() == eET_Player thenif target._behavior:Test(eEBInvisible) thenreturn false;endendlocal dist = vec3_sub1(entity._curPos, target._curPos);if (entity._curSkill._range + (entity:GetRadius() + target:GetRadius())) > vec3_len(dist) thenreturn true;endreturn false;elseif entity:GetEntityType() == eET_Player then if entity._AutoFight thenreturn falseendelseif entity:GetEntityType() == eET_Mercenary thenif entity._cfg.ultraSkill == entity._curSkill._id thenreturn trueendif entity._curSkill._specialArgs.rushInfo and not entity._hoster:IsPlayer() thenreturn trueendendendreturn self:CanAttackNoneTarget();endreturn false;
endfunction ai_attack:CanAttackNoneTarget()return false;
endfunction ai_attack:OnEnter()if BASE.OnEnter(self) thenlocal entity = self._entity;local target = entity._target;local speed = entity:GetPropertyValue(ePropID_speed);if speed > 0 and entity._target and entity._target._guid ~= entity._guid thenlocal p1 = target._curPos;local p2 = entity._curPos;local rot_y = vec3_angle1(p1, p2, { x = 1, y = 0, z = 0 });entity:SetFaceDir(0, rot_y, 0);endself._startTick	= game_get_logic_time();self._skill		= entity._curSkill;self._canBreak	= self._skill._canBreak;self._duration	= self._skill._duration;self._attacker	= entity:StartAttack();self._movable = entity._movable;if not self._attacker thenreturn false;endself._entity._movable = false;return true;endreturn false;
endfunction ai_attack:OnLeave()if BASE.OnLeave(self) thenif self._canBreak and self._attacker thenself._attacker:StopAttack(false);endself._entity:FinishAttack();self._entity._movable = self._movable;return true;endreturn false;
endfunction ai_attack:OnUpdate(dTime)if not BASE.OnUpdate(self, dTime) then return false; endreturn true;
endfunction ai_attack:OnLogic(dTick)if not BASE.OnLogic(self, dTick) then return false; endlocal seq_skill = self._entity._seq_skill;if seq_skill and seq_skill.valid and seq_skill.parent == self._skill thenseq_skill.valid = false;if self._attacker thenif self._attacker:NextSequence(seq_skill.skill) thenself._duration	= seq_skill.skill._duration;self._startTick	= game_get_logic_time();endendendif self._skill thenif (game_get_logic_time() - self._startTick) * 1000 >= self._duration thenreturn false;endendreturn true;
endfunction create_component(entity, priority)return ai_attack.new(entity, priority);
end


 

相关文章:

lua 游戏架构 之 游戏 AI (三)ai_attack

这段Lua脚本定义了一个名为 ai_attack 的类,继承自 ai_base 类。 lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客文章浏览阅读119次。定义了一套接口和属性,可以基于这个基础类派生出具有特定行为的AI组件。例如,可以…...

大数据之Oracle同步Doris数据不一致问题

数据同步架构如下: 出现的问题: doris中的数据条数 源库中的数据条数 总数完全不一致。 出现问题的原因: 在Dinky中建立表结构时,缺少对主键属性的限制 primary key(ID) not enforced 加上如上语句,数据条数解决一致 …...

visual studio 问题总结

一. Visual Studio: 使用简体中文(GB2312)编码加载文件, 有些字节已用Unicode替换字符更换 解决方法:vs 工具-》选项-》文本编辑器...

go-错误码的最佳实践

一、背景 在工程开发中,我们有以下场景可以用错误码解决 我们不太方便直接将内部的错误原因暴露给外部,可以根据错误码得到对应的外部暴露消息通过设定错误码判断是客户端或者服务端的问题,避免不必要的排障浪费方便查找日志,定…...

Python面试题:使用Matplotlib和Seaborn进行数据可视化

使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。 安装 Matplotlib 和 Seaborn 如果你还没有安装这两个库,可以使用以…...

模拟实现c++中的vector模版

目录 一vector简述: 二vector的一些接口函数: 1初始化: 2.vector增长: 3vector增删查改: 三vector模拟实现部分主要函数: 1.size,capacity,empty,clear接口: 2.reverse的实现&#xff1…...

uniapp安卓通过绝对路径获取文件

uniapp安卓通过绝对路径获取文件 在uniapp中,如果你想要访问安卓设备上的文件,你需要使用uniapp提供的plus.io API。这个API允许你在应用内访问设备的文件系统。 以下是一个示例代码,展示了如何使用plus.io API来获取文件: fun…...

Known框架实战演练——进销存业务单据

本文介绍如何实现进销存管理系统的业务单据模块,业务单据模块包括采购进货单、采购退货单、销售出货单、销售退货单4个菜单页面。由于进销单据字段大同小异,因此设计共用一个页面组件类。 项目代码:JxcLite开源地址: https://git…...

解决npm依赖树冲突的方法以及npm ERR! code ERESOLVE错误的解决方案

一、问题描述 在使用ng new myapp --skip-install 构建Angular 项目后,尝试用npm install 安装依赖的时候报了以下错误。 (base) PS C:\Users\Administrator\Desktop\agtest\myapp> npm i npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependenc…...

Spring Boot + Spring Batch + Quartz 整合定时批量任务

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 最近一周,被借调到其他部门,赶一个紧急需求,需求内容如下: PC网页触发一条设备升级记录(下图),后台要定时批量设备更…...

C++STL简介(二)

目录 1.模拟实现string 1.string基本属性和大体框架 2.基本函数 2.1size&#xff08;&#xff09; 2.2 [] 2.3 begin() 和end() 2.4capacity&#xff08;&#xff09; 2.5 reserve 2.6push_back 2.7 append 2.8 2.9insert 2.10find 2.11substr 2.12 2.12 < …...

嵌入式高频面试题100道及参考答案(3万字长文)

目录 解释嵌入式系统的定义和主要特点 描述微处理器与微控制器的主要区别 什么是ARM体系结构?它在嵌入式系统中有哪些优势? 解释GPIO(通用输入输出)的工作原理 什么是ADC和DAC?它们在嵌入式系统中的作用是什么? 解释中断的概念及其在实时系统中的重要性 描述SPI(串…...

python爬虫-事件触发机制

今天想爬取一些政策&#xff0c;从政策服务 (smejs.cn) 这个网址爬取&#xff0c;html源码找不到链接地址&#xff0c;通过浏览器的开发者工具&#xff0c;点击以下红框 分析预览可知想要的链接地址的id有了&#xff0c;进行地址拼接就行 点击标头可以看到请求后端服务器的api地…...

LeetCode-day27-3106. 满足距离约束且字典序最小的字符串

LeetCode-day27-3106. 满足距离约束且字典序最小的字符串 题目描述示例示例1&#xff1a;示例2&#xff1a;示例3&#xff1a; 思路代码 题目描述 给你一个字符串 s 和一个整数 k 。 定义函数 distance(s1, s2) &#xff0c;用于衡量两个长度为 n 的字符串 s1 和 s2 之间的距…...

C++中的static_cast函数

static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在编译时进行类型转换。它主要用于基本数据类型之间的转换&#xff0c;以及类的指针或引用之间的向上转换&#xff08;将派生类指针或引用转换为基类指针或引用&#xff09;和某些情况下的向下转换&#xff08;将基类指…...

从零开始学习网络安全渗透测试之基础入门篇——(二)Web架构前后端分离站Docker容器站OSS存储负载均衡CDN加速反向代理WAF防护

Web架构 Web架构是指构建和管理Web应用程序的方法和模式。随着技术的发展&#xff0c;Web架构也在不断演进。当前&#xff0c;最常用的Web架构包括以下几种&#xff1a; 单页面应用&#xff08;SPA&#xff09;&#xff1a; 特点&#xff1a;所有用户界面逻辑和数据处理都包含…...

2679. 矩阵中的和

两种方法&#xff1a; 第一种&#xff1a;先对二维列表的每一列进行排序&#xff0c;然后对每一列的数据进行逐个比较&#xff0c;找出最大值。 class Solution:def matrixSum(self, nums: list[list[int]]) -> int:result0mlen(nums)nlen(nums[0])for i in range(m):nums…...

Unity Playables:下一代动画与音频序列

Unity的Playables API是一种灵活的系统&#xff0c;用于创建和控制动画、音频以及其他形式的连续媒体序列。它为开发者提供了一种全新的方法来处理游戏中的时间序列&#xff0c;包括动画、音频、特效等。本文将探讨Playables的基本概念、如何使用Playables API实现动画&#xf…...

matlab仿真 模拟调制(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第五章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all ts0.001; t0:ts:10-ts; fs1/ts; dffs/length(t); msgrandi([-3 3],100,1); msg1msg*ones(1,fs/10); msg2reshape(ms…...

RabbitMQ是什么?

RabbitMQ是一个开源的消息代理软件&#xff08;Message Broker&#xff09;&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff0c;Advanced Message Queuing Protocol&#xff09;&#xff0c;并支持多种消息传递协议。它最初由英国的Rabbit Technologies开发&…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...