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

星露谷模组开发教程#3 事件

首发于Enaium的个人博客


SMAPI提供了一些事件,比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。

注册一个事件

SMAPI中,我们可以通过IModHelperEvents属性来注册事件。比如我们要注册游戏启动事件,可以这样写:

public override void Entry(IModHelper helper)
{helper.Events.GameLoop.GameLaunched += OnLaunched;
}
private void OnLaunched(object? sender, GameLaunchedEventArgs e)
{}

这样我们就注册了一个游戏启动事件。当游戏启动时,OnLaunched方法就会被调用,它有两个参数,第一个是事件的发送者,它是一个可空的对象,第二个是事件的参数,它是一个GameLaunchedEventArgs对象。这个对象里面没有任何属性,只是一个空的类。

输入事件

先来看一下按键按下或释放的事件。

public override void Entry(IModHelper helper)
{helper.Events.Input.ButtonPressed += OnPress;
}
private void OnPress(object? sender, ButtonPressedEventArgs e)
{Monitor.Log($"{e.Button} Press", LogLevel.Debug);
}

这样我们就注册了一个按键按下事件。当按键按下时,OnPress方法就会被调用,它有两个参数,第一个是事件的发送者,它是一个可空的对象,第二个是事件的参数,它是一个ButtonPressedEventArgs对象。这个对象有一个属性Button,它是一个SButton枚举,表示按下的按键。

public override void Entry(IModHelper helper)
{helper.Events.Input.ButtonReleased += OnReleased;
}
private void OnReleased(object? sender, ButtonReleasedEventArgs e)
{Monitor.Log($"{e.Button} Released", LogLevel.Debug);
}

这样我们就注册了一个按键释放事件。当按键释放时,OnReleased方法就会被调用,它有两个参数,第一个是事件的发送者,它是一个可空的对象,第二个是事件的参数,它是一个ButtonReleasedEventArgs对象。这个对象有一个属性Button,它是一个SButton枚举,表示释放的按键。

上面这些按键事件只能获取一个按键,如果要获取多个按键,可以使用ButtonsChanged事件。

public override void Entry(IModHelper helper)
{helper.Events.Input.ButtonsChanged += OnChanged;
}private void OnChanged(object? sender, ButtonsChangedEventArgs e)
{if (e.Pressed.Any()){Monitor.Log($"{string.Join(",", e.Pressed)} Press", LogLevel.Debug);}if (e.Released.Any()){Monitor.Log($"{string.Join(",", e.Released)} Released", LogLevel.Debug);}
}

当事件被触发时,Pressed属性表示按下的按键,Released属性表示释放的按键,之后我们判断按键是否为空,如果不为空,就输出按键。

我们还可以使用KeyBindList来判断这些按键是否被按下。

private void OnChanged(object? sender, ButtonsChangedEventArgs e)
{var keyBindList = KeybindList.Parse("LeftControl + A");if (keyBindList.JustPressed()){Monitor.Log("Keybind Just Pressed", LogLevel.Debug);}
}

这样就可以判断LeftControlA是否被按下。

显示事件

SMAPI还提供了一些显示事件,比如MenuChanged事件,在游戏中所有和菜单有关的事件都会触发这个事件。

public override void Entry(IModHelper helper)
{helper.Events.Display.MenuChanged += OnMenuChanged;
}private void OnMenuChanged(object? sender, MenuChangedEventArgs e)
{Monitor.Log($"{e.OldMenu} -> {e.NewMenu}", LogLevel.Debug);
}

比如我们打开背包,就会是一个空的菜单到StardewValley.Menus.GameMenu,这样就会输出 -> StardewValley.Menus.GameMenu,关闭背包就会输出StardewValley.Menus.GameMenu ->

显示事件中其他的一些事件都和游戏的图形绘制有关,这里就不多介绍了。

内容事件

public override void Entry(IModHelper helper)
{helper.Events.Content.AssetRequested += OnAssetRequested;
}
private void OnAssetRequested(object? sender, AssetRequestedEventArgs e)
{Monitor.Log(e.Name.Name, LogLevel.Debug);
}

当游戏加载一个资源时,就会触发这个事件。

好了,上面介绍了部分事件,其他事件可以参考SMAPI的文档。

相关文章:

星露谷模组开发教程#3 事件

首发于Enaium的个人博客 SMAPI提供了一些事件,比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。 注册一个事件 在SMAPI中,我们可以通过IModHelper的Events属性来注册事件。比如我们…...

C语言程序设计(初识C语言后部分)

愿天下无Bug,秀发常驻。 3)函数的参数 1.实际参数(实参): 真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何类型的量,在进行函数调用时&#…...

驱动基础开发

