using Godot; using System; public partial class TestPerfectPixelScene : Node2D { public enum HandlerType { UnHandler, NormalHandler, OffsetHandler } [Export] public CharacterBody2D Player; [Export] public Label FpsLabel; [Export] public Camera2D Camera2D; [Export] public float Speed = 50; [Export] public float CameraRecoveryScale = 5; [Export] public SubViewportContainer SubViewportContainer; [Export] public HandlerType Type; private ShaderMaterial _shaderMaterial; private Vector2 _cameraPos; public override void _Ready() { if (SubViewportContainer != null) { _shaderMaterial = (ShaderMaterial)SubViewportContainer.Material; } } public override void _Process(double delta) { InputManager.Update((float)delta); } public override void _PhysicsProcess(double delta) { FpsLabel.Text = "FPS: " + Engine.GetFramesPerSecond(); Player.Velocity = InputManager.MoveAxis * Speed; Player.MoveAndSlide(); var playerPos = Player.GlobalPosition; //_cameraPos = playerPos; _cameraPos = _cameraPos.MoveToward(playerPos, playerPos.DistanceTo(_cameraPos) * (float)delta * CameraRecoveryScale); if (Type == HandlerType.UnHandler) { Camera2D.GlobalPosition = _cameraPos; } else if (Type == HandlerType.NormalHandler) { Camera2D.GlobalPosition = _cameraPos.Round(); } else if (Type == HandlerType.OffsetHandler) { if (_shaderMaterial != null) { var cameraPosition = _cameraPos; var offset = cameraPosition.Round() - cameraPosition; _shaderMaterial.SetShaderParameter("offset", offset); Camera2D.GlobalPosition = cameraPosition.Round(); } } } }