You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
using Godot; |
|
using System; |
|
|
|
public class Game : Node |
|
{ |
|
public Vector2 PreferredScreenSize { get; } = new Vector2(640, 360); |
|
|
|
[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); |
|
} |
|
|
|
private void SpawnBlocks() |
|
{ |
|
void SpawnBlockAt(int x, int y) |
|
{ |
|
var block = (Node2D)Block.Instance(); |
|
block.Position = new Vector2(x, y); |
|
AddChild(block); |
|
} |
|
|
|
// Top and bottom. |
|
for (var x = 16; x <= (int)PreferredScreenSize.x - 16; x += 16) { |
|
SpawnBlockAt(x, 20); |
|
SpawnBlockAt(x, (int)PreferredScreenSize.y - 20); |
|
} |
|
|
|
// Left and right. |
|
for (var y = 36; y <= (int)PreferredScreenSize.y - 36; y += 16) { |
|
SpawnBlockAt(16, y); |
|
SpawnBlockAt((int)PreferredScreenSize.x - 16, y); |
|
} |
|
} |
|
}
|
|
|