Added main menu and settings
This commit is contained in:
@@ -0,0 +1 @@
|
||||
extends Node2D
|
||||
@@ -0,0 +1 @@
|
||||
uid://c737mx0kxva7i
|
||||
@@ -0,0 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://mpsu4g2b5h3a"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c737mx0kxva7i" path="res://game/levels/abstract_level.gd" id="1_o2mui"]
|
||||
|
||||
[node name="Level" type="Node2D"]
|
||||
script = ExtResource("1_o2mui")
|
||||
@@ -0,0 +1,164 @@
|
||||
class_name CSettingsManager
|
||||
extends Node
|
||||
|
||||
|
||||
@export var config_file_path := "user://settings.cfg"
|
||||
@export var window_base_size := Vector2i(640, 360)
|
||||
|
||||
|
||||
const CATEGORY_VIDEO = "video"
|
||||
const SETTING_FULLSCREEN = "fullscreen"
|
||||
const SETTING_WINDOW_FACTOR = "window_factor"
|
||||
const CATEGORY_AUDIO = "audio"
|
||||
const SETTING_MASTER_VOLUME = "master_volume"
|
||||
const SETTING_UI_VOLUME = "ui_volume"
|
||||
const SETTING_SFX_VOLUME = "sfx_volume"
|
||||
const SETTING_MUSIC_VOLUME = "music_volume"
|
||||
|
||||
|
||||
var _config: ConfigFile
|
||||
|
||||
var _fullscreen := false
|
||||
var fullscreen : bool:
|
||||
get():
|
||||
return _fullscreen
|
||||
set(value):
|
||||
_fullscreen = value
|
||||
_apply_video_settings()
|
||||
_save_settings()
|
||||
|
||||
var _window_factor := 1
|
||||
var window_factor : int:
|
||||
get():
|
||||
return _window_factor
|
||||
set(value):
|
||||
_window_factor = clampi(value, 1, 5)
|
||||
_apply_video_settings()
|
||||
_save_settings()
|
||||
|
||||
var _master_volume := 100
|
||||
var master_volume : int:
|
||||
get():
|
||||
return _master_volume
|
||||
set(value):
|
||||
_master_volume = clampi(value, 0, 100)
|
||||
_apply_audio_settings()
|
||||
_save_settings()
|
||||
|
||||
var _ui_volume := 100
|
||||
var ui_volume : int:
|
||||
get():
|
||||
return _ui_volume
|
||||
set(value):
|
||||
_ui_volume = clampi(value, 0, 100)
|
||||
_apply_audio_settings()
|
||||
_save_settings()
|
||||
|
||||
var _sfx_volume := 100
|
||||
var sfx_volume : int:
|
||||
get():
|
||||
return _sfx_volume
|
||||
set(value):
|
||||
_sfx_volume = clampi(value, 0, 100)
|
||||
_apply_audio_settings()
|
||||
_save_settings()
|
||||
|
||||
var _music_volume := 100
|
||||
var music_volume : int:
|
||||
get():
|
||||
return _music_volume
|
||||
set(value):
|
||||
_music_volume = clampi(value, 0, 100)
|
||||
_apply_audio_settings()
|
||||
_save_settings()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_config = ConfigFile.new()
|
||||
|
||||
_load_settings()
|
||||
_apply_all_settings()
|
||||
|
||||
|
||||
func _load_settings() -> void:
|
||||
if _config.load(config_file_path) == OK:
|
||||
_fullscreen = _config.get_value(CATEGORY_VIDEO, SETTING_FULLSCREEN, _fullscreen)
|
||||
_window_factor = _config.get_value(CATEGORY_VIDEO, SETTING_WINDOW_FACTOR, _window_factor)
|
||||
|
||||
_master_volume = _config.get_value(CATEGORY_AUDIO, SETTING_MASTER_VOLUME, _master_volume)
|
||||
_ui_volume = _config.get_value(CATEGORY_AUDIO, SETTING_UI_VOLUME, _ui_volume)
|
||||
_sfx_volume = _config.get_value(CATEGORY_AUDIO, SETTING_SFX_VOLUME, _sfx_volume)
|
||||
_music_volume = _config.get_value(CATEGORY_AUDIO, SETTING_MUSIC_VOLUME, _music_volume)
|
||||
|
||||
_save_settings()
|
||||
|
||||
|
||||
func _save_settings() -> void:
|
||||
if _config == null:
|
||||
_config = ConfigFile.new()
|
||||
|
||||
_config.set_value(CATEGORY_VIDEO, SETTING_FULLSCREEN, _fullscreen)
|
||||
_config.set_value(CATEGORY_VIDEO, SETTING_WINDOW_FACTOR, _window_factor)
|
||||
|
||||
_config.set_value(CATEGORY_AUDIO, SETTING_MASTER_VOLUME, _master_volume)
|
||||
_config.set_value(CATEGORY_AUDIO, SETTING_UI_VOLUME, _ui_volume)
|
||||
_config.set_value(CATEGORY_AUDIO, SETTING_SFX_VOLUME, _sfx_volume)
|
||||
_config.set_value(CATEGORY_AUDIO, SETTING_MUSIC_VOLUME, _music_volume)
|
||||
|
||||
_config.save(config_file_path)
|
||||
|
||||
|
||||
func _apply_all_settings() -> void:
|
||||
_apply_video_settings()
|
||||
_apply_audio_settings()
|
||||
|
||||
|
||||
func _apply_video_settings() -> void:
|
||||
if _fullscreen:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
|
||||
else:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
||||
_apply_window_scale()
|
||||
|
||||
|
||||
func _apply_audio_settings() -> void:
|
||||
var master_bus := AudioServer.get_bus_index(CSoundManager.MASTER_BUS)
|
||||
var ui_bus := AudioServer.get_bus_index(CSoundManager.UI_BUS)
|
||||
var sfx_bus := AudioServer.get_bus_index(CSoundManager.SFX_BUS)
|
||||
var music_bus := AudioServer.get_bus_index(CSoundManager.MUSIC_BUS)
|
||||
|
||||
AudioServer.set_bus_volume_linear(master_bus, _master_volume/100.0)
|
||||
AudioServer.set_bus_volume_linear(ui_bus, _ui_volume/100.0)
|
||||
AudioServer.set_bus_volume_linear(sfx_bus, _sfx_volume/100.0)
|
||||
AudioServer.set_bus_volume_linear(music_bus, _music_volume/100.0)
|
||||
|
||||
|
||||
func _apply_window_scale() -> void:
|
||||
if _fullscreen: return
|
||||
|
||||
var new_size := window_base_size * _window_factor
|
||||
|
||||
var current_position := DisplayServer.window_get_position()
|
||||
var current_size := DisplayServer.window_get_size()
|
||||
|
||||
var current_center := current_position + current_size / 2
|
||||
var new_position := current_center - new_size / 2
|
||||
|
||||
DisplayServer.window_set_size(new_size)
|
||||
DisplayServer.window_set_position(new_position)
|
||||
|
||||
_ensure_window_on_screen()
|
||||
|
||||
|
||||
func _ensure_window_on_screen() -> void:
|
||||
if _fullscreen: return
|
||||
|
||||
var window_position := DisplayServer.window_get_position()
|
||||
var window_size := DisplayServer.window_get_size()
|
||||
var screen_size := DisplayServer.screen_get_size()
|
||||
|
||||
var new_x : int = clamp(window_position.x, 0, screen_size.x - window_size.x)
|
||||
var new_y : int = clamp(window_position.y, 0, screen_size.y - window_size.y)
|
||||
|
||||
if new_x != window_position.x or new_y != window_position.y:
|
||||
DisplayServer.window_set_position(Vector2i(new_x, new_y))
|
||||
@@ -0,0 +1 @@
|
||||
uid://btol0m8w0msxk
|
||||
@@ -0,0 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://djdt3ply0g5um"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://btol0m8w0msxk" path="res://game/managers/settings_manager.gd" id="1_4nipk"]
|
||||
|
||||
[node name="SettingsManager" type="Node"]
|
||||
script = ExtResource("1_4nipk")
|
||||
@@ -0,0 +1,91 @@
|
||||
class_name CSoundManager
|
||||
extends Node
|
||||
|
||||
|
||||
const MASTER_BUS = "Master"
|
||||
const UI_BUS = "UI"
|
||||
const SFX_BUS = "SFX"
|
||||
const MUSIC_BUS = "Music"
|
||||
|
||||
|
||||
@export_group("Pitch settings", "pitch")
|
||||
@export_range(0.9, 1.1, 0.01) var putch_ui_min := 1.0
|
||||
@export_range(0.9, 1.1, 0.01) var putch_ui_max := 1.0
|
||||
@export_range(0.9, 1.1, 0.01) var putch_sfx_min := 1.0
|
||||
@export_range(0.9, 1.1, 0.01) var putch_sfx_max := 1.0
|
||||
|
||||
@export_group("Number of players", "player_count")
|
||||
@export_range(1, 10) var player_count_ui := 1
|
||||
@export_range(1, 100) var player_count_sfx := 1
|
||||
|
||||
|
||||
|
||||
var _ui_players : Array[AudioStreamPlayer] = []
|
||||
var _sfx_players : Array[AudioStreamPlayer2D] = []
|
||||
var _music_player : AudioStreamPlayer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_create_ui_players()
|
||||
_create_sfx_players()
|
||||
_create_music_player()
|
||||
|
||||
|
||||
func play_ui_stream(stream: AudioStream) -> AudioStreamPlayer:
|
||||
var player := _get_free_player(_ui_players)
|
||||
player.stream = stream
|
||||
player.pitch_scale = randf_range(putch_ui_min, putch_ui_max)
|
||||
player.play()
|
||||
return player
|
||||
|
||||
|
||||
func play_sfx_stream(stream: AudioStream, position: Vector2) -> AudioStreamPlayer2D:
|
||||
var player := _get_free_2d_player(_sfx_players)
|
||||
player.stream = stream
|
||||
player.pitch_scale = randf_range(putch_ui_min, putch_ui_max)
|
||||
player.position = position
|
||||
player.play()
|
||||
return player
|
||||
|
||||
|
||||
func play_music_stream(stream: AudioStream) -> AudioStreamPlayer:
|
||||
_music_player.stream = stream
|
||||
_music_player.play()
|
||||
return _music_player
|
||||
|
||||
|
||||
func _create_ui_players() -> void:
|
||||
for i in range(player_count_ui):
|
||||
var player : AudioStreamPlayer = AudioStreamPlayer.new()
|
||||
player.bus = UI_BUS
|
||||
_ui_players.append(player)
|
||||
add_child(player)
|
||||
|
||||
|
||||
func _create_sfx_players() -> void:
|
||||
for i in range(player_count_sfx):
|
||||
var player : AudioStreamPlayer2D = AudioStreamPlayer2D.new()
|
||||
player.bus = SFX_BUS
|
||||
_sfx_players.append(player)
|
||||
add_child(player)
|
||||
|
||||
|
||||
func _create_music_player() -> void:
|
||||
var player : AudioStreamPlayer = AudioStreamPlayer.new()
|
||||
player.bus = MUSIC_BUS
|
||||
_music_player = player
|
||||
add_child(player)
|
||||
|
||||
|
||||
func _get_free_player(players: Array[AudioStreamPlayer]) -> AudioStreamPlayer:
|
||||
for player in players:
|
||||
if not player.playing:
|
||||
return player
|
||||
return players[0]
|
||||
|
||||
|
||||
func _get_free_2d_player(players: Array[AudioStreamPlayer2D]) -> AudioStreamPlayer2D:
|
||||
for player in players:
|
||||
if not player.playing:
|
||||
return player
|
||||
return players[0]
|
||||
@@ -0,0 +1 @@
|
||||
uid://cx5qcukr66whc
|
||||
@@ -0,0 +1,12 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://drk4dvbn78dva"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cx5qcukr66whc" path="res://game/managers/sound_manager.gd" id="1_cg0sy"]
|
||||
|
||||
[node name="SoundManager" type="Node"]
|
||||
script = ExtResource("1_cg0sy")
|
||||
putch_ui_min = 0.9500000000000001
|
||||
putch_ui_max = 1.05
|
||||
putch_sfx_min = 0.9500000000000001
|
||||
putch_sfx_max = 1.05
|
||||
player_count_ui = 4
|
||||
player_count_sfx = 25
|
||||
@@ -0,0 +1,33 @@
|
||||
class_name MainMenu
|
||||
extends Control
|
||||
|
||||
|
||||
@onready var start_button : Button = $%StartButton
|
||||
@onready var options_button : Button = $%OptionsButton
|
||||
@onready var quit_button : Button = $%QuitButton
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_init_focus()
|
||||
_setup_neighbors()
|
||||
|
||||
|
||||
func _init_focus() -> void:
|
||||
start_button.grab_focus()
|
||||
|
||||
|
||||
func _setup_neighbors() -> void:
|
||||
start_button.focus_neighbor_top = quit_button.get_path()
|
||||
quit_button.focus_neighbor_bottom = start_button.get_path()
|
||||
|
||||
|
||||
func _on_start_button_pressed() -> void:
|
||||
pass
|
||||
|
||||
|
||||
func _on_options_button_pressed() -> void:
|
||||
get_tree().change_scene_to_file("res://game/menu/options_menu.tscn")
|
||||
|
||||
|
||||
func _on_quit_button_pressed() -> void:
|
||||
get_tree().quit()
|
||||
@@ -0,0 +1 @@
|
||||
uid://c3wyvemy5hxs2
|
||||
@@ -0,0 +1,65 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://c4iica45gnke0"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c3wyvemy5hxs2" path="res://game/menu/main_menu.gd" id="1_5d27k"]
|
||||
[ext_resource type="Theme" uid="uid://bh56my8b2htnr" path="res://themes/menu.tres" id="2_qnvmd"]
|
||||
[ext_resource type="Theme" uid="uid://lkf8obv8x5ve" path="res://themes/label.tres" id="3_i4f54"]
|
||||
|
||||
[node name="MainMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme = ExtResource("2_qnvmd")
|
||||
script = ExtResource("1_5d27k")
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0, 0, 0, 1)
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
|
||||
[node name="StartButton" type="Button" parent="MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Start"
|
||||
|
||||
[node name="OptionsButton" type="Button" parent="MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Options"
|
||||
|
||||
[node name="QuitButton" type="Button" parent="MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Quit"
|
||||
|
||||
[node name="CopyrightLabel" type="Label" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 1
|
||||
theme = ExtResource("3_i4f54")
|
||||
text = "(c) Ruslan Ignatov 2026
|
||||
Powered by Godot Engine"
|
||||
horizontal_alignment = 2
|
||||
vertical_alignment = 2
|
||||
|
||||
[connection signal="pressed" from="MarginContainer/VBoxContainer/StartButton" to="." method="_on_start_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/VBoxContainer/OptionsButton" to="." method="_on_options_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"]
|
||||
@@ -0,0 +1,118 @@
|
||||
class_name OptionsMenu
|
||||
extends Control
|
||||
|
||||
|
||||
const WINDOW_FACTOR = "window_factor"
|
||||
|
||||
|
||||
signal back
|
||||
|
||||
|
||||
@onready var fullscreen_button : CheckButton = $%FullscreenCheckButton
|
||||
@onready var window_factor_buttons : HBoxContainer = $%WindowFactorContainer
|
||||
@onready var back_button : Button = $%BackButton
|
||||
@onready var master_slider : Slider = $%MasterSlider
|
||||
@onready var ui_slider : Slider = $%UISlider
|
||||
@onready var sfx_slider : Slider = $%SFXSlider
|
||||
@onready var music_slider : Slider = $%MusicSlider
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_connect_window_factor_buttons()
|
||||
_load_current_settings()
|
||||
_init_focus()
|
||||
_setup_neighbors()
|
||||
|
||||
|
||||
func _play_left_sound() -> bool:
|
||||
return _play_side_sound(1, 0)
|
||||
|
||||
|
||||
func _play_right_sound() -> bool:
|
||||
return _play_side_sound(0, 1)
|
||||
|
||||
|
||||
func _play_side_sound(offset_begin: int, offset_end: int) -> bool:
|
||||
for i in range(offset_begin, window_factor_buttons.get_child_count() - offset_end):
|
||||
var child := window_factor_buttons.get_child(i)
|
||||
if child is Button and child.has_focus():
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _connect_window_factor_buttons() -> void:
|
||||
for child in window_factor_buttons.get_children():
|
||||
if child is Button:
|
||||
var button : Button = child
|
||||
button.pressed.connect(_on_window_factor_button_pressed.bind(button))
|
||||
|
||||
|
||||
func _on_visibility_changed() -> void:
|
||||
if not is_node_ready(): return
|
||||
if not visible: return
|
||||
|
||||
_load_current_settings()
|
||||
_init_focus()
|
||||
_setup_neighbors()
|
||||
|
||||
|
||||
func _init_focus() -> void:
|
||||
fullscreen_button.grab_focus()
|
||||
|
||||
|
||||
func _setup_neighbors() -> void:
|
||||
music_slider.focus_neighbor_bottom = back_button.get_path()
|
||||
|
||||
|
||||
func _load_current_settings() -> void:
|
||||
fullscreen_button.button_pressed = SettingsManager.fullscreen
|
||||
for child in window_factor_buttons.get_children():
|
||||
if child is Button:
|
||||
var button : Button = child
|
||||
var window_factor : int = button.get_meta(WINDOW_FACTOR, 0)
|
||||
if window_factor == SettingsManager.window_factor:
|
||||
button.button_pressed = true
|
||||
_update_window_factor_disabled()
|
||||
|
||||
master_slider.value = SettingsManager.master_volume
|
||||
ui_slider.value = SettingsManager.ui_volume
|
||||
sfx_slider.value = SettingsManager.sfx_volume
|
||||
music_slider.value = SettingsManager.music_volume
|
||||
|
||||
|
||||
func _update_window_factor_disabled() -> void:
|
||||
for child in window_factor_buttons.get_children():
|
||||
if not child is Button: continue
|
||||
child.disabled = SettingsManager.fullscreen
|
||||
child.focus_mode = Control.FOCUS_NONE if SettingsManager.fullscreen else Control.FOCUS_ALL
|
||||
|
||||
|
||||
func _on_fullscreen_check_button_toggled(toggled: bool) -> void:
|
||||
SettingsManager.fullscreen = toggled
|
||||
_update_window_factor_disabled()
|
||||
|
||||
|
||||
func _on_back_button_pressed() -> void:
|
||||
get_tree().change_scene_to_file("res://game/menu/main_menu.tscn")
|
||||
|
||||
|
||||
func _on_window_factor_button_pressed(button: Button) -> void:
|
||||
var window_factor : int = button.get_meta(WINDOW_FACTOR, 0)
|
||||
if window_factor > 0:
|
||||
SettingsManager.window_factor = window_factor
|
||||
|
||||
|
||||
func _on_master_volume_changed(value: float) -> void:
|
||||
SettingsManager.master_volume = floor(value)
|
||||
|
||||
|
||||
func _on_ui_volume_changed(value: float) -> void:
|
||||
SettingsManager.ui_volume = floor(value)
|
||||
|
||||
|
||||
func _on_sfx_volume_changed(value: float) -> void:
|
||||
SettingsManager.sfx_volume = floor(value)
|
||||
|
||||
|
||||
func _on_music_volume_changed(value: float) -> void:
|
||||
SettingsManager.music_volume = floor(value)
|
||||
@@ -0,0 +1 @@
|
||||
uid://cesv42oxhq2px
|
||||
@@ -0,0 +1,157 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://b0uhlmrggp8xx"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cesv42oxhq2px" path="res://game/menu/options_menu.gd" id="1_lq2ks"]
|
||||
[ext_resource type="Theme" uid="uid://bh56my8b2htnr" path="res://themes/menu.tres" id="2_e2bp2"]
|
||||
|
||||
[sub_resource type="InputEventAction" id="InputEventAction_e2bp2"]
|
||||
action = &"ui_cancel"
|
||||
|
||||
[sub_resource type="Shortcut" id="Shortcut_j72d6"]
|
||||
events = [SubResource("InputEventAction_e2bp2")]
|
||||
|
||||
[node name="OptionsMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme = ExtResource("2_e2bp2")
|
||||
script = ExtResource("1_lq2ks")
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0, 0, 0, 1)
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme = ExtResource("2_e2bp2")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="GridContainer" type="GridContainer" parent="MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 3
|
||||
theme_override_constants/h_separation = 12
|
||||
theme_override_constants/v_separation = 17
|
||||
columns = 2
|
||||
|
||||
[node name="FullscreenLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="FullscreenCheckButton" type="CheckButton" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Fullscreen"
|
||||
|
||||
[node name="WindowFactorLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
text = "Window
|
||||
factor"
|
||||
|
||||
[node name="WindowFactorContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ButtonX1" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"]
|
||||
layout_mode = 2
|
||||
text = "*1"
|
||||
metadata/window_factor = 1
|
||||
|
||||
[node name="ButtonX2" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"]
|
||||
layout_mode = 2
|
||||
text = "*2"
|
||||
metadata/window_factor = 2
|
||||
|
||||
[node name="ButtonX3" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"]
|
||||
layout_mode = 2
|
||||
text = "*3"
|
||||
metadata/window_factor = 3
|
||||
|
||||
[node name="ButtonX4" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"]
|
||||
layout_mode = 2
|
||||
text = "*4"
|
||||
metadata/window_factor = 4
|
||||
|
||||
[node name="ButtonX5" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer"]
|
||||
layout_mode = 2
|
||||
text = "*5"
|
||||
metadata/window_factor = 5
|
||||
|
||||
[node name="MasterLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
text = "Master"
|
||||
|
||||
[node name="MasterSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
step = 10.0
|
||||
value = 50.0
|
||||
tick_count = 11
|
||||
ticks_on_borders = true
|
||||
ticks_position = 3
|
||||
|
||||
[node name="UILabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
text = "UI"
|
||||
|
||||
[node name="UISlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
step = 10.0
|
||||
tick_count = 11
|
||||
ticks_on_borders = true
|
||||
ticks_position = 3
|
||||
|
||||
[node name="SFXLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
text = "SFX"
|
||||
|
||||
[node name="SFXSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
step = 10.0
|
||||
tick_count = 11
|
||||
ticks_on_borders = true
|
||||
ticks_position = 3
|
||||
|
||||
[node name="MusicLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
layout_mode = 2
|
||||
text = "Music"
|
||||
|
||||
[node name="MusicSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
step = 10.0
|
||||
tick_count = 11
|
||||
ticks_on_borders = true
|
||||
ticks_position = 3
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="BackButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
shortcut = SubResource("Shortcut_j72d6")
|
||||
text = "Back"
|
||||
|
||||
[connection signal="toggled" from="MarginContainer/VBoxContainer/GridContainer/FullscreenCheckButton" to="." method="_on_fullscreen_check_button_toggled"]
|
||||
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MasterSlider" to="." method="_on_master_volume_changed"]
|
||||
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/UISlider" to="." method="_on_ui_volume_changed"]
|
||||
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/SFXSlider" to="." method="_on_sfx_volume_changed"]
|
||||
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MusicSlider" to="." method="_on_music_volume_changed"]
|
||||
[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"]
|
||||
@@ -0,0 +1,10 @@
|
||||
class_name BWObject
|
||||
extends Node2D
|
||||
|
||||
|
||||
@export var is_colored := true
|
||||
@export var is_white := true
|
||||
|
||||
|
||||
func invert() -> void:
|
||||
is_white = not is_white
|
||||
@@ -0,0 +1 @@
|
||||
uid://b7qut5xhc5hxo
|
||||
@@ -0,0 +1,10 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://bgtb7602a2260"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b7qut5xhc5hxo" path="res://game/objects/b_w_object.gd" id="1_jpa1b"]
|
||||
|
||||
[node name="BlackAndWhiteObject" type="Node2D"]
|
||||
script = ExtResource("1_jpa1b")
|
||||
|
||||
[node name="Black" type="Node2D" parent="."]
|
||||
|
||||
[node name="White" type="Node2D" parent="."]
|
||||
Reference in New Issue
Block a user