This commit is contained in:
Andrew Haynes
2026-02-24 16:01:56 -05:00
commit 6b17d9c501
8 changed files with 261 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
---
BasedOnStyle: Google
Standard: Latest
# ColumnLimit: 80
UseTab: Always
TabWidth: 8
IndentWidth: 8
BreakBeforeBraces: Allman
SpaceBeforeCpp11BracedList: true
SeparateDefinitionBlocks: Always
Cpp11BracedListStyle: false
BreakAfterReturnType: TopLevel
AlignTrailingComments:
Kind: Always
ReflowComments: Always
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: AllIfsAndElse
AllowShortLoopsOnASingleLine: true
IndentAccessModifiers: false # Indent access specifiers by one level
AccessModifierOffset: -4 # Optional: adjust offset relative to the class indentation level
+2
View File
@@ -0,0 +1,2 @@
build/
.cache/
+44
View File
@@ -0,0 +1,44 @@
cmake_minimum_required(VERSION 4.2.1)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project(pong)
include_directories(include)
set(SOURCES
src/main.cpp
src/graphics.cpp
)
include(FetchContent)
FetchContent_Declare(SFML
GIT_REPOSITORY https://github.com/SFML/SFML.git
GIT_TAG 3.0.2
GIT_SHALLOW ON
EXCLUDE_FROM_ALL
SYSTEM)
FetchContent_MakeAvailable(SFML)
if(APPLE)
message(STATUS "Detected macOS: installing range-v3")
include(FetchContent)
FetchContent_Declare(
range-v3
GIT_REPOSITORY https://github.com/ericniebler/range-v3.git
GIT_TAG 0.12.0
GIT_SHALLOW ON
)
FetchContent_MakeAvailable(range-v3)
include_directories(${range-v3_SOURCE_DIR}/include)
endif()
add_executable(pong ${SOURCES})
target_link_libraries(pong
PRIVATE
SFML::Graphics
SFML::Window
SFML::System
)
BIN
View File
Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
#ifndef GLOBALS_HPP
#define GLOBALS_HPP
// General
#define TILESIZE 32.0f
#define WIDTH (TILESIZE * 16)
#define HEIGHT (TILESIZE * 13)
#define FPS 60
//Paddle
#define SIZE_X 10
#define SIZE_Y 50
#define POS_Y 200
#define VELOCITY 4
// Ball
#define VELOCITY_X 3
#define VELOCITY_Y 2
#endif
+45
View File
@@ -0,0 +1,45 @@
#ifndef GRAPHICS_HPP
#define GRAPHICS_HPP
// Ball, Paddle
#include <SFML/Graphics/CircleShape.hpp>
#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/System/Vector2.hpp>
#include "globals.hpp"
struct Ball
{
Ball(sf::Vector2f pos) : velocity({ VELOCITY_X, VELOCITY_Y })
{
object.setSize({ (float)SIZE_X / 2, (float)SIZE_X / 2 });
object.setPosition(pos);
};
sf::Vector2f velocity;
sf::RectangleShape object;
};
struct Paddle
{
Paddle(sf::Vector2f pos)
{
rect.setSize({ SIZE_X, SIZE_Y });
rect.setPosition(pos);
};
int points;
sf::RectangleShape rect;
};
void
check_and_move();
void
handle_ball();
extern Paddle p1;
extern Paddle p2;
extern Ball ball;
#endif
+84
View File
@@ -0,0 +1,84 @@
#include "graphics.hpp"
#include <SFML/Window/Keyboard.hpp>
#include "globals.hpp"
Paddle p1 { { (TILESIZE * 2) - SIZE_X, POS_Y } };
Paddle p2 { { WIDTH - (TILESIZE * 2), POS_Y } };
Ball ball { { (WIDTH / 2) - (3.0f / 2), (HEIGHT / 2) - (3.0f / 2) } };
void
check_and_move()
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W))
{
if (p1.rect.getPosition().y - VELOCITY > 0)
{
p1.rect.setPosition(
{ p1.rect.getPosition().x,
p1.rect.getPosition().y - VELOCITY });
}
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S))
{
if (p1.rect.getPosition().y + VELOCITY + SIZE_Y < HEIGHT)
{
p1.rect.setPosition(
{ p1.rect.getPosition().x,
p1.rect.getPosition().y + VELOCITY });
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Up))
{
if (p2.rect.getPosition().y - VELOCITY > 0)
{
p2.rect.setPosition(
{ p2.rect.getPosition().x,
p2.rect.getPosition().y - VELOCITY });
}
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Down))
{
if (p2.rect.getPosition().y + VELOCITY + SIZE_Y < HEIGHT)
{
p2.rect.setPosition(
{ p2.rect.getPosition().x,
p2.rect.getPosition().y + VELOCITY });
}
}
}
void
handle_ball()
{
if (ball.object.getPosition().y <= 0 ||
ball.object.getPosition().y >= HEIGHT - ball.object.getSize().y)
{
ball.velocity.y *= -1;
}
if (ball.object.getPosition().x <= 0)
{
ball.object.setPosition(
{ (WIDTH / 2) - (3.0f / 2), (HEIGHT / 2) - (3.0f / 2) });
p2.points++;
}
if (ball.object.getPosition().x >= WIDTH - ball.object.getSize().x)
{
ball.object.setPosition(
{ (WIDTH / 2) - (3.0f / 2), (HEIGHT / 2) - (3.0f / 2) });
p1.points++;
}
if (ball.object.getGlobalBounds().findIntersection(
p1.rect.getGlobalBounds()) ||
ball.object.getGlobalBounds().findIntersection(
p2.rect.getGlobalBounds()))
{
ball.velocity.x *= -1;
}
ball.object.move({ ball.velocity });
}
+43
View File
@@ -0,0 +1,43 @@
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <format>
#include "globals.hpp"
#include "graphics.hpp"
int
main()
{
sf::RenderWindow window(sf::VideoMode({ (int)WIDTH, (int)HEIGHT }),
"Pong", sf::Style::Default);
window.setFramerateLimit(FPS);
sf::Font font("../assets/pixel.ttf");
sf::Text text(font, "test");
text.setCharacterSize(16);
text.setPosition({ WIDTH / 4 + TILESIZE / 1.5, TILESIZE });
while (window.isOpen())
{
text.setString(std::format("P1: {} : P2: {}", p1.points, p2.points));
window.clear(sf::Color::Black);
while (const std::optional event = window.pollEvent())
{
if (event->is<sf::Event::Closed>())
{
window.close();
}
}
check_and_move();
handle_ball();
window.draw(p1.rect);
window.draw(p2.rect);
window.draw(ball.object);
window.draw(text);
window.display();
}
return 0;
}