Archived
1
Fork 0
This repository has been archived on 2024-10-07. You can view files and clone it, but cannot push or open issues or pull requests.
game_of_life/src/drawing.cpp
2024-09-11 22:48:22 +05:00

93 lines
2.6 KiB
C++

#include <SDL.h>
#include "drawing.h" // This file
#include "game.h" // Get paused state
#include "globals.h" // Size macros
#include "grid.h" // Get grid state
#include "main.h" // Get window
void clear_window() {
SDL_Surface *surface = SDL_GetWindowSurface(window);
Uint32 background = SDL_MapRGB(surface->format, 0x2E, 0x34, 0x40);
SDL_FillRect(surface, NULL, background);
}
SDL_Surface* grid_lines_surface() {
Uint32 rmask, gmask, bmask, amask;
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
SDL_Surface *grid_lines = SDL_CreateRGBSurface(0, WINDOW_WIDTH, WINDOW_HEIGHT, 32, rmask, gmask, bmask, amask);
Uint32 lines_color = SDL_MapRGB(grid_lines->format, 0x3B, 0x42, 0x52);
SDL_Surface *vertical = SDL_CreateRGBSurface(0, 2, WINDOW_HEIGHT, 32, rmask, gmask, bmask, amask);
SDL_FillRect(vertical, NULL, lines_color);
for (int i = 0; i <= GRID_WIDTH; i++) {
SDL_Rect destination;
destination.x = i * CELL_SIZE - 1;
destination.y = 0;
SDL_BlitSurface(vertical, NULL, grid_lines, &destination);
}
SDL_FreeSurface(vertical);
SDL_Surface *horizontal = SDL_CreateRGBSurface(0, WINDOW_WIDTH, 2, 32, rmask, gmask, bmask, amask);
SDL_FillRect(horizontal, NULL, lines_color);
for (int i = 0; i <= GRID_HEIGHT; i++) {
SDL_Rect destination;
destination.x = 0;
destination.y = i * CELL_SIZE - 1;
SDL_BlitSurface(horizontal, NULL, grid_lines, &destination);
}
SDL_FreeSurface(horizontal);
return grid_lines;
}
SDL_Surface* cell_surface() {
SDL_Surface *cell = SDL_CreateRGBSurface(0, CELL_SIZE, CELL_SIZE, 32, 0, 0, 0, 0);
Uint32 cell_color = SDL_MapRGB(cell->format, 0xE5, 0xE9, 0xF0);
SDL_FillRect(cell, NULL, cell_color);
return cell;
}
void draw() {
clear_window();
draw_cells();
if (paused) draw_grid_lines();
SDL_UpdateWindowSurface(window);
}
void draw_grid_lines() {
SDL_Surface *surface = SDL_GetWindowSurface(window);
static SDL_Surface *grid_lines = grid_lines_surface();
SDL_BlitSurface(grid_lines, NULL, surface, &surface->clip_rect);
}
void draw_cells() {
SDL_Surface *surface = SDL_GetWindowSurface(window);
static SDL_Surface *cell = cell_surface();
for (int i = 0; i < GRID_HEIGHT; i++)
for (int j = 0; j < GRID_WIDTH; j++) {
if (grid[i][j] == ALIVE) {
SDL_Rect destination;
destination.x = j * CELL_SIZE;
destination.y = i * CELL_SIZE;
SDL_BlitSurface(cell, NULL, surface, &destination);
}
}
}