From 08a20c683a49937a8cea2be621c1585d7fc08c95 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 1 Nov 2025 11:48:40 -0600 Subject: [PATCH] initial project setup --- .editorconfig | 4 +++ .gitattributes | 2 ++ .gitignore | 3 ++ autoloads/display.gd | 71 ++++++++++++++++++++++++++++++++++++++++ autoloads/display.gd.uid | 1 + autoloads/display.tscn | 28 ++++++++++++++++ icon.svg | 1 + icon.svg.import | 43 ++++++++++++++++++++++++ project.godot | 35 ++++++++++++++++++++ test_scene.tscn | 13 ++++++++ 10 files changed, 201 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 autoloads/display.gd create mode 100644 autoloads/display.gd.uid create mode 100644 autoloads/display.tscn create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 test_scene.tscn diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/autoloads/display.gd b/autoloads/display.gd new file mode 100644 index 0000000..3252b54 --- /dev/null +++ b/autoloads/display.gd @@ -0,0 +1,71 @@ +extends Node + + +enum ScaleMode { + ## Stretches to fit as close as possible while maintaining the game's aspect ratio. + ASPECT, + ## Stretches to fit as close as possible while maintaining aspect ratio and an integer scale. + INTEGER, + ## Stretches to cover the whole screen, warping the aspect ratio. + STRETCH, +} + + +## Strategy to use for scaling from game-native resolution to the window/screen size. +@export var scale_mode: ScaleMode = ScaleMode.ASPECT: + set(value): + scale_mode = value + if is_node_ready(): + _update_scale() + +@export_group("Internal References") +@export var _viewport: SubViewport +@export var _viewport_container: SubViewportContainer + + +## The native resolution of the game. +var size: Vector2i = Vector2i( + ProjectSettings.get_setting("display/window/size/viewport_width"), + ProjectSettings.get_setting("display/window/size/viewport_height"), +) + + +func _enter_tree() -> void: + get_tree().scene_changed.connect(_on_scene_changed) + get_tree().root.size_changed.connect(_update_scale) + + _update_scale.call_deferred() + + var current_scene = get_tree().current_scene + if current_scene and current_scene != self: + current_scene.reparent.call_deferred(_viewport) + + +func _on_scene_changed() -> void: + for child in _viewport.get_children(): + child.queue_free() + get_tree().current_scene.reparent(_viewport) + + +func _update_scale() -> void: + var screen_size = Vector2(get_tree().root.size) + var size_ratio = screen_size / Vector2(size) + + DisplayServer.window_set_min_size(size) + + _viewport.size = size + _viewport_container.pivot_offset = Vector2(size) * 0.5 + _viewport_container.position = screen_size * 0.5 - Vector2(size) * 0.5 + + match scale_mode: + ScaleMode.ASPECT: + # get the minimum ratio and use for both axes + var min_scale = minf(size_ratio.x, size_ratio.y) + _viewport_container.scale = Vector2(min_scale, min_scale) + ScaleMode.INTEGER: + # get the minimum ratio and use for both axes after flooring + var min_scale = floorf(minf(size_ratio.x, size_ratio.y)) + _viewport_container.scale = Vector2(min_scale, min_scale) + ScaleMode.STRETCH: + # just use the ratio as-is + _viewport_container.scale = size_ratio diff --git a/autoloads/display.gd.uid b/autoloads/display.gd.uid new file mode 100644 index 0000000..76403f2 --- /dev/null +++ b/autoloads/display.gd.uid @@ -0,0 +1 @@ +uid://kwa8v1dhwlie diff --git a/autoloads/display.tscn b/autoloads/display.tscn new file mode 100644 index 0000000..1923fdd --- /dev/null +++ b/autoloads/display.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=2 format=3 uid="uid://bixq77klfo561"] + +[ext_resource type="Script" uid="uid://kwa8v1dhwlie" path="res://autoloads/display.gd" id="1_1seuv"] + +[node name="Display" type="Node" node_paths=PackedStringArray("_viewport", "_viewport_container")] +script = ExtResource("1_1seuv") +scale_mode = 1 +_viewport = NodePath("SubViewportContainer/SubViewport") +_viewport_container = NodePath("SubViewportContainer") + +[node name="SubViewportContainer" type="SubViewportContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -128.0 +offset_top = -96.0 +offset_right = 128.0 +offset_bottom = 96.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(128, 96) + +[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"] +handle_input_locally = false +size = Vector2i(256, 192) +render_target_update_mode = 4 diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..c6bbb7d --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..073b7b5 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://diymfwm64gae8" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..0c922b5 --- /dev/null +++ b/project.godot @@ -0,0 +1,35 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Luna Lunatic" +config/features=PackedStringArray("4.5", "GL Compatibility") +config/icon="res://icon.svg" + +[autoload] + +Display="*res://autoloads/display.tscn" + +[display] + +window/size/viewport_width=256 +window/size/viewport_height=192 + +[file_customization] + +folder_colors={ +"res://autoloads/": "orange" +} + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/test_scene.tscn b/test_scene.tscn new file mode 100644 index 0000000..1d59249 --- /dev/null +++ b/test_scene.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=3 uid="uid://bnjujh22nqr4a"] + +[ext_resource type="Texture2D" uid="uid://diymfwm64gae8" path="res://icon.svg" id="1_uhqqe"] + +[node name="TestScene" type="Node2D"] + +[node name="Icon" type="Sprite2D" parent="."] +position = Vector2(209, 145) +texture = ExtResource("1_uhqqe") + +[node name="Icon2" type="Sprite2D" parent="."] +position = Vector2(11, 9) +texture = ExtResource("1_uhqqe")