1、字符设备传统开发模板 字符设备驱动框架,首先我们需要去用module_init这个宏去修饰整个驱动的入口函数,用module_exit去修饰整个驱动的出口函数,然后还需要用MODULE_LICENSE用于声明模块的许可证类型。 在入口函数里面我们需要注册字符设…...

从苹果AppStore看AI开发者生态

从苹果 App Store 看 AI 开发者生态 在人工智能迅速发展的今天,我们不禁要问:未来的 AI 开发者生态将会是什么样子?为了回答这个问题,我们不妨回顾一下移动互联网时代最成功的开发者生态之一——苹果的 App Store。 通过分析 App …...

【Python学习-UI界面】PyQt5 小部件1-Label

QLabel 对象可用作显示不可编辑的文本、图像或动态GIF影片的占位符。 它还可以用作其他小部件的助记键。 标签可以显示普通文本、超链接或富文本。 1、普通文本 直接双击输入即可 2、添加超链接 选中对应Label,右键选择多信息文本,添加链接&#xff0c…...

【Linux详解】进度条实现 Linux下git 的远程上传

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 🚀前言 &#x…...

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题,索性重新整理记录一下,希望能帮到如吾往昔之少年的你们,哈哈哈哈哈哈… 一脸茫然,越写越多,时间成本属实有点大,就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…...

从数字化到数智化:消费零售企业如何实现门店数智化管理?

随着信息技术的飞速发展,数字化已成为企业转型的必经之路。然而,数字化本身并不是目的,而是通往数智化的桥梁。数智化,即数据智能化,是指企业通过数字化手段收集和分析数据,进而利用这些数据驱动决策和创新…...

Linux中ES的安装

文章目录 一、ES是什么1.1、ES概念介绍1.2、技术架构1.2.1、Lucene介绍 1.3、ES的工作原理1.4、ES的适用场景 二、安装前的配置2.1、创建普通用户2.2、调整文件描述符数量和虚拟内存2.3、设置shell会话的资源限制(软限制和硬限制)2.4、增加虚拟内存的设置…...

Redis远程字典服务器(5) —— hash类型详解

目录 一,hash基本情况 二,hash常用命令详解 2.1 hset,hget,hexists,hdel 2.2 hexists,hdel 2.3 hkeys,hvals 2.4 hgetall,hmget 2.5 hlen,hsetnx 2.6 hincrby&am…...

MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁

1、InnoDB中的行锁 行锁(Row Lock) 也称为记录锁,顾名思义,就是锁住某一行(某条记录row)。需要注意的是,MySQL服务器层并没有实现行锁机制,行级锁只在存储引擎层实现。 优点&#x…...

【网络编程】TCP通信基础模型实现

tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…...

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…...

python自动化笔记:pytest框架

目录 一、pytest介绍二、测试用例命名规则2.1、pytest命名规则2.2、python命名规范 三、pytest运行方式3.1、主函数方式3.2、命令行方式3.3、通过pytest.ini的配置文件运行&#xff08;常用&#xff09; 四、跳过测试用例4.1 无条件跳过4.2 有条件跳过 五、用例的前后置&#x…...

wpf 路径动画 举例

先&#xff0c;我们需要在XAML中定义一个Path&#xff0c;这个Path将定义动画的路线。然后&#xff0c;我们将使用DoubleAnimationUsingPath来沿着这个路径移动一个元素&#xff08;比如一个矩形&#xff09;。 <Window x:Class"WpfApp.MainWindow" xmlns"…...

【C++】classes and object 2.8 取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 &#xff0c;编译器默认会生成。 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; class Date { public:Date* operator&(){return this;}const Date* operator&()const{return this;} privat…...

milvus helm k8s开启监控

https://milvus.io/docs/monitor.md 文章写的很清晰 &#xff0c;我这边做一下个人补充&#xff0c;初版可能只是配置&#xff0c;具体的grafana 监控报表后期补一下。 架构如下&#xff1a; values.yaml 配置 enabled: true 改为true metrics:enabled: trueserviceMonitor:…...

牛奶饮用学习笔记

1. 常见牛奶类型 1.1 蒙牛-每日鲜语-0脂肪鲜牛奶 项目每100mL NRV%能量146kJ 能量计算 250 mL 146 kJ / 100 mL 365 kJ 250\text{mL}\times146\text{kJ}/100\text{mL} 365\text{kJ} 250mL146kJ/100mL365kJ 1.2 伊利-舒化-高钙型无乳糖牛奶 项目每100mL NRV%能量269kJ …...

php防止页面重复刷新或者重复提交

2.核心代码 显示的逻辑&#xff1a; //获取防止刷新的唯一标识符,start $intFlag substr(md5(time()),6); $strFlag BAOXIAOSS_.$my_user_id.$intFlag; $smarty->assign(check_is_agin_post, $strFlag); //获取防止刷新的唯一标识符,end注意&#xff1a;前端页面提交加入…...

