Newer
Older
DungeonShooting / DungeonShooting_Godot / src / test / TestPerfectPixelScene.cs
@王晗智 王晗智 on 4 Mar 2024 1 KB 01
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();
			}
		}
	}
}