3#include <SDL2/SDL_timer.h>
31int main (
int argc,
char **argv)
34 int status = std::system(
"pwd");
36 if (SDL_Init(SDL_INIT_VIDEO) != 0) {
37 fprintf(stderr,
"SDL failed to initialise: %s\n", SDL_GetError());
42 std::shared_ptr<SDL_Window> window (SDL_CreateWindow(
"SDL Example",
43 SDL_WINDOWPOS_UNDEFINED,
44 SDL_WINDOWPOS_UNDEFINED,
47 0), SDL_DestroyWindow);
50 if (window ==
nullptr) {
51 fprintf(stderr,
"SDL window failed to initialise: %s\n", SDL_GetError());
55 std::shared_ptr<SDL_Renderer> renderer (SDL_CreateRenderer(window.get(),
57 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
58 ), SDL_DestroyRenderer);
60 if (renderer ==
nullptr){
61 fprintf(stderr,
"SDL renderer failed to initialise: %s\n", SDL_GetError());
65 int imgFlags = IMG_INIT_PNG;
66 if (!(IMG_Init(imgFlags) & imgFlags)) {
67 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError());
77 std::cout<<
"width: "<<
WIDTH<<
"height: "<<
HEIGHT<<std::endl;
78 SDL_RenderClear(renderer.get());
94 int rectWidth = (menu.w-40) / 3;
98 std::array<std::string, 3> imagePaths = {
100 "../assets/triangle.png",
104 std::array<SDL_Texture*, 3> textures{};
105 for (
size_t i = 0; i < textures.size(); ++i) {
106 SDL_Surface* loadedSurface = IMG_Load(imagePaths[i].c_str());
107 if (loadedSurface == NULL) {
108 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Unable to load image %s! SDL_image Error: %s\n", imagePaths[i].c_str(), IMG_GetError());
111 textures[i] = SDL_CreateTextureFromSurface(renderer.get(), loadedSurface);
112 if (textures[i] == NULL) {
113 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Unable to create texture from %s! SDL Error: %s\n", imagePaths[i].c_str(), SDL_GetError());
116 SDL_FreeSurface(loadedSurface);
120 std::shared_ptr<Grille> PreGrillePtr = std::make_shared<Grille>(std::move(pregrille));
121 std::shared_ptr<Ball> BallPtr2 = std::make_shared<Ball>(std::move(ball2));
122 std::shared_ptr<PLATFORM> PlatPtr = std::make_shared<PLATFORM>(std::move(plat));
123 std::shared_ptr<WALL> lWall = std::make_shared<WALL>(std::move(left));
124 std::shared_ptr<WALL> rWall = std::make_shared<WALL>(std::move(right));
125 std::shared_ptr<WALL> tWall = std::make_shared<WALL>(std::move(top));
126 std::shared_ptr<WALL> bWall = std::make_shared<WALL>(std::move(bottom));
135 for (
const auto& row : PreGrillePtr->grille) {
136 for (
const auto& brique : row) {
140 SDL_Color white = {255,255,255,255};
142 int selectedRectIndex = 0;
148 SDL_RenderClear(renderer.get());
149 while (SDL_PollEvent(&e)){
150 if (e.type == SDL_QUIT){
153 if (e.type == SDL_KEYDOWN){
155 if (e.key.keysym.sym == SDLK_LEFT || e.key.keysym.scancode == 4) selectedRectIndex = (selectedRectIndex - 1 + 3) % 3;
156 else if (e.key.keysym.sym == SDLK_RIGHT || e.key.keysym.scancode == 7) selectedRectIndex = (selectedRectIndex + 1) % 3;
157 else if (e.key.keysym.sym == SDLK_RETURN){
159 for (
auto texture : textures) {
160 SDL_DestroyTexture(texture);
162 for (
const auto& row : PreGrillePtr->grille) {
163 for (
const auto& brique : row) {
168 std::shared_ptr<Grille> GrillePtr = std::make_shared<Grille>(std::move(grille));
169 for (
const auto& row : GrillePtr->grille) {
170 for (
const auto& brique : row) {
176 PlatPtr->input(e.key,
false);
179 if (e.type == SDL_KEYUP){
180 PlatPtr->input(e.key,
true);
182 if (e.type == SDL_MOUSEMOTION && choice){
183 PlatPtr->Velocity= {0,0};
185 SDL_GetMouseState(&x,&y);
186 auto col = std::dynamic_pointer_cast<RectCollider>(PlatPtr->getCollider());
187 PlatPtr->getCollider()->p = {
static_cast<float>(x) -
188 col->width/2,(
HEIGHT/4)*3-5};
193 for(
auto object:collisionManager.
colliders){
194 object->render(renderer,white,white);
195 auto movingObject = std::dynamic_pointer_cast<MovingObject>(
object);
197 if (movingObject && choice){
198 movingObject->move();
202 SDL_SetRenderDrawColor(renderer.get(), 255,192,203,255);
204 SDL_RenderFillRect(renderer.get(),&menu);
206 for (
size_t i = 0; i < textures.size(); ++i) {
207 SDL_Rect dstRect = {menu.x + gap + (rectWidth + gap) *
static_cast<int>(i), menu.y + 10, rectWidth, menu.h / 3};
208 SDL_RenderCopy(renderer.get(), textures[i], NULL, &dstRect);
210 if (i == selectedRectIndex) {
211 SDL_SetRenderDrawColor(renderer.get(), 255, 0, 0, 255);
212 SDL_RenderDrawRect(renderer.get(), &dstRect);
215 SDL_SetRenderDrawColor(renderer.get(), 0,0,0,255);
219 SDL_RenderPresent(renderer.get());
222 SDL_DestroyRenderer(renderer.get());
223 SDL_DestroyWindow(window.get());
The Ball class represents a ball object in the game.
The CollisionManager class manages collision detection and resolution.
bool detectCollisions()
Detects collisions between collisionObject.
void removeCollider(const std::shared_ptr< CollidingObject > &collider)
Removes a collisionObject from the collision manager.
std::vector< std::shared_ptr< CollidingObject > > colliders
The collection of colliding objects.
void addCollider(const std::shared_ptr< CollidingObject > &collider)
Adds a collisionObject to the collision manager.
The Grille class represents the game grid for blocks/bricks.
The PLATFORM class represents a movable platform object.
int main(int argc, char **argv)
The main function of the game.