From efcf9cfffefd62cac875537024d0029a72a56b76 Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Wed, 30 Sep 2015 17:55:40 +0300 Subject: [PATCH] Implement a basic scene class --- Makefile | 2 +- main.cpp => src/breakout.cpp | 61 ++++++++---------------------------- src/breakout.h | 6 ++++ src/scene.cpp | 38 ++++++++++++++++++++++ src/scene.h | 21 +++++++++++++ 5 files changed, 79 insertions(+), 49 deletions(-) rename main.cpp => src/breakout.cpp (53%) create mode 100644 src/breakout.h create mode 100644 src/scene.cpp create mode 100644 src/scene.h diff --git a/Makefile b/Makefile index 59fa52c..d8fcb54 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CC=clang++ all: build run build: - $(CC) -lSDL2 main.cpp -o breakout + $(CC) -lSDL2 src/scene.cpp src/breakout.cpp -o breakout run: ./breakout diff --git a/main.cpp b/src/breakout.cpp similarity index 53% rename from main.cpp rename to src/breakout.cpp index 1736d33..f6bebab 100644 --- a/main.cpp +++ b/src/breakout.cpp @@ -1,17 +1,7 @@ #include #include "SDL2/SDL.h" - -#define SCREEN_X 100 -#define SCREEN_Y 100 -#define SCREEN_WIDTH 640 -#define SCREEN_HEIGHT 480 -#define PAD_WIDTH 200 -#define PAD_HEIGHT 20 - -#define KEY_MOVE_STEP 5 - -#define BG_COLOR 0, 0, 0, 255 -#define PAD_COLOR 0, 0, 255, 255 +#include "breakout.h" +#include "scene.h" int main(int argc, char const *argv[]) { if (SDL_Init(SDL_INIT_VIDEO) != 0) { @@ -43,31 +33,14 @@ int main(int argc, char const *argv[]) { return 1; } - // Setting background color to black - SDL_SetRenderDrawColor(renderer, BG_COLOR); - SDL_RenderClear(renderer); - - // Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high. - SDL_Rect pad = { - .x = (SCREEN_WIDTH - PAD_WIDTH) / 2, - .y = (SCREEN_HEIGHT - PAD_HEIGHT), - .w = PAD_WIDTH, - .h = PAD_HEIGHT - }; - - // Set render color to blue ( rect will be rendered in this color ) - SDL_SetRenderDrawColor(renderer, PAD_COLOR); - - // Render rect - SDL_RenderFillRect(renderer, &pad); - - // Render the rect to the screen - SDL_RenderPresent(renderer); + Scene scene(window, renderer); SDL_Event e; bool quit = false; while (!quit) { + bool has_event = false; while (SDL_PollEvent(&e)) { + has_event = true; if (e.type == SDL_QUIT) { quit = true; } @@ -77,31 +50,23 @@ int main(int argc, char const *argv[]) { quit = true; break; case SDLK_LEFT: - pad.x -= KEY_MOVE_STEP; + scene.move_pad_relative(-KEY_MOVE_STEP); break; case SDLK_RIGHT: - pad.x += KEY_MOVE_STEP; + scene.move_pad_relative(KEY_MOVE_STEP); break; } } if (e.type == SDL_MOUSEMOTION) { - pad.x = e.motion.x - PAD_WIDTH / 2; - } - - if (pad.x < 0) { - pad.x = 0; - } else if (pad.x > SCREEN_WIDTH - PAD_WIDTH) { - pad.x = SCREEN_WIDTH - PAD_WIDTH; + scene.move_pad(e.motion.x - PAD_WIDTH / 2); } } - // Re-rendering - SDL_SetRenderDrawColor(renderer, BG_COLOR); - SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, PAD_COLOR); - SDL_RenderFillRect(renderer, &pad); - SDL_RenderPresent(renderer); - SDL_Delay(1); + if (has_event) { + scene.render(); + } else { + SDL_Delay(1); + } } SDL_DestroyWindow(window); diff --git a/src/breakout.h b/src/breakout.h new file mode 100644 index 0000000..7f46f95 --- /dev/null +++ b/src/breakout.h @@ -0,0 +1,6 @@ +#define SCREEN_X 300 +#define SCREEN_Y 100 +#define SCREEN_WIDTH 400 +#define SCREEN_HEIGHT 600 + +#define KEY_MOVE_STEP 5 diff --git a/src/scene.cpp b/src/scene.cpp new file mode 100644 index 0000000..93bbbbc --- /dev/null +++ b/src/scene.cpp @@ -0,0 +1,38 @@ +#include +#include "SDL2/SDL.h" +#include "breakout.h" +#include "scene.h" + +Scene::Scene(SDL_Window *w, SDL_Renderer *r) { + window = w; + renderer = r; + + pad.x = (SCREEN_WIDTH - PAD_WIDTH) / 2; + pad.y = (SCREEN_HEIGHT - PAD_HEIGHT); + pad.w = PAD_WIDTH; + pad.h = PAD_HEIGHT; +} + +Scene::~Scene() {} + +void Scene::render() { + SDL_SetRenderDrawColor(renderer, BG_COLOR); + SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, PAD_COLOR); + SDL_RenderFillRect(renderer, &pad); + SDL_RenderPresent(renderer); +} + +void Scene::move_pad(int x) { + pad.x = x; + + if (pad.x < 0) { + pad.x = 0; + } else if (pad.x > SCREEN_WIDTH - PAD_WIDTH) { + pad.x = SCREEN_WIDTH - PAD_WIDTH; + } +} + +void Scene::move_pad_relative(int delta) { + move_pad(pad.x + delta); +} diff --git a/src/scene.h b/src/scene.h new file mode 100644 index 0000000..8dfd520 --- /dev/null +++ b/src/scene.h @@ -0,0 +1,21 @@ +#define PAD_WIDTH 200 +#define PAD_HEIGHT 20 + +#define BG_COLOR 0, 0, 0, 255 +#define PAD_COLOR 0, 0, 255, 255 + +class Scene { +public: + Scene(SDL_Window *w, SDL_Renderer *r); + ~Scene(); + + void render(); + void move_pad(int x); + void move_pad_relative(int delta); +private: + SDL_Window *window; + SDL_Renderer *renderer; + + SDL_Rect pad; + SDL_Rect blocks[10]; +};