Springboot3 配置sql打印到控制台

一、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>3.1.2</version></dependency> 二、application.yml com.lingyang.system # log4j2配…...

从零构建MAX30102心率血氧监测系统

1. MAX30102传感器基础认知 第一次接触MAX30102时&#xff0c;我盯着这个5mm3mm的小芯片看了半天——很难想象这么小的器件能同时测量心率和血氧。它本质上是个光电生物传感器&#xff0c;工作原理就像用手电筒照手指&#xff1a;内置的红光(660nm)和红外光(880nm)LED穿过皮肤组…...

使用 HashMap 优化嵌套循环:Java 对象数组转换

本文旨在提供使用 HashMap 优化 Java 嵌套循环的有效方法&#xff0c;特别是当循环涉及对象数组并进行相等检查时。通过将内部循环转换为 HashMap 查询可以显著降低时间复杂性&#xff0c;提高代码性能。本文将提供详细的步骤和示例代码&#xff0c;以帮助读者理解和应用此优化…...

如何快速实现歌词显示:群晖Audio Station完美解决方案

如何快速实现歌词显示&#xff1a;群晖Audio Station完美解决方案 【免费下载链接】qq_music_aum Synology LRC Plugin. 群晖 Audio Station 歌词插件&#xff0c;歌词来自QQ音乐。 项目地址: https://gitcode.com/gh_mirrors/qq/qq_music_aum 还在为群晖Audio Station缺…...

鸿蒙SpeechKit离线语音识别避坑指南:从PCM格式到权限配置,一次搞定

鸿蒙SpeechKit离线语音识别实战避坑指南 1. 音频格式的致命陷阱 PCM格式是鸿蒙SpeechKit离线语音识别的唯一选择&#xff0c;但开发者常犯的错误远不止文件类型这么简单。我曾见过一个团队花费三天时间排查识别率低的问题&#xff0c;最终发现是采样深度设置错误——这个细节在…...

M5Stack U126 RTC驱动库:PCF8563T嵌入式实时时钟深度解析

1. 项目概述M5Unit-RTC 是专为 M5Stack 生态中 Unit 系列模块设计的轻量级实时时钟&#xff08;RTC&#xff09;驱动库&#xff0c;对应硬件型号为U126—— 一款基于Ricoh RP5C01A 兼容架构、实际采用 NXP PCF8563T 实时时钟芯片的 IC 接口 RTC 模块。该模块集成高精度温度补偿…...

Dexter深度解析:如何用多Agent架构打造自主金融研究AI

一、为什么需要金融AI Agent&#xff1f; 1.1 传统金融研究的痛点 作为开发者&#xff0c;你是否遇到过这样的场景&#xff1a;需要分析一家上市公司的财务状况&#xff0c;却要花费数小时甚至数天时间&#xff1f; 传统金融研究面临三大挑战&#xff1a; 数据分散&#xff1a;…...

百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比

百川2-13B-4bits量化版精度测试&#xff1a;OpenClaw自动化任务准确率对比 1. 测试背景与实验设计 上周在部署OpenClaw自动化工作流时&#xff0c;我遇到了一个现实问题&#xff1a;本地显卡只有12GB显存&#xff0c;跑不动原版13B模型。于是尝试了百川2-13B的4bits量化版本&…...

OWASP靶场实战指南:从环境搭建到第一个SQL注入漏洞挖掘(含DVWA通关思路)

OWASP靶场实战指南&#xff1a;从环境搭建到第一个SQL注入漏洞挖掘 网络安全的世界就像一片未知的海洋&#xff0c;而靶场就是我们练习游泳的安全泳池。对于刚入门的新手来说&#xff0c;最大的困扰往往不是缺乏理论知识&#xff0c;而是不知道如何将所学付诸实践。OWASP靶场正…...

手把手教你用XCVU3P和FMC+接口搭建高性能PCIe载板(附原理图下载)

基于XCVU3P与FMC的高性能PCIe载板开发实战指南 在当今高速数据处理领域&#xff0c;FPGA因其并行计算能力和可重构特性成为关键器件。Xilinx UltraScale系列的XCVU3P芯片配合FMC扩展接口&#xff0c;为开发者提供了强大的硬件加速平台。本文将深入解析如何从零开始构建一个支持…...

all-MiniLM-L6-v2实战教程:用Python快速实现文本聚类分析

all-MiniLM-L6-v2实战教程&#xff1a;用Python快速实现文本聚类分析 1. 引言&#xff1a;为什么选择all-MiniLM-L6-v2 文本聚类是自然语言处理中的基础任务&#xff0c;它能帮助我们发现海量文本中的隐藏模式。传统方法如TF-IDF或词袋模型往往难以捕捉语义信息&#xff0c;而…...