cirnogodot/Scripts/Actors/Prism.cs

70 lines
1.7 KiB
C#
Raw Normal View History

2025-05-27 15:11:02 +02:00
using Godot;
namespace Cirno.Scripts.Actors;
public partial class Prism : Area2D
{
2025-05-27 15:38:08 +02:00
[Export] public float ReflectionAngle { get; private set; } = 90f;
2025-05-27 17:35:48 +02:00
[Export] public float RotationSpeed { get; set; } = 0f;
2025-05-27 15:11:02 +02:00
2025-05-27 15:38:08 +02:00
private Sprite2D _sprite;
2025-05-28 14:37:42 +02:00
[Export] public float[] Angles { get; set; } = [-90f, -45f, 180f, 45f, 90f];
private int _angleIndex = 0;
private double _rotateTimer = 0;
2025-05-27 15:38:08 +02:00
2025-05-27 15:11:02 +02:00
public override void _Ready()
{
this.AreaEntered += OnCollision;
2025-05-27 15:38:08 +02:00
_sprite = this.GetNode<Sprite2D>("Sprite2D");
SetReflectionAngle(ReflectionAngle);
}
2025-05-27 17:35:48 +02:00
public override void _PhysicsProcess(double delta)
{
if (RotationSpeed > 0)
{
2025-05-28 14:37:42 +02:00
_rotateTimer += delta;
}
if (_rotateTimer > RotationSpeed)
{
_rotateTimer = 0;
_angleIndex++;
if (_angleIndex >= Angles.Length)
2025-05-27 17:35:48 +02:00
{
2025-05-28 14:37:42 +02:00
_angleIndex = 0;
2025-05-27 17:35:48 +02:00
}
2025-05-28 14:37:42 +02:00
//var angleDifference = (float)(RotationSpeed * delta);
//var newAngle = ReflectionAngle + angleDifference;
// if (newAngle > 360)
// {
// newAngle = 0;
//
// }
var newAngle = Angles[_angleIndex];
2025-05-27 17:35:48 +02:00
SetReflectionAngle(newAngle);
}
}
2025-05-27 15:38:08 +02:00
public void SetReflectionAngle(float angle)
{
ReflectionAngle = angle;
var frames = _sprite.Hframes;
var frame = (int)(frames * angle / 360);
2025-05-27 17:35:48 +02:00
_sprite.SetFrame(Mathf.Clamp(frame -1, 0, _sprite.Hframes) );
2025-05-27 15:11:02 +02:00
}
private void OnCollision(Area2D other)
{
if (other is not Bullet bullet) return;
bullet.RotateBullet(ReflectionAngle);
}
}