Pong/Scripts/Ball.cs

59 lines
1.6 KiB
C#
Raw Normal View History

using Godot;
namespace Pong.Scripts;
public partial class Ball : CharacterBody2D
{
[Export] private double _ballSpeed;
[Export] private double _maxRandomAngle;
private Vector2 _velocity;
/// <summary>
/// this property multiples the ballSpeed by the Meter constant.
/// </summary>
private double BallSpeed => _ballSpeed * Constants.Meter;
public override void _Ready()
{
// this should dispose when this method goes out of scope (this means after the velocity variable is assigned)
using var rng = new RandomNumberGenerator();
rng.Randomize();
// set the velocity currently to the left of the screen with a random y angle.
_velocity = GetRandomStartingDirection() * BallSpeed + new Vector2(0, rng.RandfRange(-_maxRandomAngle, _maxRandomAngle) * BallSpeed);
}
public override void _PhysicsProcess(double delta)
{
Velocity = _velocity;
CollisionCheck(delta);
}
/// <summary>
/// this method moves the ball and bounces if it collides with something.
/// </summary>
/// <param name="delta">delta time from the _PhysicsProcess method.</param>
private void CollisionCheck(double delta)
{
var collision = MoveAndCollide(_velocity * delta);
if (collision == null) return;
_velocity = _velocity.Bounce(collision.GetNormal());
}
/// <summary>
/// this method generates a random number between 0 and 1 and
/// either returns Vector2.Left or Vector2.Right based on that number.
/// </summary>
private Vector2 GetRandomStartingDirection() {
using var rng = new RandomNumberGenerator();
rng.Randomize();
var range = rng.RandiRange(0,1);
if (range == 0) {
return Vector2.Left;
}
return Vector2.Right;
}
}