当前位置: 首页 > 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的文档。

http://www.lryc.cn/news/424413.html

相关文章:

  • C语言程序设计(初识C语言后部分)
  • 驱动基础开发
  • 从苹果AppStore看AI开发者生态
  • 【Python学习-UI界面】PyQt5 小部件1-Label
  • 【Linux详解】进度条实现 Linux下git 的远程上传
  • Android进阶之路 - res、raw、assets 资源解析、区别对比
  • 从数字化到数智化:消费零售企业如何实现门店数智化管理?
  • Linux中ES的安装
  • Redis远程字典服务器(5) —— hash类型详解
  • MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁
  • 【网络编程】TCP通信基础模型实现
  • css rem之2024
  • python自动化笔记:pytest框架
  • wpf 路径动画 举例
  • 【C++】classes and object 2.8 取地址及const取地址操作符重载
  • milvus helm k8s开启监控
  • 牛奶饮用学习笔记
  • php防止页面重复刷新或者重复提交
  • Springboot3 配置sql打印到控制台
  • 深入理解 GO 语言并发
  • leetcode39组合总和
  • 【JPCS独立出版,EI稳定检索】2024年工业机器人与先进制造技术国际学术会议(IRAMT 2024,9月27-29)
  • Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt
  • C++学习笔记----2、使用C++进行优雅编程(十)---- 格式化
  • 双指针| Java | (hot100) 力扣283, 11, 15, 42做题总结
  • matlab求解方程
  • MySQL基础--视图,存储过程
  • 学习记录第二十六天
  • Polars简明基础教程十一:可视化(一)
  • 实战项目:贪吃蛇游戏的实现(上)