forces/DirectionalForce.js

import { Particle } from '../core/Particle.js';

import { Force } from './Force.js';

/**
 * @import { ForceConfig } from './Force.js';
 */

/**
 * DirectionalForce configuration options.
 * Includes all properties from {@link ForceConfig}.
 * @typedef {object} DirectionalForceConfig
 * @property {number} [ax=0] Horizontal acceleration component (in pixels per second).
 * @property {number} [ay=0] Vertical acceleration component (in pixels per second).
 */

/**
 * Environmental force that applies a constant directional push to particles.
 * @class
 * @extends Force
 */
export class DirectionalForce extends Force {
    /**
     * Current horizontal acceleration component (in pixels per second).
     * @type {number}
     */
    ax;

    /**
     * Current vertical acceleration component (in pixels per second).
     * @type {number}
     */
    ay;

    /**
     * Initializes a directional force with horizontal and vertical acceleration components.
     * @constructor
     * @param {DirectionalForceConfig} [config={}] DirectionalForce configuration options.
     */
    constructor(config = {}) {
        super(config);

        this.ax = config.ax ?? 0;
        this.ay = config.ay ?? 0;
    }

    /**
     * Changes a particle's velocity based on the force's horizontal and vertical acceleration.
     * @override
     * @param {Particle} particle Particle instance to affect.
     * @param {number} dt Time elapsed since the last frame (in seconds).
     * @returns {void}
     */
    apply(particle, dt) {
        particle.vx += this.ax * dt;
        particle.vy += this.ay * dt;
    }
}