Line 181: |
Line 181: |
| </source> | | </source> |
| |} | | |} |
| + | |
| + | ===Per-screen data=== |
| + | [[Multiplayer|Split-screen multiplayer]] swaps the entire game state between each player, so each mod runs across every player. For example, with four local players the [[Modding:Modder Guide/APIs/Events#UpdateTicked|<tt>UpdateTicked</tt>]] event would be raised four times per tick. The game manages its own state automatically (e.g. <tt>Game1.activeClickableMenu</tt>), but if your mod stores info in its own fields you may need to handle those yourself. |
| + | |
| + | That can be tricky, so SMAPI provides <code>PerScreen<T></code> to take care of it. A <code>PerScreen<T></code> field manages a separate value for each local screen. |
| + | |
| + | For example, this mod would keep track of the last button pressed by each player: |
| + | |
| + | <source lang="C#"> |
| + | internal class ModEntry : Mod |
| + | { |
| + | private readonly PerScreen<SButton> LastButtonPressed = new PerScreen<SButton>(); |
| + | |
| + | |
| + | public override void Entry(IModHelper helper) |
| + | { |
| + | helper.Events.Input.ButtonPressed += this.OnButtonPressed; |
| + | } |
| + | |
| + | private void OnButtonPressed(object sender, ButtonPressedEventArgs e) |
| + | { |
| + | this.LastButtonPressed.Value = e.Button; |
| + | } |
| + | } |
| + | </source> |
| + | |
| + | If you haven't set a value for the current player, <code>PerScreen<T></code> will return the default value for the type (e.g. 0 for <tt>int</tt>). You can change that by specifying your own default-value logic: |
| + | |
| + | <source lang="C#"> |
| + | private readonly PerScreen<SButton> LastButtonPressed = new PerScreen<SButton>(createNewState: () => SButton.None); |
| + | </source> |
| | | |
| ===Semantic versions=== | | ===Semantic versions=== |