#include "chess_board.h" #include #include #include "stdio.h" #define MARGIN 200 typedef enum { SQUARE_EMPTY = 0, KING, QUEEN, ROOK, KNIGHT, BISHOP, PAWN }; static int height; static int width; static SDL_Texture *board_texture; static SDL_Rect rectangle; static int board_width; uint8_t board_state[8][8] = 0u; bool click(SDL_Renderer *p_renderer, int x, int y) { SDL_Point const point = {x, y}; bool ret_val = false; rectangle.w = board_width; rectangle.h = board_width; rectangle.x = (width - board_width) / 2; rectangle.y = (height - board_width) / 2; if (SDL_PointInRect(&point, &rectangle)) { int square_size = board_width / 8; int starting_x = rectangle.x; rectangle.w = square_size; rectangle.h = square_size; for (size_t j = 0; j < 8; j++) { rectangle.x = starting_x; for (size_t i = 0; i < 8; i++) { if(SDL_PointInRect(&point, &rectangle)) { goto draw_square; } rectangle.x += square_size; } rectangle.y += square_size; } draw_square: SDL_SetRenderTarget(p_renderer, board_texture); SDL_SetRenderDrawColor(p_renderer, 0x00, 0xFF, 0x00, 0x00); SDL_RenderDrawRect(p_renderer, &rectangle); SDL_RenderFillRect(p_renderer, &rectangle); SDL_SetRenderTarget(p_renderer, NULL); SDL_RenderCopy(p_renderer, board_texture, NULL, NULL); SDL_RenderPresent(p_renderer); } return ret_val; } void chess_board_init(SDL_Renderer *p_renderer, int w, int h) { width = w; height = h; SDL_DestroyTexture(board_texture); board_texture = SDL_CreateTexture(p_renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h); board_width = ((w > h) ? h : w ) - MARGIN; // get rid of rounding errors board_width -= board_width % 8; } void draw_board(SDL_Renderer *p_renderer) { SDL_SetRenderTarget(p_renderer, board_texture); SDL_SetRenderDrawColor(p_renderer, 0x7f, 0x7f, 0x7f, 0); SDL_RenderClear(p_renderer); SDL_RenderDrawRect(p_renderer, &rectangle); SDL_SetRenderDrawColor(p_renderer, 0xFF, 0xFF, 0xFF, 0x00); rectangle.w = board_width; rectangle.h = board_width; rectangle.x = (width - board_width) / 2; rectangle.y = (height - board_width) / 2; SDL_RenderFillRect(p_renderer, &rectangle); SDL_SetRenderDrawColor(p_renderer, 0, 0, 0, 0x00); int square_size = board_width / 8; int starting_x = rectangle.x; rectangle.w = square_size; rectangle.h = square_size; for (size_t j = 0; j < 8; j++) { rectangle.x = starting_x; if ((j % 2) == 0) { rectangle.x += square_size; } for (size_t i = 0; i < 4; i++) { SDL_RenderFillRect(p_renderer, &rectangle); rectangle.x += 2 * square_size; } rectangle.y += square_size; } SDL_SetRenderTarget(p_renderer, NULL); SDL_RenderCopy(p_renderer, board_texture, NULL, NULL); }