From c154d6cca660bab6ec4e5dd0aedd87de02884fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Wed, 26 Nov 2025 01:40:35 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=BD=E3=83=95=E3=83=88=E3=83=AD=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E7=84=A1=E7=90=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + main.cc | 2 +- src/ball.hh | 2 ++ src/brick.cc | 38 ++++++++++++++++++++++++++---- src/player.hh | 2 +- src/render.cc | 65 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/render.hh | 3 ++- 7 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..517b0c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +brickbreaker diff --git a/main.cc b/main.cc index f0d71a2..97f207a 100644 --- a/main.cc +++ b/main.cc @@ -60,7 +60,7 @@ int main(void) { if (!r.gameover) { r.update(r, p, bl, br); } - r.input(p); + r.input(r, p, bl, br); r.render(p, bl, br); } diff --git a/src/ball.hh b/src/ball.hh index 9f03519..e8d6960 100644 --- a/src/ball.hh +++ b/src/ball.hh @@ -13,6 +13,8 @@ class Ball { float xvelocity; float yvelocity; + float xvelSave; + float yvelSave; SDL_Rect ball; diff --git a/src/brick.cc b/src/brick.cc index f28c4e4..dca6059 100644 --- a/src/brick.cc +++ b/src/brick.cc @@ -29,7 +29,6 @@ void Brick::resetBricks(Render &r, Player &p, Ball &bl) { r.c6g = rand() % 256; r.c6b = rand() % 256; - if (r.level > 1) { Mix_HaltMusic(); } @@ -51,13 +50,42 @@ void Brick::resetBricks(Render &r, Player &p, Ball &bl) { Brick::bricks[i] = 1; } - bl.size -= 2; - bl.ballspeed += 1.4f; - p.player.w -= 1.4f; + int pw = 620 / 4; + + if (r.level == 1) { + bl.size = 16; + bl.ballspeed = 8.f; + p.player.w = pw; + } else if (r.level == 2) { + bl.size = 14; + bl.ballspeed = 9.4f; + p.player.w = pw - 1.4; + } else if (r.level == 3) { + bl.size = 12; + bl.ballspeed = 10.8f; + p.player.w = pw - (1.4 * 2); + } else if (r.level == 4) { + bl.size = 10; + bl.ballspeed = 12.2f; + p.player.w = pw - (1.4 * 3); + } else if (r.level == 5) { + bl.size = 8; + bl.ballspeed = 13.6f; + p.player.w = pw - (1.4 * 4); + } else if (r.level == 6) { + bl.size = 6; + bl.ballspeed = 15.f; + p.player.w = pw - (1.4 * 5); + } else if (r.level == 7) { + bl.size = 4; + bl.ballspeed = 16.4f; + p.player.w = pw - (1.4 * 6); + } + p.player.x = (r.width / 2) - (p.player.w / 2); - bl.ball.y = p.player.y - (p.player.h * 4); bl.yvelocity = bl.ballspeed / 2; bl.xvelocity = 0; + bl.ball.y = p.player.y - (p.player.h * 4); bl.ball.x = r.width / 2 - (bl.size / 2); } diff --git a/src/player.hh b/src/player.hh index 3e2cd05..908349a 100644 --- a/src/player.hh +++ b/src/player.hh @@ -14,7 +14,7 @@ class Player { int scoreMultiplier = 1; int livesCount = 3; - Player(Render& r) { + Player(Render &r) { player.h = 12; player.y = r.height - player.h - 32; player.w = r.width / 4; diff --git a/src/render.cc b/src/render.cc index ca999c7..c518932 100644 --- a/src/render.cc +++ b/src/render.cc @@ -3,7 +3,7 @@ #include "player.hh" #include "brick.hh" -#define PI 3.14 +#define DEBUG false void Render::gameOver(Player &p, Brick &br, bool winner) { if (winner) { @@ -41,10 +41,16 @@ void Render::update(Render &r, Player &p, Ball &bl, Brick &br) { if (SDL_HasIntersection(&bl.ball, &p.player)) { double rel = (p.player.x + ((float)p.player.w/2)) - ((float)bl.ball.x + ((float)bl.size/2)); double norm = rel / ((float)p.player.w/2); - double bounce = norm * (5*PI/12); + double bounce = norm * (5 * M_PI / 12); + if (fabs(bounce - bounceSave) <= .04) bounce += .4; bl.yvelocity = -bl.ballspeed * cos(bounce); bl.xvelocity = bl.ballspeed * -sin(bounce); + + if (bl.yvelocity == bl.yvelSave || -bl.yvelocity == bl.yvelSave) bl.xvelocity += .4f; + bl.yvelSave = bl.yvelocity; + + bounceSave = bounce; p.scoreMultiplier = 1; } @@ -58,9 +64,12 @@ void Render::update(Render &r, Player &p, Ball &bl, Brick &br) { } if (bl.ball.x <= 0 || bl.ball.x + bl.size >= Render::width) { bl.xvelocity = -bl.xvelocity; + if (bl.xvelocity == bl.xvelSave || -bl.xvelocity == bl.xvelSave) bl.yvelocity += .4f; + bl.xvelSave = bl.xvelocity; } bl.ball.x += bl.xvelocity; bl.ball.y += bl.yvelocity; + if (p.player.x < 0) { p.player.x = 0; } @@ -112,7 +121,7 @@ void Render::update(Render &r, Player &p, Ball &bl, Brick &br) { } } -void Render::input(Player &p) { +void Render::input(Render &r, Player &p, Ball &bl, Brick &br) { SDL_Event e; const Uint8 *keystates = SDL_GetKeyboardState(NULL); @@ -123,6 +132,56 @@ void Render::input(Player &p) { } if (keystates[SDL_SCANCODE_Q]) Render::running = false; +#if DEBUG + if (keystates[SDL_SCANCODE_E]) p.livesCount = 3; + if (keystates[SDL_SCANCODE_R]) { + if (level <= 7) { + br.resetBricks(r, p, bl); + bl.resetBall(r, p); + gameover = false; + } + } + if (keystates[SDL_SCANCODE_O]) { + bl.ball.x = 250.f; + bl.ball.y = 400.f; + bl.xvelocity = 0.f; + bl.yvelocity = 8.f; + } + if (keystates[SDL_SCANCODE_P]) { + bl.ball.x = 250.f; + bl.ball.y = 400.f; + bl.xvelocity = 8.f; + bl.yvelocity = 0.f; + } + if (keystates[SDL_SCANCODE_1]) { + Render::level = 1; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_2]) { + Render::level = 2; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_3]) { + Render::level = 3; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_4]) { + Render::level = 4; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_5]) { + Render::level = 5; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_6]) { + Render::level = 6; + br.resetBricks(r, p, bl); + } + if (keystates[SDL_SCANCODE_7]) { + Render::level = 7; + br.resetBricks(r, p, bl); + } +#endif if (!Render::gameover) { if (keystates[SDL_SCANCODE_LEFT]) p.player.x -= Render::xpos; if (keystates[SDL_SCANCODE_RIGHT]) p.player.x += Render::xpos; diff --git a/src/render.hh b/src/render.hh index a929a82..c3f7a5a 100644 --- a/src/render.hh +++ b/src/render.hh @@ -35,7 +35,7 @@ class Render { Mix_Music* music; void update(Render &r, Player &p, Ball &bl, Brick &br); - void input(Player &p); + void input(Render &r, Player &p, Ball &bl, Brick &br); void render(Player &p, Ball &bl, Brick &br); Render() { @@ -47,6 +47,7 @@ class Render { private: void gameOver(Player &p, Brick &br, bool winner); void write(Player &p, Brick &br, std::string text, int x, int y); + double bounceSave; }; #endif