# 快速开始
Noble SDK 提供了一套功能强大的游戏开发工具集,让开发者可以轻松创建各种游戏脚本和插件。本文将指导您如何安装并开始使用 Noble SDK。
# 安装
- 下载最新版本的 Noble SDK
- 将解压后的文件放置到您的项目目录中
- 包含 Noble.h 头文件到您的项目中
#include "Noble.h"
# 初始化 SDK
首先,您需要初始化 SDK 并注册您的插件。
// 初始化SDK,创建一个英雄插件
Noble::Init(PluginType::Champion, "我的第一个脚本", { "Annie", "Ashe" });
# 注册事件
Noble SDK 提供了丰富的事件系统,您可以注册回调函数来响应游戏中的各种事件。
// 声明事件回调函数
void OnLoad();
void OnUnload();
void OnUpdate();
void OnDraw();
void OnSpellCast(AIBaseClient* sender, SpellCastInfo const& args);
void OnNewPath(AIBaseClient* sender, std::vector<Vector> const& path, bool isDash, float dashSpeed);
// 注册事件
void RegisterEvents() {
// 注册核心事件
Event::OnLoad::Add(OnLoad);
Event::OnUnload::Add(OnUnload);
Event::OnUpdate::Add(OnUpdate);
Event::OnDraw::Add(OnDraw);
// 注册游戏事件
Event::OnSpellCast::Add(OnSpellCast);
Event::OnNewPath::Add(OnNewPath);
}
# 创建菜单
为您的脚本创建一个用户友好的配置菜单。
Menu* mainMenu;
MenuOption* comboKey;
MenuOption* useQ;
MenuOption* useW;
MenuOption* useE;
MenuOption* useR;
void CreateMenu() {
// 创建主菜单
mainMenu = Menu::Create("我的第一个脚本");
// 添加连招设置
Menu* comboMenu = mainMenu->AddMenu("连招设置");
comboKey = comboMenu->AddHotKey("连招按键", 0x20); // 空格键
useQ = comboMenu->AddCheckBox("使用 Q", true);
useW = comboMenu->AddCheckBox("使用 W", true);
useE = comboMenu->AddCheckBox("使用 E", true);
useR = comboMenu->AddCheckBox("使用 R", true);
}
# 实现连招系统
下面是一个简单的连招系统实现,展示了如何检测按键并施放技能。
// 定义技能
Spell Q, W, E, R;
// 初始化技能
void InitializeSpells() {
Q = Spell(eSpellSlot::Q, 625.f);
Q.SetTargetted(0.25f, 1400.f);
W = Spell(eSpellSlot::W, 600.f);
W.SetSkillshot(0.25f, 100.f, 2000.f, false, eSkillshotType::SkillshotCone);
E = Spell(eSpellSlot::E, 425.f);
E.SetSkillshot(0.25f, 200.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
R = Spell(eSpellSlot::R, 600.f);
R.SetSkillshot(0.25f, 250.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
}
// 执行连招
void ExecuteCombo() {
// 获取目标
AIBaseClient* target = TargetSelector::GetTarget(900.f, eDamageType::Magical);
if (!target) return;
// 使用R技能
if (useR->GetBoolean() && R.IsReady() && target->GetHealthPercent() <= 40.f) {
R.Cast(target);
}
// 使用E技能
if (useE->GetBoolean() && E.IsReady()) {
E.Cast(target);
}
// 使用Q技能
if (useQ->GetBoolean() && Q.IsReady()) {
Q.Cast(target);
}
// 使用W技能
if (useW->GetBoolean() && W.IsReady()) {
W.Cast(target);
}
}
// 更新事件处理
void OnUpdate() {
// 检查连招键是否按下
if (comboKey->GetBoolean()) {
ExecuteCombo();
}
}
# 完整示例
以下是一个完整的示例,展示了如何创建一个简单的脚本,实现注册事件和执行连招:
#include "Noble.h"
// 全局变量
Menu* mainMenu;
MenuOption* comboKey;
MenuOption* useQ;
MenuOption* useW;
MenuOption* useE;
MenuOption* useR;
Spell Q, W, E, R;
// 初始化技能
void InitializeSpells() {
Q = Spell(eSpellSlot::Q, 625.f);
Q.SetTargetted(0.25f, 1400.f);
W = Spell(eSpellSlot::W, 600.f);
W.SetSkillshot(0.25f, 100.f, 2000.f, false, eSkillshotType::SkillshotCone);
E = Spell(eSpellSlot::E, 425.f);
E.SetSkillshot(0.25f, 200.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
R = Spell(eSpellSlot::R, 600.f);
R.SetSkillshot(0.25f, 250.f, FLT_MAX, false, eSkillshotType::SkillshotCircle);
}
// 创建菜单
void CreateMenu() {
// 创建主菜单
mainMenu = Menu::Create("我的第一个脚本");
// 添加连招设置
Menu* comboMenu = mainMenu->AddMenu("连招设置");
comboKey = comboMenu->AddHotKey("连招按键", 0x20); // 空格键
useQ = comboMenu->AddCheckBox("使用 Q", true);
useW = comboMenu->AddCheckBox("使用 W", true);
useE = comboMenu->AddCheckBox("使用 E", true);
useR = comboMenu->AddCheckBox("使用 R", true);
}
// 执行连招
void ExecuteCombo() {
// 获取目标
AIBaseClient* target = TargetSelector::GetTarget(900.f, eDamageType::Magical);
if (!target) return;
// 使用R技能
if (useR->GetBoolean() && R.IsReady() && target->GetHealthPercent() <= 40.f) {
R.Cast(target);
}
// 使用E技能
if (useE->GetBoolean() && E.IsReady()) {
E.Cast(target);
}
// 使用Q技能
if (useQ->GetBoolean() && Q.IsReady()) {
Q.Cast(target);
}
// 使用W技能
if (useW->GetBoolean() && W.IsReady()) {
W.Cast(target);
}
}
// 加载事件
void OnLoad() {
Console::Add("脚本已加载!");
InitializeSpells();
CreateMenu();
}
// 卸载事件
void OnUnload() {
Console::Add("脚本已卸载!");
}
// 更新事件
void OnUpdate() {
// 检查连招键是否按下
if (comboKey->GetBoolean()) {
ExecuteCombo();
}
}
// 绘制事件
void OnDraw() {
AIBaseClient* player = ObjectManager::Player();
// 绘制技能范围
if (Q.IsReady()) {
Drawing::DrawCircle(player->Position(), Q.Range(), MAKE_COLOR(255, 0, 0, 100));
}
if (W.IsReady()) {
Drawing::DrawCircle(player->Position(), W.Range(), MAKE_COLOR(0, 255, 0, 100));
}
if (E.IsReady()) {
Drawing::DrawCircle(player->Position(), E.Range(), MAKE_COLOR(0, 0, 255, 100));
}
if (R.IsReady()) {
Drawing::DrawCircle(player->Position(), R.Range(), MAKE_COLOR(255, 255, 0, 100));
}
}
// 技能释放事件
void OnSpellCast(AIBaseClient* sender, SpellCastInfo const& args) {
// 判断是否是自己
if (sender->IsMe()) {
Console::Add("我释放了技能: %s", args.Name);
}
}
// 路径更新事件
void OnNewPath(AIBaseClient* sender, std::vector<Vector> const& path, bool isDash, float dashSpeed) {
// 判断是否是敌方英雄且正在冲刺
if (sender->IsEnemy() && sender->IsHero() && isDash) {
Console::Add("敌方英雄 %s 正在冲刺!", sender->ChampionName());
}
}
// 注册事件
void RegisterEvents() {
Event::OnLoad::Add(OnLoad);
Event::OnUnload::Add(OnUnload);
Event::OnUpdate::Add(OnUpdate);
Event::OnDraw::Add(OnDraw);
Event::OnSpellCast::Add(OnSpellCast);
Event::OnNewPath::Add(OnNewPath);
}
// 插件入口函数
PLUGIN_API void OnPluginStart() {
// 初始化SDK
Noble::Init(PluginType::Champion, "我的第一个脚本", { "Annie", "Ashe" });
// 注册事件
RegisterEvents();
}
通过以上步骤,您已经创建了一个完整的脚本,它可以:
- 初始化SDK并注册插件
- 创建用户界面
- 注册各种游戏事件
- 实现连招系统
您可以基于此示例进一步扩展,添加更多功能和自定义逻辑,以满足您的需求。