1
0
Fork 0
breakout/src/scene.cpp

136 lines
2.9 KiB
C++

#include "scene.hpp"
Scene::Scene(SDL_Renderer *r) {
DEBUG("[?] Initializing scene");
renderer = r;
pad.x = (SCREEN_WIDTH - PAD_WIDTH) / 2;
pad.y = SCREEN_HEIGHT - PAD_HEIGHT;
pad.w = PAD_WIDTH;
pad.h = PAD_HEIGHT;
ball.x = SCREEN_WIDTH/2 - BALL_RADIUS;
ball.y = SCREEN_HEIGHT/2 - BALL_RADIUS;
ball.w = BALL_RADIUS * 2;
ball.h = BALL_RADIUS * 2;
ball_moving = true;
ball_velx = 0;
ball_vely = 0;
launch_ball();
for (int i = 0; i < BRICK_ROWS; i++) {
for (int j = 0; j < BRICK_COLS; j++) {
bricks.push_back(Brick(renderer, j * BRICK_WIDTH + j, i * BRICK_HEIGHT + i, (Color)i));
}
}
DEBUG("[!] Scene initialized");
}
Scene::~Scene() {}
void Scene::render() {
// Draw background
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
// Draw pad
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, &pad);
// Draw bricks
for (int i = 0; i < NUM_BRICKS; i++) {
bricks[i].render();
}
// Draw ball
move_ball();
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, &ball);
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);
}
void Scene::launch_ball() {
ball.x = SCREEN_WIDTH/2 - BALL_RADIUS;
ball.y = SCREEN_HEIGHT/2 - BALL_RADIUS;
ball_moving = true;
ball_velx = 3;
ball_vely = 5;
if (rand() > RAND_MAX/2) {
ball_velx = -ball_velx;
}
}
void Scene::move_ball() {
if (!ball_moving) {
return;
}
ball.x += ball_velx;
ball.y += ball_vely;
// Collisions
// Left
if (ball.x <= 0) {
ball_velx = -ball_velx;
}
// Right
if (ball.x >= SCREEN_WIDTH - 2*BALL_RADIUS) {
ball_velx = -ball_velx;
}
// Top
if (ball.y <= 0) {
ball_vely = -ball_vely;
}
// Bottom
if (ball.y >= SCREEN_HEIGHT) {
launch_ball();
DEBUG("Loser!");
}
// Pad
if (ball.x >= pad.x && ball.x <= pad.x + PAD_WIDTH && ball.y + 2*BALL_RADIUS >= pad.y) {
ball_vely = -ball_vely;
}
// Bricks
for (int i = NUM_BRICKS; i >= 0; --i) {
int x1 = ball.x;
int y1 = ball.y;
int x2 = ball.x + 2*BALL_RADIUS;
int y2 = ball.y + 2*BALL_RADIUS;
BounceDirection dir = bricks[i].collide(x1, y1, x2, y2);
switch (dir) {
case None:
continue;
case Top:
case Bottom:
ball_vely = -ball_vely;
break;
case Left:
case Right:
ball_velx = -ball_velx;
break;
}
bricks[i].destroy();
}
}