add a vsync option to the settings
i added a vsync option to the settings that lets you pick a vsync option that maps to the engines vsync enum. so you can either enable, disable it, turn it to adapt mode, or mailbox mode.
This commit is contained in:
parent
8072cf4961
commit
9fdf16c557
7 changed files with 95 additions and 31 deletions
|
@ -3,9 +3,11 @@
|
||||||
[ext_resource type="FontFile" uid="uid://dq8ojwul8884x" path="res://Fonts/AtkinsonHyperlegible-Regular.ttf" id="1_aadm8"]
|
[ext_resource type="FontFile" uid="uid://dq8ojwul8884x" path="res://Fonts/AtkinsonHyperlegible-Regular.ttf" id="1_aadm8"]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
default_font = ExtResource("1_aadm8")
|
||||||
Button/font_sizes/font_size = 32
|
Button/font_sizes/font_size = 32
|
||||||
Button/fonts/font = ExtResource("1_aadm8")
|
Button/fonts/font = ExtResource("1_aadm8")
|
||||||
Label/font_sizes/font_size = 32
|
Label/font_sizes/font_size = 32
|
||||||
Label/fonts/font = ExtResource("1_aadm8")
|
Label/fonts/font = ExtResource("1_aadm8")
|
||||||
LineEdit/font_sizes/font_size = 32
|
LineEdit/font_sizes/font_size = 32
|
||||||
LineEdit/fonts/font = ExtResource("1_aadm8")
|
LineEdit/fonts/font = ExtResource("1_aadm8")
|
||||||
|
PopupMenu/font_sizes/font_size = 32
|
||||||
|
|
|
@ -34,8 +34,7 @@ size_flags_horizontal = 4
|
||||||
[node name="Label" type="Label" parent="ScrollContainer/InternalMainContainer/ScaleContainer"]
|
[node name="Label" type="Label" parent="ScrollContainer/InternalMainContainer/ScaleContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_horizontal = 4
|
size_flags_horizontal = 4
|
||||||
text = "Scale
|
text = "Scale"
|
||||||
"
|
|
||||||
|
|
||||||
[node name="Scale" type="SpinBox" parent="ScrollContainer/InternalMainContainer/ScaleContainer"]
|
[node name="Scale" type="SpinBox" parent="ScrollContainer/InternalMainContainer/ScaleContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
@ -45,6 +44,30 @@ step = 0.01
|
||||||
value = 1.0
|
value = 1.0
|
||||||
alignment = 1
|
alignment = 1
|
||||||
|
|
||||||
|
[node name="VSyncContainer" type="VBoxContainer" parent="ScrollContainer/InternalMainContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 4
|
||||||
|
alignment = 1
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="ScrollContainer/InternalMainContainer/VSyncContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "VSync"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
|
||||||
|
[node name="VSyncOptions" type="OptionButton" parent="ScrollContainer/InternalMainContainer/VSyncContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
item_count = 4
|
||||||
|
selected = 1
|
||||||
|
fit_to_longest_item = false
|
||||||
|
popup/item_0/text = "Disabled"
|
||||||
|
popup/item_0/id = 0
|
||||||
|
popup/item_1/text = "Enabled"
|
||||||
|
popup/item_1/id = 1
|
||||||
|
popup/item_2/text = "Adaptive"
|
||||||
|
popup/item_2/id = 2
|
||||||
|
popup/item_3/text = "Mailbox"
|
||||||
|
popup/item_3/id = 3
|
||||||
|
|
||||||
[node name="SaveButton" type="Button" parent="."]
|
[node name="SaveButton" type="Button" parent="."]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
disabled = true
|
disabled = true
|
||||||
|
@ -59,5 +82,7 @@ theme_override_font_sizes/font_size = 32
|
||||||
text = "Back
|
text = "Back
|
||||||
"
|
"
|
||||||
|
|
||||||
|
[connection signal="value_changed" from="ScrollContainer/InternalMainContainer/ScaleContainer/Scale" to="." method="ScaleChanged"]
|
||||||
|
[connection signal="item_selected" from="ScrollContainer/InternalMainContainer/VSyncContainer/VSyncOptions" to="." method="VSyncChanged"]
|
||||||
[connection signal="pressed" from="SaveButton" to="." method="OnSaveButtonPressed"]
|
[connection signal="pressed" from="SaveButton" to="." method="OnSaveButtonPressed"]
|
||||||
[connection signal="pressed" from="BackButton" to="." method="OnBackButtonPressed"]
|
[connection signal="pressed" from="BackButton" to="." method="OnBackButtonPressed"]
|
||||||
|
|
|
@ -3,7 +3,7 @@ namespace Pong.Scripts.Data;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// a record class that represents the game area.
|
/// a record class that represents the game area.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public record class GameArea
|
public record GameArea
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// the X coordinate of the GameArea wrapped in a struct that makes operating on it easier. this is divided
|
/// the X coordinate of the GameArea wrapped in a struct that makes operating on it easier. this is divided
|
||||||
|
@ -28,7 +28,6 @@ public record class GameArea
|
||||||
return new Vector2(normalizedX, normalizedY);
|
return new Vector2(normalizedX, normalizedY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// take a normalized position and convert it back into a globalized position.
|
/// take a normalized position and convert it back into a globalized position.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -10,8 +10,14 @@ public struct Settings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double Scale;
|
public double Scale;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// options for VSync. 0 is Disabled, 1 is Enabled, 2 is Adaptive, 3 is Mailbox. These match the <see cref="DisplayServer.VSyncMode"/> enum on
|
||||||
|
/// the <see cref="DisplayServer"/>.
|
||||||
|
/// </summary>
|
||||||
|
public long VSync;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// the default values of settings.
|
/// the default values of settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static Settings Default => new() { Scale = 1.0 };
|
public static Settings Default => new() { Scale = 1.0, VSync = (long)DisplayServer.VSyncMode.Enabled };
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,32 +7,30 @@ public partial class BaseMenu : VBoxContainer
|
||||||
public override void _EnterTree()
|
public override void _EnterTree()
|
||||||
{
|
{
|
||||||
_settingsManager = GetNode<SettingsManager>("/root/SettingsManager");
|
_settingsManager = GetNode<SettingsManager>("/root/SettingsManager");
|
||||||
_settingsManager.SettingsChanged += AdaptUiToGameResolution;
|
_settingsManager.SettingsChanged += SettingsChanged;
|
||||||
GetTree().Root.SizeChanged += AdaptUiToGameResolution;
|
GetTree().Root.SizeChanged += AdaptUiToGameResolution;
|
||||||
AdaptUiToGameResolution();
|
AdaptUiToGameResolution();
|
||||||
|
|
||||||
EnterTree();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _ExitTree()
|
public override void _ExitTree()
|
||||||
{
|
{
|
||||||
GetTree().Root.SizeChanged -= AdaptUiToGameResolution;
|
GetTree().Root.SizeChanged -= AdaptUiToGameResolution;
|
||||||
_settingsManager.SettingsChanged -= AdaptUiToGameResolution;
|
_settingsManager.SettingsChanged -= SettingsChanged;
|
||||||
ExitTree();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void EnterTree()
|
/// <summary>
|
||||||
{
|
/// method that fires when the settings get changed.
|
||||||
}
|
/// </summary>
|
||||||
|
private void SettingsChanged()
|
||||||
protected virtual void ExitTree()
|
|
||||||
{
|
{
|
||||||
|
AdaptUiToGameResolution();
|
||||||
|
DisplayServer.WindowSetVsyncMode((DisplayServer.VSyncMode)_settingsManager.SettingsData.VSync);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// change the size of the UI container to the current resolution of the game.
|
/// change the size of the UI container to the current resolution of the game.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected void AdaptUiToGameResolution()
|
private void AdaptUiToGameResolution()
|
||||||
{
|
{
|
||||||
var scale = _settingsManager.SettingsData.Scale;
|
var scale = _settingsManager.SettingsData.Scale;
|
||||||
Size = (Vector2)DisplayServer.WindowGetSize() / scale;
|
Size = (Vector2)DisplayServer.WindowGetSize() / scale;
|
||||||
|
|
|
@ -4,15 +4,19 @@ public partial class Settings : BaseMenu
|
||||||
{
|
{
|
||||||
private SettingsManager _settings;
|
private SettingsManager _settings;
|
||||||
private SpinBox _scale;
|
private SpinBox _scale;
|
||||||
|
private OptionButton _vSync;
|
||||||
private Button _saveButton;
|
private Button _saveButton;
|
||||||
|
|
||||||
private bool _scaleModified;
|
private bool _scaleModified;
|
||||||
|
private bool _vSyncModified;
|
||||||
|
|
||||||
protected override void EnterTree()
|
public override void _EnterTree()
|
||||||
{
|
{
|
||||||
|
base._EnterTree();
|
||||||
GetNodes();
|
GetNodes();
|
||||||
|
|
||||||
_scale.Value = _settings.SettingsData.Scale;
|
_scale.Value = _settings.SettingsData.Scale;
|
||||||
|
_vSync.Selected = (int)_settings.SettingsData.VSync;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnBackButtonPressed()
|
private void OnBackButtonPressed()
|
||||||
|
@ -20,31 +24,57 @@ public partial class Settings : BaseMenu
|
||||||
GetTree().ChangeSceneToFile("res://Scenes/UI/Menus/MainMenu.tscn");
|
GetTree().ChangeSceneToFile("res://Scenes/UI/Menus/MainMenu.tscn");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// get references to the nodes required for the settings menu to function and bind to events.
|
||||||
|
/// </summary>
|
||||||
private void GetNodes()
|
private void GetNodes()
|
||||||
{
|
{
|
||||||
_settings = GetNode<SettingsManager>("/root/SettingsManager");
|
using var mainContainer = GetNode<VBoxContainer>("ScrollContainer/InternalMainContainer");
|
||||||
_scale = GetNode<SpinBox>("ScrollContainer/InternalMainContainer/ScaleContainer/Scale");
|
|
||||||
_saveButton = GetNode<Button>("SaveButton");
|
|
||||||
|
|
||||||
_scale.ValueChanged += ScaleChanged;
|
_settings = GetNode<SettingsManager>("/root/SettingsManager");
|
||||||
|
_scale = mainContainer.GetNode<SpinBox>("ScaleContainer/Scale");
|
||||||
|
_vSync = mainContainer.GetNode<OptionButton>("VSyncContainer/VSyncOptions");
|
||||||
|
_saveButton = GetNode<Button>("SaveButton");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// method fired every time the scale value is changed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">the new value</param>
|
||||||
private void ScaleChanged(double value)
|
private void ScaleChanged(double value)
|
||||||
{
|
{
|
||||||
_scaleModified = !value.Equals(_settings.SettingsData.Scale);
|
_scaleModified = !value.Equals(_settings.SettingsData.Scale);
|
||||||
CheckIfModified();
|
CheckIfModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CheckIfModified()
|
/// <summary>
|
||||||
|
/// method fired every time the VSync value is changed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="index">the index of the VSync options box.</param>
|
||||||
|
private void VSyncChanged(long index)
|
||||||
{
|
{
|
||||||
var isModified = _scaleModified;
|
_vSyncModified = index != _settings.SettingsData.VSync;
|
||||||
_saveButton.Disabled = !isModified;
|
CheckIfModified();
|
||||||
return isModified;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// changes the isModified bool to true if either of the modified booleans are true and enables the save button if
|
||||||
|
/// the isModified bool is true.
|
||||||
|
/// </summary>
|
||||||
|
private void CheckIfModified()
|
||||||
|
{
|
||||||
|
var isModified = _scaleModified || _vSyncModified;
|
||||||
|
_saveButton.Disabled = !isModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// saves the new settings to a json file and disables the save button if that operation happens successfully.
|
||||||
|
/// </summary>
|
||||||
private async void OnSaveButtonPressed()
|
private async void OnSaveButtonPressed()
|
||||||
{
|
{
|
||||||
if (!await _settings.SaveSettings(_settings.SettingsData with { Scale = _scale.Value })) return;
|
if (!await _settings.SaveSettings(_settings.SettingsData with { Scale = _scale.Value, VSync = _vSync.Selected})) return;
|
||||||
_saveButton.Disabled = true;
|
_saveButton.Disabled = true;
|
||||||
|
_scaleModified = false;
|
||||||
|
_vSyncModified = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,10 @@ scene_reload={
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[physics]
|
||||||
|
|
||||||
|
2d/run_on_separate_thread=true
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
renderer/rendering_method="gl_compatibility"
|
||||||
|
|
Loading…
Reference in a new issue