Pong/Scripts/Nodes/Ball.cs
Fries 9b0ebcefba walls can reset the ball to its starting position
WallManager binds to the BodyEntered signal on the Area2D class and
detects if the body that entered the area is the ball class, and if it
is, it will reset the ball to its starting position. right now, theres
no scoring system. this will be added later.
2023-05-19 00:18:38 -07:00

67 lines
1.9 KiB
C#

using Godot;
namespace Pong.Scripts.Nodes;
public partial class Ball : CharacterBody2D
{
[Export] private double _ballSpeed;
[Export] private double _maxRandomAngle;
/// <summary>
/// this property multiples the ballSpeed by the <see cref="Constants.Meter">Meter</see> constant.
/// </summary>
private double BallSpeed => _ballSpeed * Constants.Meter;
public override void _Ready()
{
FlickBall();
}
/// <summary>
/// flick the ball in a direction.
/// </summary>
internal void FlickBall()
{
// 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.
var randomAngle = new Vector2(0, rng.RandfRange(-_maxRandomAngle, _maxRandomAngle) * BallSpeed);
Velocity = GetRandomStartingDirection() * BallSpeed + randomAngle;
}
public override void _PhysicsProcess(double delta)
{
CollisionCheck(delta);
}
/// <summary>
/// this method moves the ball and bounces if it collides with something.
/// </summary>
/// <param name="delta">delta time from the <see cref="_PhysicsProcess">_PhysicsProcess</see> 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 <see cref="Vector2.Left">Vector2.Left</see> or <see cref="Vector2.Right">Vector2.Right</see>
/// based on that number.
/// </summary>
private static Vector2 GetRandomStartingDirection()
{
using var rng = new RandomNumberGenerator();
rng.Randomize();
var range = rng.RandiRange(0, 1);
if (range == 0)
{
return Vector2.Left;
}
return Vector2.Right;
}
}