Split of viewport code into its own Node

main
copygirl 5 years ago
parent 167c5b19eb
commit 8338716de0
  1. 8
      scene/GameScene.tscn
  2. 35
      src/Game.cs
  3. 33
      src/Viewport.cs

@ -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://scene/EscapeMenu.tscn" type="PackedScene" id=1]
[ext_resource path="res://src/Cursor.cs" type="Script" id=2] [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://gfx/cursor.png" type="Texture" id=4]
[ext_resource path="res://scene/Player.tscn" type="PackedScene" id=5] [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://scene/Block.tscn" type="PackedScene" id=6]
[ext_resource path="res://src/Viewport.cs" type="Script" id=7]
[node name="Game" type="Node"] [node name="Game" type="Node"]
script = ExtResource( 3 ) script = ExtResource( 3 )
Player = ExtResource( 5 ) Player = ExtResource( 5 )
Block = ExtResource( 6 ) 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="HUD" type="CanvasLayer" parent="."]
[node name="Cursor" type="Node2D" parent="HUD"] [node name="Cursor" type="Node2D" parent="HUD"]

@ -1,42 +1,21 @@
using Godot; using Godot;
using System;
public class Game : Node 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 Player { get; set; }
[Export] public PackedScene Block { get; set; } [Export] public PackedScene Block { get; set; }
public override void _Ready() public override void _Ready()
{ {
GetTree().Connect("screen_resized", this, "OnWindowResized");
OnWindowResized();
SpawnPlayer(); SpawnPlayer();
SpawnBlocks(); 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() private void SpawnPlayer()
{ {
var player = (Player)Player.Instance(); var player = (Player)Player.Instance();
player.Position = PreferredScreenSize / 2;
AddChild(player); AddChild(player);
} }
@ -50,15 +29,15 @@ public class Game : Node
} }
// Top and bottom. // Top and bottom.
for (var x = 16; x <= (int)PreferredScreenSize.x - 16; x += 16) { for (var x = (int)RoomSize.x / -2; x <= (int)RoomSize.x / 2; x += 16) {
SpawnBlockAt(x, 20); SpawnBlockAt(x, (int)RoomSize.y / -2);
SpawnBlockAt(x, (int)PreferredScreenSize.y - 20); SpawnBlockAt(x, (int)RoomSize.y / 2);
} }
// Left and right. // Left and right.
for (var y = 36; y <= (int)PreferredScreenSize.y - 36; y += 16) { for (var y = (int)RoomSize.y / -2 + 16; y <= (int)RoomSize.y / 2 - 16; y += 16) {
SpawnBlockAt(16, y); SpawnBlockAt((int)RoomSize.x / -2, y);
SpawnBlockAt((int)PreferredScreenSize.x - 16, y); SpawnBlockAt((int)RoomSize.x / 2, y);
} }
} }
} }

@ -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));
}
}
Loading…
Cancel
Save