mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 11:15:33 +00:00
70 lines
No EOL
1.7 KiB
C#
70 lines
No EOL
1.7 KiB
C#
using Godot;
|
|
|
|
namespace Cirno.Scripts.Actors;
|
|
|
|
public partial class Prism : Area2D
|
|
{
|
|
[Export] public float ReflectionAngle { get; private set; } = 90f;
|
|
[Export] public float RotationSpeed { get; set; } = 0f;
|
|
|
|
private Sprite2D _sprite;
|
|
|
|
[Export] public float[] Angles { get; set; } = [-90f, -45f, 180f, 45f, 90f];
|
|
|
|
private int _angleIndex = 0;
|
|
|
|
private double _rotateTimer = 0;
|
|
|
|
public override void _Ready()
|
|
{
|
|
this.AreaEntered += OnCollision;
|
|
_sprite = this.GetNode<Sprite2D>("Sprite2D");
|
|
|
|
SetReflectionAngle(ReflectionAngle);
|
|
|
|
}
|
|
|
|
public override void _PhysicsProcess(double delta)
|
|
{
|
|
if (RotationSpeed > 0)
|
|
{
|
|
_rotateTimer += delta;
|
|
}
|
|
|
|
if (_rotateTimer > RotationSpeed)
|
|
{
|
|
_rotateTimer = 0;
|
|
_angleIndex++;
|
|
if (_angleIndex >= Angles.Length)
|
|
{
|
|
_angleIndex = 0;
|
|
}
|
|
//var angleDifference = (float)(RotationSpeed * delta);
|
|
//var newAngle = ReflectionAngle + angleDifference;
|
|
// if (newAngle > 360)
|
|
// {
|
|
// newAngle = 0;
|
|
//
|
|
// }
|
|
var newAngle = Angles[_angleIndex];
|
|
SetReflectionAngle(newAngle);
|
|
}
|
|
}
|
|
|
|
public void SetReflectionAngle(float angle)
|
|
{
|
|
ReflectionAngle = angle;
|
|
var frames = _sprite.Hframes;
|
|
var frame = (int)(frames * angle / 360);
|
|
|
|
_sprite.SetFrame(Mathf.Clamp(frame -1, 0, _sprite.Hframes) );
|
|
}
|
|
|
|
private void OnCollision(Area2D other)
|
|
{
|
|
if (other is not Bullet bullet) return;
|
|
|
|
bullet.RotateBullet(ReflectionAngle);
|
|
}
|
|
|
|
} |