From 8338716de0bfb815e655994a2cf974bff29ca8d4 Mon Sep 17 00:00:00 2001 From: copygirl Date: Wed, 14 Apr 2021 10:02:46 +0200 Subject: [PATCH] Split of viewport code into its own Node --- scene/GameScene.tscn | 8 +++++++- src/Game.cs | 35 +++++++---------------------------- src/Viewport.cs | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 src/Viewport.cs diff --git a/scene/GameScene.tscn b/scene/GameScene.tscn index cee58f2..34c79f9 100644 --- a/scene/GameScene.tscn +++ b/scene/GameScene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://scene/EscapeMenu.tscn" type="PackedScene" id=1] [ext_resource path="res://src/Cursor.cs" type="Script" id=2] @@ -6,12 +6,18 @@ [ext_resource path="res://gfx/cursor.png" type="Texture" id=4] [ext_resource path="res://scene/Player.tscn" type="PackedScene" id=5] [ext_resource path="res://scene/Block.tscn" type="PackedScene" id=6] +[ext_resource path="res://src/Viewport.cs" type="Script" id=7] [node name="Game" type="Node"] script = ExtResource( 3 ) Player = ExtResource( 5 ) Block = ExtResource( 6 ) +[node name="Viewport" type="Node" parent="."] +script = ExtResource( 7 ) + +[node name="Network" type="Node" parent="."] + [node name="HUD" type="CanvasLayer" parent="."] [node name="Cursor" type="Node2D" parent="HUD"] diff --git a/src/Game.cs b/src/Game.cs index 7896301..d4875bc 100644 --- a/src/Game.cs +++ b/src/Game.cs @@ -1,42 +1,21 @@ using Godot; -using System; public class Game : Node { - [Export] public Vector2 PreferredScreenSize { get; set; } = new Vector2(640, 360); + [Export] public Vector2 RoomSize { get; set; } = new Vector2(32, 18) * 16; [Export] public PackedScene Player { get; set; } [Export] public PackedScene Block { get; set; } public override void _Ready() { - GetTree().Connect("screen_resized", this, "OnWindowResized"); - OnWindowResized(); - SpawnPlayer(); SpawnBlocks(); } - private void OnWindowResized() - { - var viewport = GetViewport(); - - var scaleX = OS.WindowSize.x / PreferredScreenSize.x; - var scaleY = OS.WindowSize.y / PreferredScreenSize.y; - var scale = Math.Max(1, Mathf.RoundToInt(Mathf.Min(scaleX, scaleY))); - - viewport.Size = (OS.WindowSize / scale).Ceil(); - - // This prevents the viewport from being "squished" to fit the window. - // The difference is only a few pixels, but it results in distortion - // around the center horizontal and vertical lines of the screen. - viewport.SetAttachToScreenRect(new Rect2(0, 0, viewport.Size * scale)); - } - private void SpawnPlayer() { var player = (Player)Player.Instance(); - player.Position = PreferredScreenSize / 2; AddChild(player); } @@ -50,15 +29,15 @@ public class Game : Node } // Top and bottom. - for (var x = 16; x <= (int)PreferredScreenSize.x - 16; x += 16) { - SpawnBlockAt(x, 20); - SpawnBlockAt(x, (int)PreferredScreenSize.y - 20); + for (var x = (int)RoomSize.x / -2; x <= (int)RoomSize.x / 2; x += 16) { + SpawnBlockAt(x, (int)RoomSize.y / -2); + SpawnBlockAt(x, (int)RoomSize.y / 2); } // Left and right. - for (var y = 36; y <= (int)PreferredScreenSize.y - 36; y += 16) { - SpawnBlockAt(16, y); - SpawnBlockAt((int)PreferredScreenSize.x - 16, y); + for (var y = (int)RoomSize.y / -2 + 16; y <= (int)RoomSize.y / 2 - 16; y += 16) { + SpawnBlockAt((int)RoomSize.x / -2, y); + SpawnBlockAt((int)RoomSize.x / 2, y); } } } diff --git a/src/Viewport.cs b/src/Viewport.cs new file mode 100644 index 0000000..e4f0cb5 --- /dev/null +++ b/src/Viewport.cs @@ -0,0 +1,33 @@ +using Godot; +using System; + +public class Viewport : Node +{ + [Export(PropertyHint.Range, "0,8")] public int Scale { get; set; } = 0; + [Export] public Vector2 PreferredScreenSize { get; set; } = new Vector2(640, 360); + + public override void _Ready() + { + GetTree().Connect("screen_resized", this, "OnWindowResized"); + OnWindowResized(); + } + + private void OnWindowResized() + { + var viewport = GetViewport(); + + var scale = Scale; + if (scale <= 0) { + var scaleX = OS.WindowSize.x / PreferredScreenSize.x; + var scaleY = OS.WindowSize.y / PreferredScreenSize.y; + scale = Math.Max(1, Mathf.RoundToInt(Mathf.Min(scaleX, scaleY))); + } + + viewport.Size = (OS.WindowSize / scale).Ceil(); + + // This prevents the viewport from being "squished" to fit the window. + // The difference is only a few pixels, but it results in distortion + // around the center horizontal and vertical lines of the screen. + viewport.SetAttachToScreenRect(new Rect2(0, 0, viewport.Size * scale)); + } +}