diff --git a/Header/Core/GameLoop.h b/Header/Core/GameLoop.h new file mode 100644 index 00000000..502187e2 --- /dev/null +++ b/Header/Core/GameLoop.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include "../../Header/Core/GameWindowManager.h" +#include "../../Header/Event/EventManager.h" +#include "../../Header/Gameplay/GameplayManager.h" + +using namespace sf; +using namespace Core; +using namespace CoustomEvent; +using namespace std; +using namespace Gameplay; + +namespace Core { + + class GameLoop + { + private: + GameplayManager* gameplay_manager; + GameWindowManager* game_window_manager; + EventManager* event_manager; + + public: + void initialize(); + + bool isGameRunning(); + void update(); + void pollEvent(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Core/GameWindowManager.h b/Header/Core/GameWindowManager.h new file mode 100644 index 00000000..ec1b5b93 --- /dev/null +++ b/Header/Core/GameWindowManager.h @@ -0,0 +1,24 @@ +#pragma once +#include + +using namespace sf; + +namespace Core { + class GameWindowManager { + private: + int game_window_width = 1280; + int game_window_height = 720; + std::string game_title = "SFML-Pong"; + + RenderWindow* game_window; + void createGameWindow(); + + public: + void initialize(); + RenderWindow* getGameWindow(); + bool isGameRunning(); + //void render(); + void clearGameWindow(); + void displayGameWindow(); + }; +} \ No newline at end of file diff --git a/Header/Event/EventManager.h b/Header/Event/EventManager.h new file mode 100644 index 00000000..b8d5ef12 --- /dev/null +++ b/Header/Event/EventManager.h @@ -0,0 +1,14 @@ +#pragma once +#include +#include +using namespace sf; + +namespace CoustomEvent { + class EventManager { + public: + void pollEvents(RenderWindow* game_window); + bool isKeyPressed(Keyboard::Key key); + bool isLeftMouseButtonClicked(); + + }; +} \ No newline at end of file diff --git a/Header/Gameplay/Ball/Ball.h b/Header/Gameplay/Ball/Ball.h new file mode 100644 index 00000000..bb523c5c --- /dev/null +++ b/Header/Gameplay/Ball/Ball.h @@ -0,0 +1,52 @@ +#pragma once +#include +#include "../../Header/Gameplay/Paddle/Paddle.h" + +using namespace sf; +using namespace std; + +namespace Gameplay { + class Ball { + private: + Texture pong_ball_texture; + Sprite pong_ball_sprite; + + string texture_path = "Assets/Textures/Ball.png"; + CircleShape ball_sprite; + + const float scale_x = 0.02f; + const float scale_y = 0.02f; + + const float radius = 10.0f; + const float position_x = 615.0f; + const float position_y = 335.0f; + + float ball_speed = 0.1f; + Vector2f velocity = Vector2f(ball_speed, ball_speed); + + const float top_boundary = 20.0f; + const float bottom_boundary = 700.0f; + + const float left_boundary = 0.0f; + const float right_boundary = 1280.0f; + + //Center Position + const float center_position_x = 615.0f; + const float center_position_y = 325.0f; + + void loadTexture(); + void initializeVariables(); + void move(); + void onCollision(Paddle* player1, Paddle* player2); + + public: + Ball(); + void handlePaddleCollision(Paddle* player1, Paddle* player2); + void handleBoundaryCollision(); + void handleOutofBoundCollision(); + void reset(); + void update(Paddle* player1, Paddle* player2); + void render(RenderWindow* game_window); + + }; +} \ No newline at end of file diff --git a/Header/Gameplay/Boundary/Boundary.h b/Header/Gameplay/Boundary/Boundary.h new file mode 100644 index 00000000..c07c4c8b --- /dev/null +++ b/Header/Gameplay/Boundary/Boundary.h @@ -0,0 +1,59 @@ +#pragma once +#include + +using namespace sf; +namespace Gameplay { + class Boundary + { + private: + RectangleShape topBoundary; + RectangleShape leftBoundary; + RectangleShape centerLine; + RectangleShape rightBoundary; + RectangleShape bottomBoundary; + + //horizontal values for boundarys + const float horizontal_boundary_width = 1280.0f; + const float horizontal_boundary_height = 20.0f; + + //vertical values for boundarys + const float vertical_boundary_width = 20.0f; + const float vertical_boundary_height = 720.0f; + + const float right_position_x = 1260.0f; + const float right_position_y = 0.0f; + + const float top_position_x = 0.0f; + const float top_position_y = 0.0f; + + const float left_position_x = 0.0f; + const float left_position_y = 0.0f; + + const float bottom_position_x = 0.0f; + const float bottom_position_y = 700.0f; + + //Boundary Colors + const Color boundary_color = Color::Blue; + const Color center_line_color = Color::White; + + //center lines properties + const float center_line_width = 10.0f; + const float center_line_height = 680.0f; + const float center_line_position_x = 640.0f; + const float center_line_position_y = 20.0f; + + //create boundaries and the center line + void createTopBoundary(); + void createBottomBoundary(); + void createLeftBoundary(); + void createRightBoundary(); + + void createCenterLine(); + + public: + Boundary(); + void update(); + void render(RenderWindow* game_window); + + }; +} diff --git a/Header/Gameplay/GameplayManager.h b/Header/Gameplay/GameplayManager.h new file mode 100644 index 00000000..0994da36 --- /dev/null +++ b/Header/Gameplay/GameplayManager.h @@ -0,0 +1,35 @@ +#pragma once +#include "Paddle/Paddle.h" +#include "Ball/Ball.h" +#include "Boundary/Boundary.h" +#include "../../Header/Event/EventManager.h" + +using namespace CoustomEvent; + +namespace Gameplay { + class GameplayManager { + private: + float player1_position_x = 40.0f; + float player1_position_y = 300.0f; + + float player2_position_x = 1210.0f; + float player2_position_y = 300.0f; + + Ball* ball; + Paddle* player1; + Paddle* player2; + EventManager* event_manager; + Boundary* boundary; + + void initialize(); + + public: + GameplayManager(EventManager* manager); + //GameplayManager(); + void update(); + void render(RenderWindow* game_window); + + + }; + +} \ No newline at end of file diff --git a/Header/Gameplay/Paddle/Paddle.h b/Header/Gameplay/Paddle/Paddle.h new file mode 100644 index 00000000..7a3b8808 --- /dev/null +++ b/Header/Gameplay/Paddle/Paddle.h @@ -0,0 +1,31 @@ +#pragma once +#include + +using namespace sf; + +namespace Gameplay { + class Paddle { + private: + RectangleShape paddle_sprite; + + const float paddle_width = 20.0f; + const float paddle_height = 140.0f; + + float paddle_speed = 0.1f; + float topBoundary = 20.0f; + float bottomBoundary = 700.0f; + + void createPaddle(float position_x, float position_y); + void movePaddle(bool move_up_key_pressed, bool move_down_key_pressed); + + public: + + Paddle(float position_x, float position_y); + + RectangleShape getPaddleSprite(); + void reset(float position_x, float position_y); + + void update(bool move_up_key_pressed, bool move_down_key_pressed); + void render(RenderWindow* game_window); + }; +} \ No newline at end of file diff --git a/Main.cpp b/Main.cpp index 63172679..c17e2976 100644 --- a/Main.cpp +++ b/Main.cpp @@ -1,23 +1,31 @@ #include #include +#include "../../Header/Core/GameWindowManager.h" +#include "../../Header/Event/EventManager.h" +#include "../../Header/Core/GameLoop.h" + +using namespace sf; +using namespace Core; int main() { - sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); - sf::CircleShape shape(100.f); - shape.setFillColor(sf::Color::Green); - - while (window.isOpen()) - { - sf::Event event; - while (window.pollEvent(event)) - { - if (event.type == sf::Event::Closed) - window.close(); - } - - window.clear(); - window.draw(shape); - window.display(); + CoustomEvent::EventManager eventManager; + Core::GameWindowManager gameWindowManager; + GameLoop* game_loop_manager = new GameLoop(); + + + gameWindowManager.initialize(); + game_loop_manager->initialize(); + + + + while (game_loop_manager->isGameRunning()) { + + game_loop_manager->pollEvent(); + game_loop_manager->update(); + game_loop_manager->render(); } -} \ No newline at end of file + return 0; +} + + diff --git a/Pong-SFML.vcxproj b/Pong-SFML.vcxproj index 846b9372..9f576d4a 100644 --- a/Pong-SFML.vcxproj +++ b/Pong-SFML.vcxproj @@ -1,4 +1,4 @@ - + @@ -134,6 +134,22 @@ + + + + + + + + + + + + + + + + diff --git a/Pong-SFML.vcxproj.filters b/Pong-SFML.vcxproj.filters index bcd8c3e7..0810b03f 100644 --- a/Pong-SFML.vcxproj.filters +++ b/Pong-SFML.vcxproj.filters @@ -45,55 +45,49 @@ Source Files - + Source Files - + Source Files - + Source Files - - Source Files - - + Source Files - + Source Files - + Source Files - + Source Files - - Header Files\Header\GamePlay\Ball - - - Header Files\Header\GamePlay\Boundary + + Header Files - Header Files\Header\Events + Header Files - - Header Files\Header\GamePlay + + Header Files - - Header Files\Header\Core + + Header Files - - Header Files\Header\GamePlay\Paddle + + Header Files - - Header Files\Header\Utility + + Header Files - - Header Files\Header\UI + + Header Files \ No newline at end of file diff --git a/SFML/include/SFML/Audio.hpp b/SFML/include/SFML/Audio.hpp new file mode 100644 index 00000000..d5f798d1 --- /dev/null +++ b/SFML/include/SFML/Audio.hpp @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_AUDIO_HPP +#define SFML_AUDIO_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif // SFML_AUDIO_HPP + +//////////////////////////////////////////////////////////// +/// \defgroup audio Audio module +/// +/// Sounds, streaming (musics or custom sources), recording, +/// spatialization. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML/include/SFML/Audio/AlResource.hpp b/SFML/include/SFML/Audio/AlResource.hpp new file mode 100644 index 00000000..7ac21fe8 --- /dev/null +++ b/SFML/include/SFML/Audio/AlResource.hpp @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_ALRESOURCE_HPP +#define SFML_ALRESOURCE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Base class for classes that require an OpenAL context +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API AlResource +{ +protected: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + AlResource(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~AlResource(); +}; + +} // namespace sf + + +#endif // SFML_ALRESOURCE_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::AlResource +/// \ingroup audio +/// +/// This class is for internal use only, it must be the base +/// of every class that requires a valid OpenAL context in +/// order to work. +/// +//////////////////////////////////////////////////////////// diff --git a/SFML/include/SFML/Audio/Export.hpp b/SFML/include/SFML/Audio/Export.hpp new file mode 100644 index 00000000..e2531514 --- /dev/null +++ b/SFML/include/SFML/Audio/Export.hpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_AUDIO_EXPORT_HPP +#define SFML_AUDIO_EXPORT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +// Define portable import / export macros +//////////////////////////////////////////////////////////// +#if defined(SFML_AUDIO_EXPORTS) + + #define SFML_AUDIO_API SFML_API_EXPORT + +#else + + #define SFML_AUDIO_API SFML_API_IMPORT + +#endif + + +#endif // SFML_AUDIO_EXPORT_HPP diff --git a/SFML/include/SFML/Audio/InputSoundFile.hpp b/SFML/include/SFML/Audio/InputSoundFile.hpp new file mode 100644 index 00000000..0a02b140 --- /dev/null +++ b/SFML/include/SFML/Audio/InputSoundFile.hpp @@ -0,0 +1,268 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_INPUTSOUNDFILE_HPP +#define SFML_INPUTSOUNDFILE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; +class SoundFileReader; + +//////////////////////////////////////////////////////////// +/// \brief Provide read access to sound files +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API InputSoundFile : NonCopyable +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + InputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Destructor + /// + //////////////////////////////////////////////////////////// + ~InputSoundFile(); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file from the disk for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC, MP3. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// Because of minimp3_ex limitation, for MP3 files with big (>16kb) APEv2 tag, + /// it may not be properly removed, tag data will be treated as MP3 data + /// and there is a low chance of garbage decoded at the end of file. + /// See also: https://github.com/lieff/minimp3 + /// + /// \param filename Path of the sound file to load + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromFile(const std::string& filename); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file in memory for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// \param data Pointer to the file data in memory + /// \param sizeInBytes Size of the data to load, in bytes + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromMemory(const void* data, std::size_t sizeInBytes); + + //////////////////////////////////////////////////////////// + /// \brief Open a sound file from a custom stream for reading + /// + /// The supported audio formats are: WAV (PCM only), OGG/Vorbis, FLAC. + /// The supported sample sizes for FLAC and WAV are 8, 16, 24 and 32 bit. + /// + /// \param stream Source stream to read from + /// + /// \return True if the file was successfully opened + /// + //////////////////////////////////////////////////////////// + bool openFromStream(InputStream& stream); + + //////////////////////////////////////////////////////////// + /// \brief Get the total number of audio samples in the file + /// + /// \return Number of samples + /// + //////////////////////////////////////////////////////////// + Uint64 getSampleCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the number of channels used by the sound + /// + /// \return Number of channels (1 = mono, 2 = stereo) + /// + //////////////////////////////////////////////////////////// + unsigned int getChannelCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the sample rate of the sound + /// + /// \return Sample rate, in samples per second + /// + //////////////////////////////////////////////////////////// + unsigned int getSampleRate() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the total duration of the sound file + /// + /// This function is provided for convenience, the duration is + /// deduced from the other sound file attributes. + /// + /// \return Duration of the sound file + /// + //////////////////////////////////////////////////////////// + Time getDuration() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the read offset of the file in time + /// + /// \return Time position + /// + //////////////////////////////////////////////////////////// + Time getTimeOffset() const; + + //////////////////////////////////////////////////////////// + /// \brief Get the read offset of the file in samples + /// + /// \return Sample position + /// + //////////////////////////////////////////////////////////// + Uint64 getSampleOffset() const; + + //////////////////////////////////////////////////////////// + /// \brief Change the current read position to the given sample offset + /// + /// This function takes a sample offset to provide maximum + /// precision. If you need to jump to a given time, use the + /// other overload. + /// + /// The sample offset takes the channels into account. + /// If you have a time offset instead, you can easily find + /// the corresponding sample offset with the following formula: + /// `timeInSeconds * sampleRate * channelCount` + /// If the given offset exceeds to total number of samples, + /// this function jumps to the end of the sound file. + /// + /// \param sampleOffset Index of the sample to jump to, relative to the beginning + /// + //////////////////////////////////////////////////////////// + void seek(Uint64 sampleOffset); + + //////////////////////////////////////////////////////////// + /// \brief Change the current read position to the given time offset + /// + /// Using a time offset is handy but imprecise. If you need an accurate + /// result, consider using the overload which takes a sample offset. + /// + /// If the given time exceeds to total duration, this function jumps + /// to the end of the sound file. + /// + /// \param timeOffset Time to jump to, relative to the beginning + /// + //////////////////////////////////////////////////////////// + void seek(Time timeOffset); + + //////////////////////////////////////////////////////////// + /// \brief Read audio samples from the open file + /// + /// \param samples Pointer to the sample array to fill + /// \param maxCount Maximum number of samples to read + /// + /// \return Number of samples actually read (may be less than \a maxCount) + /// + //////////////////////////////////////////////////////////// + Uint64 read(Int16* samples, Uint64 maxCount); + + //////////////////////////////////////////////////////////// + /// \brief Close the current file + /// + //////////////////////////////////////////////////////////// + void close(); + +private: + + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + SoundFileReader* m_reader; //!< Reader that handles I/O on the file's format + InputStream* m_stream; //!< Input stream used to access the file's data + bool m_streamOwned; //!< Is the stream internal or external? + Uint64 m_sampleOffset; //!< Sample Read Position + Uint64 m_sampleCount; //!< Total number of samples in the file + unsigned int m_channelCount; //!< Number of channels of the sound + unsigned int m_sampleRate; //!< Number of samples per second +}; + +} // namespace sf + + +#endif // SFML_INPUTSOUNDFILE_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::InputSoundFile +/// \ingroup audio +/// +/// This class decodes audio samples from a sound file. It is +/// used internally by higher-level classes such as sf::SoundBuffer +/// and sf::Music, but can also be useful if you want to process +/// or analyze audio files without playing them, or if you want to +/// implement your own version of sf::Music with more specific +/// features. +/// +/// Usage example: +/// \code +/// // Open a sound file +/// sf::InputSoundFile file; +/// if (!file.openFromFile("music.ogg")) +/// /* error */; +/// +/// // Print the sound attributes +/// std::cout << "duration: " << file.getDuration().asSeconds() << std::endl; +/// std::cout << "channels: " << file.getChannelCount() << std::endl; +/// std::cout << "sample rate: " << file.getSampleRate() << std::endl; +/// std::cout << "sample count: " << file.getSampleCount() << std::endl; +/// +/// // Read and process batches of samples until the end of file is reached +/// sf::Int16 samples[1024]; +/// sf::Uint64 count; +/// do +/// { +/// count = file.read(samples, 1024); +/// +/// // process, analyze, play, convert, or whatever +/// // you want to do with the samples... +/// } +/// while (count > 0); +/// \endcode +/// +/// \see sf::SoundFileReader, sf::OutputSoundFile +/// +//////////////////////////////////////////////////////////// diff --git a/SFML/include/SFML/Audio/Listener.hpp b/SFML/include/SFML/Audio/Listener.hpp new file mode 100644 index 00000000..edfe6502 --- /dev/null +++ b/SFML/include/SFML/Audio/Listener.hpp @@ -0,0 +1,234 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_LISTENER_HPP +#define SFML_LISTENER_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief The audio listener is the point in the scene +/// from where all the sounds are heard +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API Listener +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Change the global volume of all the sounds and musics + /// + /// The volume is a number between 0 and 100; it is combined with + /// the individual volume of each sound / music. + /// The default value for the volume is 100 (maximum). + /// + /// \param volume New global volume, in the range [0, 100] + /// + /// \see getGlobalVolume + /// + //////////////////////////////////////////////////////////// + static void setGlobalVolume(float volume); + + //////////////////////////////////////////////////////////// + /// \brief Get the current value of the global volume + /// + /// \return Current global volume, in the range [0, 100] + /// + /// \see setGlobalVolume + /// + //////////////////////////////////////////////////////////// + static float getGlobalVolume(); + + //////////////////////////////////////////////////////////// + /// \brief Set the position of the listener in the scene + /// + /// The default listener's position is (0, 0, 0). + /// + /// \param x X coordinate of the listener's position + /// \param y Y coordinate of the listener's position + /// \param z Z coordinate of the listener's position + /// + /// \see getPosition, setDirection + /// + //////////////////////////////////////////////////////////// + static void setPosition(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the position of the listener in the scene + /// + /// The default listener's position is (0, 0, 0). + /// + /// \param position New listener's position + /// + /// \see getPosition, setDirection + /// + //////////////////////////////////////////////////////////// + static void setPosition(const Vector3f& position); + + //////////////////////////////////////////////////////////// + /// \brief Get the current position of the listener in the scene + /// + /// \return Listener's position + /// + /// \see setPosition + /// + //////////////////////////////////////////////////////////// + static Vector3f getPosition(); + + //////////////////////////////////////////////////////////// + /// \brief Set the forward vector of the listener in the scene + /// + /// The direction (also called "at vector") is the vector + /// pointing forward from the listener's perspective. Together + /// with the up vector, it defines the 3D orientation of the + /// listener in the scene. The direction vector doesn't + /// have to be normalized. + /// The default listener's direction is (0, 0, -1). + /// + /// \param x X coordinate of the listener's direction + /// \param y Y coordinate of the listener's direction + /// \param z Z coordinate of the listener's direction + /// + /// \see getDirection, setUpVector, setPosition + /// + //////////////////////////////////////////////////////////// + static void setDirection(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the forward vector of the listener in the scene + /// + /// The direction (also called "at vector") is the vector + /// pointing forward from the listener's perspective. Together + /// with the up vector, it defines the 3D orientation of the + /// listener in the scene. The direction vector doesn't + /// have to be normalized. + /// The default listener's direction is (0, 0, -1). + /// + /// \param direction New listener's direction + /// + /// \see getDirection, setUpVector, setPosition + /// + //////////////////////////////////////////////////////////// + static void setDirection(const Vector3f& direction); + + //////////////////////////////////////////////////////////// + /// \brief Get the current forward vector of the listener in the scene + /// + /// \return Listener's forward vector (not normalized) + /// + /// \see setDirection + /// + //////////////////////////////////////////////////////////// + static Vector3f getDirection(); + + //////////////////////////////////////////////////////////// + /// \brief Set the upward vector of the listener in the scene + /// + /// The up vector is the vector that points upward from the + /// listener's perspective. Together with the direction, it + /// defines the 3D orientation of the listener in the scene. + /// The up vector doesn't have to be normalized. + /// The default listener's up vector is (0, 1, 0). It is usually + /// not necessary to change it, especially in 2D scenarios. + /// + /// \param x X coordinate of the listener's up vector + /// \param y Y coordinate of the listener's up vector + /// \param z Z coordinate of the listener's up vector + /// + /// \see getUpVector, setDirection, setPosition + /// + //////////////////////////////////////////////////////////// + static void setUpVector(float x, float y, float z); + + //////////////////////////////////////////////////////////// + /// \brief Set the upward vector of the listener in the scene + /// + /// The up vector is the vector that points upward from the + /// listener's perspective. Together with the direction, it + /// defines the 3D orientation of the listener in the scene. + /// The up vector doesn't have to be normalized. + /// The default listener's up vector is (0, 1, 0). It is usually + /// not necessary to change it, especially in 2D scenarios. + /// + /// \param upVector New listener's up vector + /// + /// \see getUpVector, setDirection, setPosition + /// + //////////////////////////////////////////////////////////// + static void setUpVector(const Vector3f& upVector); + + //////////////////////////////////////////////////////////// + /// \brief Get the current upward vector of the listener in the scene + /// + /// \return Listener's upward vector (not normalized) + /// + /// \see setUpVector + /// + //////////////////////////////////////////////////////////// + static Vector3f getUpVector(); +}; + +} // namespace sf + + +#endif // SFML_LISTENER_HPP + + +//////////////////////////////////////////////////////////// +/// \class sf::Listener +/// \ingroup audio +/// +/// The audio listener defines the global properties of the +/// audio environment, it defines where and how sounds and musics +/// are heard. If sf::View is the eyes of the user, then sf::Listener +/// is his ears (by the way, they are often linked together -- +/// same position, orientation, etc.). +/// +/// sf::Listener is a simple interface, which allows to setup the +/// listener in the 3D audio environment (position, direction and +/// up vector), and to adjust the global volume. +/// +/// Because the listener is unique in the scene, sf::Listener only +/// contains static functions and doesn't have to be instantiated. +/// +/// Usage example: +/// \code +/// // Move the listener to the position (1, 0, -5) +/// sf::Listener::setPosition(1, 0, -5); +/// +/// // Make it face the right axis (1, 0, 0) +/// sf::Listener::setDirection(1, 0, 0); +/// +/// // Reduce the global volume +/// sf::Listener::setGlobalVolume(50); +/// \endcode +/// +//////////////////////////////////////////////////////////// diff --git a/SFML/include/SFML/Audio/Music.hpp b/SFML/include/SFML/Audio/Music.hpp new file mode 100644 index 00000000..4c4eefb2 --- /dev/null +++ b/SFML/include/SFML/Audio/Music.hpp @@ -0,0 +1,337 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2023 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_MUSIC_HPP +#define SFML_MUSIC_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include + + +namespace sf +{ +class InputStream; + +//////////////////////////////////////////////////////////// +/// \brief Streamed music played from an audio file +/// +//////////////////////////////////////////////////////////// +class SFML_AUDIO_API Music : public SoundStream +{ +public: + + //////////////////////////////////////////////////////////// + /// \brief Structure defining a time range using the template type + /// + //////////////////////////////////////////////////////////// + template + struct Span + { + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + //////////////////////////////////////////////////////////// + Span() + { + + } + + //////////////////////////////////////////////////////////// + /// \brief Initialization constructor + /// + /// \param off Initial Offset + /// \param len Initial Length + /// + //////////////////////////////////////////////////////////// + Span(T off, T len): + offset(off), + length(len) + { + + } + + T offset; //!< The beginning offset of the time range + T length; //!< The length of the time range + }; + + // Define the relevant Span types + typedef Span